Я только начал изучать это вчера для моих нужд, вот что я нашел до сих пор:
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
)
[root@a:~]# cat /proc/*/status|awk ' /^VmSwap/{ s+=$2 }END{print s}'
32048
[root@a:~]# cat /proc/*/smaps|awk ' /^Swap/{ s+=$2 }END{print s}'
32048
[root@a:~]# cat /proc/*/smaps|awk '/-/{r=$0}/^Swap/{if(R[r]!=1)s+=$2;R[r]=1}END{print s}'
14940
[root@a:~]# free -k|grep -e Swap -e used
total used free shared buffers cached
Swap: 8388600 15508 8373092
SwapCached - этот простой и может быть легко извлечен из /proc/meminfo
. Некоторые люди не ожидают, что это будет считаться «использованным» подкачкой, так как дублирующая (не грязная) копия одной и той же страницы как в ОЗУ, так и в подкачке может быть освобождена с любой стороны довольно мгновенно (в случае возникновения спроса), что делает одна из копий «освобождена».
Part_of_Tmpfs - яркая сторона в том, что когда все ваши данные tmpfs не затронуты в течение многих дней и swappiness
не равны нулю - вполне вероятно, что все tmpfs будут выгружены (и наоборот для недавно использованных данных). Недостатком является то, что я не нашел API для надежного расчета порога или процента того, сколько из них поменяно местами, хотя, если есть достаточно оперативной памяти - мы можем скопировать целые данные tmpfs /dev/null
и таким образом получить некоторую информацию о том, сколько из них было заменено.
Распространенные ошибки, допущенные при вычислении размера tmpfs: предположим, что /dev/shm
это единственная конфигурация tmpfs, или попытка сделать это с помощью рекурсивного сканирования файлов (не только реализации, как правило, пропускают скрытые файлы или делают это не из файловой системы root
, но также и не заменяют файлы) некоторые страницы во время обхода). Намного проще использовать старое доброе df
.
thing_else - смотрите " diff 385 MB
" ниже, нужно погрузиться в исходники ядра. Смотрите мой сценарий:
#!/bin/bash
TMPFS=`df -kP |awk ' /^tmpfs/{ s+=$3 }END{print int( s/1024)}'`
PROCS=`cat /proc/*/smaps|awk '/-/{r=$0} /^Swap/{if(R[r]!=1)s+=$2;R[r]=1}END{print int( s/1024)}'`
SCACH=`cat /proc/meminfo|awk ' /^SwapCached/ {print int($2/1024)}'`
TOTAL=`free -k |awk ' /^Swap/ {print int($3/1024)}'`
echo -e " df $TMPFS\t smaps $PROCS \tSwapCache $SCACH\t| $TOTAL\tswap | diff $[TOTAL-TMPFS-PROCS-SCACH]\tMB"
и вывод из разных ящиков:
xa002: df 0 smaps 271 SwapCache 3858 | 4120 swap | diff -9 MB
sg003: df 0 smaps 234 SwapCache 3876 | 4111 swap | diff 1 MB
sg001: df 0 smaps 245 SwapCache 3845 | 4093 swap | diff 3 MB
sg002: df 0 smaps 244 SwapCache 3843 | 4091 swap | diff 4 MB
dm001: df 2 smaps 971 SwapCache 728 | 1707 swap | diff 6 MB
hm012: df 270 smaps 161 SwapCache 29 | 454 swap | diff -6 MB
hm003: df 274 smaps 142 SwapCache 27 | 440 swap | diff -3 MB
hm006: df 262 smaps 150 SwapCache 29 | 437 swap | diff -4 MB
hm002: df 265 smaps 120 SwapCache 28 | 412 swap | diff -1 MB
hm009: df 258 smaps 124 SwapCache 33 | 410 swap | diff -5 MB
hm011: df 262 smaps 118 SwapCache 28 | 406 swap | diff -2 MB
hm008: df 245 smaps 122 SwapCache 32 | 396 swap | diff -3 MB
hm005: df 247 smaps 120 SwapCache 33 | 396 swap | diff -4 MB
dp001: df 0 smaps 0 SwapCache 0 | 386 swap | diff 386 MB
hm014: df 184 smaps 134 SwapCache 34 | 343 swap | diff -9 MB
hm007: df 0 smaps 132 SwapCache 32 | 158 swap | diff -6 MB
bm002: df 0 smaps 121 SwapCache 25 | 141 swap | diff -5 MB
dm002: df 2 smaps 70 SwapCache 71 | 139 swap | diff -4 MB
bm001: df 3 smaps 102 SwapCache 28 | 131 swap | diff -2 MB
bm004: df 0 smaps 98 SwapCache 29 | 126 swap | diff -1 MB
hm013: df 0 smaps 100 SwapCache 30 | 124 swap | diff -6 MB
bm006: df 0 smaps 103 SwapCache 15 | 122 swap | diff 4 MB
hm010: df 0 smaps 102 SwapCache 24 | 122 swap | diff -4 MB
hm001: df 0 smaps 101 SwapCache 25 | 121 swap | diff -5 MB
bm003: df 0 smaps 98 SwapCache 15 | 107 swap | diff -6 MB
bm005: df 0 smaps 70 SwapCache 17 | 85 swap | diff -2 MB
sg004: df 0 smaps 72 SwapCache 14 | 83 swap | diff -3 MB
sg001: df 0 smaps 41 SwapCache 33 | 78 swap | diff 4 MB
sg005: df 0 smaps 59 SwapCache 20 | 75 swap | diff -4 MB
sg003: df 0 smaps 58 SwapCache 18 | 72 swap | diff -4 MB
sg006: df 0 smaps 56 SwapCache 13 | 65 swap | diff -4 MB
sg002: df 0 smaps 54 SwapCache 12 | 64 swap | diff -2 MB
xa001: df 0 smaps 56 SwapCache 5 | 55 swap | diff -6 MB
И небольшой эксперимент в качестве бонуса:
[root@hm012:~]# df -h|grep -e '^Filesystem' -e '^tmpfs'
Filesystem Size Used Avail Use% Mounted on
tmpfs 12G 271M 12G 3% /dev/shm
tmpfs 8.0G 84K 8.0G 1% /tmp
[root@hm012:~]# ./get_swap.sh
df 270 smaps 161 SwapCache 29 | 454 swap | diff -6 MB
[root@hm012:~]# rm -rf /dev/shm/*
[root@hm012:~]# df -h|grep -e '^Filesystem' -e '^tmpfs'
Filesystem Size Used Avail Use% Mounted on
tmpfs 12G 0 12G 0% /dev/shm
tmpfs 8.0G 84K 8.0G 1% /tmp
[root@hm012:~]# ./get_swap.sh
df 0 smaps 161 SwapCache 29 | 185 swap | diff -5 MB
PS Помимо упомянутого выше приближения - есть и другие источники ошибок, такие как округление КБ в МБ, теоретическая возможность несоответствия размеров блоков оперативной памяти и раздела подкачки и т. Д. Я не уверен, что это охватывает все, но надеюсь, что это помогает в некоторой степени :)
VmSwap
строке/proc/PID/status
? Вопрос не в том, чтобы получить более красивое отображение, а в том, что может быть в свопе, кроме данных процесса.