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.
VmSwap
baris/proc/PID/status
? Pertanyaannya bukan meminta tampilan yang lebih cantik, melainkan menanyakan apa yang bisa ditukar selain dari data proses.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
VmSwap
entri dari/proc/*/status
atauSwap
entri dari/proc/*/smaps
- kita akan mendapatkan perkiraan yang terlalu tinggi (halaman yang ditukar bersama dapat dihitung lebih dari satu kali). Jika kami tidak menjalankannya dariroot
pengguna 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 dicat
bawah ini tidak berguna dan benar-benar membutuhkan a2>/dev/null
)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
swappiness
tidak 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/null
dan dengan demikian mendapatkan beberapa petunjuk tentang seberapa banyak itu dipertukarkan.Kesalahan umum yang dibuat selama perhitungan ukuran tmpfs adalah - dengan asumsi bahwa
/dev/shm
hanya 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 lamadf
.something_else - lihat "
diff 385 MB
" di bawah ini, perlu menyelam ke sumber kernel. Lihat skrip saya:dan output dari kotak yang berbeda:
Dan eksperimen kecil sebagai bonus:
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 :)
sumber