В моей системе у меня есть некоторое количество подкачки:
undefine@uml:~$ free
total used free shared buffers cached
Mem: 16109684 15848264 261420 633496 48668 6096984
-/+ buffers/cache: 9702612 6407072
Swap: 15622140 604 15621536
Как проверить, что в свопе?
Я пытаюсь проверить это с помощью процессов, но для каждого pid в системе VmSwap равен 0:
undefine@uml:~$ awk '/VmSwap/ {print $2}' /proc/*/status |uniq
0
Что еще может быть в свопе? Я думал о tmpfs - но я перечитал все файлы на tmpfs-es - и он не сбрасывает размер подкачки.
VmSwap
строке/proc/PID/status
? Вопрос не в том, чтобы получить более красивое отображение, а в том, что может быть в свопе, кроме данных процесса.Я только начал изучать это вчера для моих нужд, вот что я нашел до сих пор:
SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + кое-что
Короткий рассказ:
Used_by_Processes - данные, которые были полностью выгружены из памяти.
SwapCached - данные, которые были выгружены на диск, но все еще остаются в памяти.
Part_of_Tmpfs - некоторая часть данных tmpfs.
Длинная история:
Used_by_Processes - опубликовано много инструкций о том, как ошибочно рассчитать этот;) Например, если мы суммируем все
VmSwap
записи из/proc/*/status
илиSwap
записи из/proc/*/smaps
- мы получим завышенную оценку (общие страницы с обменом могут быть подсчитаны более одного раза). Если мы не запустим его отroot
пользователя или нашей ОС - недооценка будет возвращена без уведомления. У меня нет правильного способа определения общих страниц, но разбрызгивание тех же «карт» дает гораздо лучшее приближение, чем другие подходы: (обратите внимание, чтоcat
ниже не бесполезно и на самом деле нуждается в2>/dev/null
)SwapCached - этот простой и может быть легко извлечен из
/proc/meminfo
. Некоторые люди не ожидают, что это будет считаться «использованным» подкачкой, так как дублирующая (не грязная) копия одной и той же страницы как в ОЗУ, так и в подкачке может быть освобождена с любой стороны довольно мгновенно (в случае возникновения спроса), что делает одна из копий «освобождена».Part_of_Tmpfs - яркая сторона в том, что когда все ваши данные tmpfs не затронуты в течение многих дней и
swappiness
не равны нулю - вполне вероятно, что все tmpfs будут выгружены (и наоборот для недавно использованных данных). Недостатком является то, что я не нашел API для надежного расчета порога или процента того, сколько из них поменяно местами, хотя, если есть достаточно оперативной памяти - мы можем скопировать целые данные tmpfs/dev/null
и таким образом получить некоторую информацию о том, сколько из них было заменено.Распространенные ошибки, допущенные при вычислении размера tmpfs: предположим, что
/dev/shm
это единственная конфигурация tmpfs, или попытка сделать это с помощью рекурсивного сканирования файлов (не только реализации, как правило, пропускают скрытые файлы или делают это не из файловой системыroot
, но также и не заменяют файлы) некоторые страницы во время обхода). Намного проще использовать старое доброеdf
.thing_else - смотрите "
diff 385 MB
" ниже, нужно погрузиться в исходники ядра. Смотрите мой сценарий:и вывод из разных ящиков:
И небольшой эксперимент в качестве бонуса:
PS Помимо упомянутого выше приближения - есть и другие источники ошибок, такие как округление КБ в МБ, теоретическая возможность несоответствия размеров блоков оперативной памяти и раздела подкачки и т. Д. Я не уверен, что это охватывает все, но надеюсь, что это помогает в некоторой степени :)
источник