Bao nhiêu trao đổi là một ứng dụng Mac nhất định sử dụng?


15

Có cách nào để biết liệu một ứng dụng cụ thể đang chạy trên Mac OSX (10.2+) có một phần bộ nhớ của nó bị tráo đổi (tức là, với một trong các /private/var/vm/swapfile*tệp) không? Và bao nhiêu?

Tiền thưởng (150 rps)

Câu hỏi đơn giản. Câu trả lời đúng đầu tiên sẽ được chấp nhận nếu tôi thấy nó có ít hơn 2 ngày kể từ ngày hết hạn. Nếu tôi vẫn chưa có thì tôi sẽ trao nó cho bất cứ ai nói với tôi sự thật mới thú vị nhất. Và nếu tôi không học được một điều gì từ bất kỳ câu trả lời nào, tôi sẽ trao phần thưởng cho bất cứ ai viết hay nhất.


Đây là một câu hỏi tồi. Con số bạn đang tìm kiếm sẽ thay đổi bởi vì bạn đang cố gắng đo nó (nghĩ rằng nguyên tắc không chắc chắn của Heisenberg). Hơn nữa, nó sẽ thay đổi mọi lúc tùy thuộc vào các ứng dụng khác và yêu cầu bộ nhớ của chúng, các mẫu io và ưu tiên xử lý. Nếu bạn tìm thấy số đó sẽ không giúp ích gì cho bạn trừ khi bạn đang chỉnh sửa mã hệ điều hành, bởi vì có rất ít điều bạn sẽ làm theo quan điểm của ứng dụng để thay đổi nó.
gavaletz

3
@gavaletz: Ra khỏi giường sai sáng nay? Tôi muốn loại hồ sơ hoán đổi mà Linux có thể sử dụng / Proc / $ pid / smaps. Tôi thường có thể xác định các đợt đột ngột của hoạt động hoán đổi bằng tai của mình, vì vậy tôi không quá bận tâm về nguyên tắc không chắc chắn của gavaletz.
Charles Stewart

Câu trả lời:


13

Tôi đã googling rất nhiều ;-) Theo tôi được biết, bộ nhớ ảo của một quá trình nhất định được chia thành các trang được xử lý bởi các hệ điều hành và trình bày cho ứng dụng như thể nó là RAM.

Trong OS X, dựa trên kernel Mach, điều này được xử lý bởi một daemon có tên dynamic_pager. Quá trình này tạo ra các tệp hoán đổi /private/var/vmnhư bạn đề cập. Các tệp hoán đổi này không được tạo trên cơ sở cho mỗi ứng dụng, mà trên cơ sở "cần bộ nhớ". Các tệp hoán đổi được chia thành các trang 4096 byte và sau đó các trang được phân bổ cho các quy trình (được hệ điều hành coi là) cần bộ nhớ ảo. Do đó, bạn không thể liên kết một tập tin hoán đổi với một ứng dụng nhất định, nhưng bạn có thể thấy có bao nhiêu trang mà một quy trình đã cho đang sử dụng.

Bạn có thể muốn thử lệnh vm_stattrong Termial. Điều này cung cấp cho bạn một thống kê về mức độ sử dụng VM (lưu ý rằng 'số lần kích hoạt trang' số lần trang hoạt động bằng với kích thước của tệp hoán đổi của bạn). Điều này cũng giải thích tại sao bạn có thể có nhiều quy trình sử dụng VM, nhưng chỉ có một vài tệp hoán đổi.

Các lệnh thú vị khác là vmmap [process id]pagestuff.


Nhân tiện, hãy kiểm tra developer.apple.com/mac/l Library / documentation / Darwin / Conceptionual / Khăn nếu bạn muốn biết thêm.
trolle3000

Điều này có vẻ đầy hứa hẹn. Điều này dường như cung cấp một câu trả lời chắc chắn cho phần đầu tiên của câu hỏi, và gợi ý về một câu trả lời cụ thể cho phần thứ hai. Tôi cần phải đào thêm ...
Charles Stewart

Không phải vmmap [pid]hoặc vmmap -pages [pid]câu trả lời cho phần thứ hai của câu hỏi của bạn?
trolle3000

vmmap $ pid không cung cấp thông tin rõ ràng về những gì nó phân loại là các vùng có thể ghi. Nó không phân biệt giữa bộ nhớ được phân bổ (nghĩa là có thể tráo đổi) và bộ nhớ hoán đổi cho các vùng chỉ đọc, nhưng có lẽ sự khác biệt không quá quan trọng. Tôi rất có thể sẽ chấp nhận câu trả lời này vào ngày mai.
Charles Stewart

5

Các vmmap PIDlệnh nên cung cấp cho bạn một số số liệu thống kê hữu ích trong số khoảng một quá trình nhất định.


thậm chí VMMap [AppName] làm việc
Studer

4

Dựa trên những ý tưởng được đăng ở đây, tôi đã tạo ra dòng mã nhỏ này:

