Сколько подкачки использует данное приложение Mac?

14

Можно ли как-то определить, была ли определенная программа, работающая на Mac OSX (10.2+), выгружена ли часть памяти (т. Е. В один из /private/var/vm/swapfile*файлов)? И как много?

Баунти (150 рпс)

Простой вопрос Первый правильный ответ будет принят, если я увижу его менее чем через 2 дня после истечения периода вознаграждения. Если у меня его еще нет, я награжу его тем, кто рассказывает мне самый интересный новый факт. И если я не узнаю ни одного из ответов, я назначу награду тому, кто пишет наиболее красиво.

Чарльз Стюарт
источник
Это такой плохой вопрос. Число, которое вы ищете, изменится, потому что вы пытаетесь его измерить (подумайте о принципе неопределенности Гейзенберга). Кроме того, он будет постоянно меняться в зависимости от других приложений и их требований к памяти, шаблонов ввода-вывода и приоритета процесса. Если вы найдете число, оно не принесет вам пользы, если вы не редактируете код ОС, потому что вы мало что собираетесь сделать с точки зрения приложения, чтобы изменить его.
Гавалец
3
@gavaletz: Встань с той стороны кровати этим утром? Я хочу использовать тот тип профилирования подкачки, который Linux делает возможным с помощью / proc / $ pid / smaps. Обычно я могу определить внезапные всплески активности свопа, используя мои уши, поэтому меня не слишком беспокоит принцип неопределенности Гавалца.
Чарльз Стюарт

Ответы:

11

Я много гуглял ;-) Насколько я понимаю, виртуальная память данного процесса разделена на страницы , которые обрабатываются ОС и представляются приложению, как будто это ОЗУ.

В OS X, основанной на ядре Маха, это обрабатывается демоном под названием dynamic_pager. Этот процесс генерирует файлы подкачки, /private/var/vmкак вы упоминаете. Эти файлы подкачки генерируются не для каждого приложения, а на основе «необходимой памяти». Файлы подкачки делятся на страницы размером 4096 байт, а затем страницы распределяются между процессами, которым (как считает ОС) требуется виртуальная память. Следовательно, вы не можете связать файл подкачки с данным приложением, но вы можете увидеть, сколько страниц использует данный процесс.

Возможно, вы захотите попробовать команду vm_statв Termial. Это дает вам статистику использования виртуальной машины (обратите внимание, что количество страниц в разы, когда число активных страниц равно размеру вашего файла подкачки). Это также объясняет, почему вы можете иметь несколько процессов, использующих ВМ, но только пару файлов подкачки.

Другие веселые команды есть vmmap [process id]и pagestuff.

trolle3000
источник
Кстати, проверьте developer.apple.com/mac/library/documentation/Darwin/Conceptual/… если вы хотите узнать больше.
trolle3000
Это выглядит многообещающе. Это, кажется, дает определенный ответ на первую часть вопроса, и наводит на мысль о конкретном ответе на вторую часть. Мне нужно копать дальше ...
Чарльз Стюарт
Нет vmmap [pid]или vmmap -pages [pid]ответ на вторую часть вашего вопроса?
trolle3000
vmmap $ pid дает однозначную информацию о том, что он классифицирует как регионы с возможностью записи. Он не различает выделенную (т. Е. Заменяемую) и подкачанную память для областей только для чтения, но, возможно, различие здесь не так важно. Я очень вероятно приму этот ответ завтра.
Чарльз Стюарт
5

Команда vmmap PIDдолжна дать вам некоторые полезные статистические данные о данном процессе.

Аяз
источник
работает даже vmmap [AppName]
Studer
3

Основываясь на идеях, опубликованных здесь, я создал эту маленькую строчку кода:

sudo vmmap notifyd | grep -A3 'Summary'

который отображает раздел Summary (3 строки) вывода vmmap. Я использовал notifydв этом примере, но вы можете заменить его на любой известный вам PID.

Эта строка будет пытаться перечислить все строки Summary всех запущенных процессов. Очевидно, что некоторые потерпят неудачу, потому что их идентификатор процесса уже пропал (процесс завершен), но в целом я обнаружил, что это отличный способ прокрутить список информации о памяти и определить топ-своппер.

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

Отредактировано: некоторые анонимные пользователи увидели, что эта последняя командная строка нуждается в улучшении, потому что, очевидно, оригинальный вариант больше не работает. Так что большое спасибо, кто бы вы ни были, и мне жаль, что ваши изменения были отклонены. (Первая команда ранее прочитала 'ps xa' и привела к сбою vmmap из-за заголовка ps, брошенного в него)

Дальнейшее улучшение: если вы хотите узнать название программы сразу, используйте это небольшое изменение

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

Небольшое изменение на другом конце этой команды позволяет вам фильтровать определенные имена программ или компоненты пути командной строки. Здесь мы рассмотрим все процессы из библиотеки / PrivateFrameworks только для примера.

ps -o pid,command= -xa | grep 'Library/PrivateFrameworks' | awk '{print $1}' | xargs -n 1 sudo vmmap |
Andreas
источник
0

Откройте Activity Monitor в папке / Applications / Utilities, и есть столбец «Виртуальная память», который сообщит вам об этом. Вы можете щелкнуть заголовок виртуальной памяти, чтобы отсортировать данные по большинству или наименее используемым приложениям. Также обязательно измените Мои процессы на Все процессы и помните, что в одном приложении может быть несколько процессов. Например, стороннее приложение Little Snitch состоит из «Little Snitch Network Monitor» и «Little Snitch UIAgent».

ridogi
источник
4
Это неверно. Nubmer в столбце виртуальной памяти представляет собой сумму памяти, которая в настоящее время находится в оперативной памяти и в файлах подкачки, mmaped, и я не знаю, что еще.
Тадеуш А. Кадлубовски
Ты уверен? Apple не упоминает об этом support.apple.com/kb/TA20517
ридоги
1
Номер виртуальной машины измеряет сумму, выделенную, но еще не использованную. Файлы подкачки будут иметь то, что на самом деле используется.
Chealion
@Chealion: как вы определяете память, которая выделена, но фактически не используется?
Тадеуш А. Кадлубовский
@tkadlubo: В этом случае я считаю, что это просто несоответствие между указанным размером виртуальной машины, доступным для процесса, и фактическими страницами, выгруженными на диск. Я не уверен, как это определить, кроме того, что номер виртуальной машины и файлы подкачки на диске разные.
Chealion
0

Как сказал ридоги, откройте Activity Monitor. Перейдите к процессу, который вы хотите проверить, и нажмите ... Проверить! Затем нажмите на память; это скажет вам, сколько подкачки использует данный процесс.

Веселиться!

trolle3000
источник
3
Страница осмотра рассказывает мне все виды интересных вещей, которые положительно коррелируют с ответом на вопрос, например #pagefaults, #pageins и список файлов mmapped, но нигде нет фактического ответа на вопрос, который я ищу.
Чарльз Стюарт