bagaimana cara memeriksa apa yang ada di swap?

15

Di sistem saya, saya memiliki sejumlah swap yang digunakan:

undefine@uml:~$ free
             total       used       free     shared    buffers     cached
Mem:      16109684   15848264     261420     633496      48668    6096984
-/+ buffers/cache:    9702612    6407072
Swap:     15622140        604   15621536

Bagaimana cara memeriksa apa yang ada di swap?

Saya mencoba memeriksanya melalui proses, tetapi untuk setiap pid pada sistem VmSwap adalah 0:

undefine@uml:~$ awk '/VmSwap/ {print $2}' /proc/*/status |uniq
0

Apa lagi yang bisa ditukar? Saya berpikir tentang tmpfs - tetapi saya membaca ulang semua file di tmpfs-es - dan itu tidak mengurangi ukuran swap.


undefine
sumber

Jawaban:

9

smemadalah alat standar untuk ini. Bersih dan sederhana.

Pada sistem berbasis Debian, instal melalui manajer paket:

 sudo apt-get install smem

Sampel (terpotong) keluaran dari sistem saya:

$ smem -s swap -t -k -n
  PID User     Command                         Swap      USS      PSS      RSS 
  831 1000     /bin/bash                          0     3.8M     3.8M     5.5M 
 3931 1000     bash /usr/bin/sage -c noteb   276.0K     4.0K    20.0K     1.2M 
17201 1000     /usr/bin/dbus-launch --exit   284.0K     4.0K     8.0K   500.0K 
17282 1000     /usr/bin/mate-settings-daem   372.0K    11.0M    11.7M    21.8M 
17284 1000     marco                         432.0K    16.7M    18.1M    29.5M 
17053 1000     mate-session                  952.0K     3.3M     3.5M     9.2M 
 3972 1000     python /usr/lib/sagemath/sr     2.7M   101.8M   102.1M   104.3M 
-------------------------------------------------------------------------------
  141 1                                        5.2M     3.9G     4.0G     4.5G 
shivams
sumber
6
Tetapi apakah itu mengembalikan apa pun selain nilai yang ditampilkan dalam VmSwapbaris /proc/PID/status? Pertanyaannya bukan meminta tampilan yang lebih cantik, melainkan menanyakan apa yang bisa ditukar selain dari data proses.
Gilles 'SO- stop being evil'
1
smem tidak memberi saya apa-apa lebih berguna daripada greping proc: undefine @ uml: ~ $ sudo smem -c swap | uniq -c 1 Swap 227 0
undefine
2

Saya baru mulai memeriksanya kemarin untuk kebutuhan saya, berikut ini yang saya temukan sejauh ini:

SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + something_else

Cerita pendek:

Used_by_Processes - data yang telah ditukar keluar dari memori sepenuhnya.

SwapCached - data yang telah ditukar ke disk, tetapi masih tersimpan di memori.

Part_of_Tmpfs - sebagian dari data tmpfs.

Cerita panjang:

Used_by_Processes - ada banyak instruksi yang diterbitkan tentang cara salah menghitung-ini;) Misalnya jika kita meringkas semua VmSwapentri dari /proc/*/statusatau Swapentri dari /proc/*/smaps- kita akan mendapatkan perkiraan yang terlalu tinggi (halaman yang ditukar bersama dapat dihitung lebih dari satu kali). Jika kami tidak menjalankannya dari rootpengguna atau OS kami - perkiraan yang lebih rendah akan dikembalikan secara diam-diam. Saya tidak memiliki cara yang tepat untuk mengidentifikasi halaman bersama, tetapi percikan 'peta' yang sama memberikan perkiraan yang jauh lebih baik daripada pendekatan lain: (perhatikan bahwa di catbawah ini tidak berguna dan benar-benar membutuhkan a 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 - ini mudah dan dapat diekstraksi dengan bersih /proc/meminfo. Beberapa orang tidak akan berharap ini dihitung sebagai swap "bekas", karena salinan duplikat (tidak kotor) dari halaman yang sama di RAM dan Swap dapat dibebaskan di kedua sisi secara instan (jika terjadi permintaan), sehingga membuat salah satu salinan "dibebaskan".

Part_of_Tmpfs - sisi baiknya adalah ketika semua data tmpf Anda banyak-hari-tidak tersentuh dan swappinesstidak nol - sangat mungkin bahwa seluruh tmpfs swapping-out (dan sebaliknya untuk data yang baru saja digunakan). Kelemahannya adalah saya tidak menemukan API untuk andal menghitung ambang atau persentase dari berapa banyak yang ditukar, meskipun jika ada cukup RAM - kita dapat menyalin seluruh data tmpfs ke dalam /dev/nulldan dengan demikian mendapatkan beberapa petunjuk tentang seberapa banyak itu dipertukarkan.

Kesalahan umum yang dibuat selama perhitungan ukuran tmpfs adalah - dengan asumsi bahwa /dev/shmhanya tmpfs yang dikonfigurasi atau mencoba melakukannya dengan pemindaian per-file rekursif (tidak hanya implementasi yang cenderung menghilangkan file tersembunyi atau melakukannya dari non- root, tetapi juga un-swaps beberapa halaman selama melintasi). Cara yang jauh lebih mudah adalah dengan menggunakan yang lama df.

something_else - lihat " diff 385 MB" di bawah ini, perlu menyelam ke sumber kernel. Lihat skrip saya:

#!/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"

dan output dari kotak yang berbeda:

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

Dan eksperimen kecil sebagai bonus:

[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 selain dari perkiraan yang disebutkan di atas - ada sumber kesalahan lain, seperti pembulatan KB menjadi MB, kemungkinan teoritis ketidakcocokan antara ukuran blok RAM dan Swap, dll. Saya tidak yakin ini mencakup semuanya, tetapi berharap ini mencakup membantu sampai batas tertentu :)

Vlad
sumber