sudo vmmap notifyd | grep -A3 'Summary'

trong đó hiển thị phần Tóm tắt (3 dòng) của đầu ra vmmap. Tôi đã sử dụng notifydtrong ví dụ này, nhưng bạn có thể thay thế nó bằng bất kỳ PID nào bạn biết.

Dòng này sẽ cố gắng liệt kê tất cả các dòng Tóm tắt của tất cả các quy trình đang chạy. Rõ ràng một số sẽ thất bại vì id quá trình của họ đã biến mất (quá trình kết thúc), nhưng nói chung tôi thấy đây là một cách tuyệt vời để cuộn qua danh sách thông tin bộ nhớ và phát hiện bộ trao đổi hàng đầu.

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | grep -A3 'Summary'

Đã chỉnh sửa: Một số người dùng ẩn danh thấy dòng lệnh cuối cùng này cần một sự cải tiến vì rõ ràng biến thể ban đầu không hoạt động nữa. Vì vậy, cảm ơn bạn rất nhiều cho dù bạn là ai và tôi xin lỗi vì chỉnh sửa của bạn đã bị từ chối. (Lệnh đầu tiên trước đó đã đọc 'ps xa' và khiến vmmap bị lỗi do tiêu đề của ps bị ném vào nó)

Cải thiện thêm: Nếu bạn muốn biết tên chương trình ngay lập tức, hãy sử dụng thay đổi nhỏ này

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | egrep 'swapped_out|Path'

Một sửa đổi nhỏ ở đầu kia của lệnh này cho phép bạn lọc các tên chương trình nhất định hoặc các thành phần đường dẫn dòng lệnh. Ở đây chúng tôi đang xem xét tất cả các quy trình từ 'Thư viện / PrivateFrameworks' chẳng hạn.

ps -o pid,command= -xa | grep 'Library/PrivateFrameworks' | awk '{print $1}' | xargs -n 1 sudo vmmap |

Tôi nhận được rất nhiều thất bại khi nói rằng vmmap không thể được khởi chạy dưới dạng 32 nhưng quá trình này đã tạm dừng xargs. Để có được thẻ tiếp tục, tôi đã làm ps -o pid= -xa | awk '{print $1}' | xargs -n 1 -I{} bash -c ‘sudo vmmap {} || true’ | egrep 'swapped_out|^Path:|^Process:'. Nó vẫn không dừng trên ctrl + c, nhưng nó cũng không dừng trên các lỗi vmmap.
ShadSterling

0

Mở Trình giám sát hoạt động trong thư mục / Ứng dụng / Tiện ích của bạn và có một cột Bộ nhớ ảo sẽ cho bạn biết điều này. Bạn có thể nhấp vào tiêu đề Bộ nhớ ảo để sắp xếp theo hầu hết hoặc ít được sử dụng bởi ứng dụng. Ngoài ra hãy chắc chắn thay đổi Quy trình của tôi thành Tất cả quy trình và lưu ý rằng một ứng dụng có thể có nhiều quy trình. Ví dụ, ứng dụng bên thứ 3 Little Snitch bao gồm "Little Snitch Network Monitor" và "Little Snitch UIAgent".


4
Sai rồi. Nubmer trong cột bộ nhớ ảo là tổng bộ nhớ hiện tại trong RAM và trên các tệp hoán đổi, được ghép và tôi không biết gì khác.
Tadeusz A. Kadłubowski

Bạn có chắc không? Apple không đề cập đến nó support.apple.com/kb/TA20517
Ridogi

1
Số VM đo số lượng được phân bổ nhưng chưa thực sự được sử dụng. Các tập tin trao đổi sẽ có những gì thực sự được sử dụng.
Chealion

@Chealion: làm thế nào để bạn xác định bộ nhớ được phân bổ nhưng không thực sự được sử dụng?
Tadeusz A. Kadłubowski

@tkadlubo: Trong trường hợp này, tôi tin rằng đó chỉ là sự khác biệt giữa kích thước VM được nêu có sẵn cho một quy trình so với các trang thực tế, được phân trang ra đĩa. Tôi không chắc chắn làm thế nào để xác định nó ngoài việc lưu ý rằng số VM và các tệp hoán đổi trên đĩa là khác nhau.
Chealion

0

Như Ridogi đã nói, mở Activity Monitor. Điều hướng đến quá trình bạn muốn kiểm tra và nhấp vào ... Kiểm tra! Sau đó bấm vào bộ nhớ; điều này sẽ cho bạn biết bao nhiêu trao đổi mà quá trình đã cho đang sử dụng.

Chúc vui vẻ!


3
Trang kiểm tra cho tôi biết tất cả các loại điều thú vị có tương quan tích cực với câu trả lời của câu hỏi là gì, như #pagefaults, #pageins và danh sách các tệp được dán, nhưng không có câu trả lời thực sự cho câu hỏi tôi đang theo dõi.
Charles Stewart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.