Saya memiliki server linux (Fedora 17) virtual dengan 28GB RAM dan 2GB swap. Server menjalankan DB DB yang diatur untuk menggunakan sebagian besar RAM.
Setelah beberapa waktu berjalan server mulai menggunakan swap untuk menukar halaman yang tidak dibutuhkan. Itu bagus karena swappiness saya ada di default 60 dan itu adalah perilaku yang diharapkan.
Yang aneh adalah bahwa angka di atas / meminfo tidak sesuai dengan info dari proses. Yaitu server melaporkan angka-angka ini:
/proc/meminfo:
SwapCached: 24588 kB
SwapTotal: 2097148 kB
SwapFree: 865912 kB
top:
Mem: 28189800k total, 27583776k used, 606024k free, 163452k buffers
Swap: 2097148k total, 1231512k used, 865636k free, 6554356k cached
Jika saya menggunakan skrip dari /server//a/423603/98204 ini melaporkan angka yang masuk akal (beberapa MB ditukar dengan bash'es, systemd, dll) dan satu alokasi besar dari MySQL (saya menghilangkan banyak jalur output ):
892 [2442] qmgr -l -t fifo -u
896 [2412] /usr/libexec/postfix/master
904 [28382] mysql -u root
976 [27559] -bash
984 [27637] -bash
992 [27931] SCREEN
1000 [27932] /bin/bash
1192 [27558] sshd: admin@pts/0
1196 [27556] sshd: admin [priv]
1244 [1] /usr/lib/systemd/systemd
9444 [26626] /usr/bin/perl /bin/innotop
413852 [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264 Total Swap Used
Jadi jika saya mendapatkan output skrip dengan benar, total penggunaan swap harus 449264K = ca. 440MB dengan mysql menggunakan ca. 90% dari swap.
Pertanyaannya adalah mengapa ini sangat berbeda dari angka atas dan angka meminfo? Apakah ada cara bagaimana "membuang" informasi swap untuk melihat apa yang sebenarnya ada di dalamnya alih-alih menjumlahkan penggunaan swap dari semua proses?
Ketika menganalisis masalah ini, saya menemukan ide-ide yang berbeda tetapi semuanya tampaknya salah:
- Keluaran skrip tidak dalam KB. Bahkan jika itu akan di unit 512 atau 4KB itu tidak akan cocok. Sebenarnya rasionya (1200: 440) adalah sekitar 3: 1 yang merupakan angka "aneh".
- Ada beberapa halaman dalam swap yang entah bagaimana dibagikan antar proses seperti yang disebutkan dalam /server//a/477664/98204 . Jika ini benar, bagaimana saya dapat menemukan jumlah sebenarnya dari memori yang digunakan seperti ini? Maksud saya perlu membuat perbedaan 800MB CCA. Dan itu tidak terdengar benar dalam skenario ini.
- Ada beberapa halaman "lama" dalam swap yang digunakan oleh proses yang sudah selesai. Saya tidak keberatan jika saya bisa mengetahui berapa swap "gratis" ini.
- Ada halaman dalam swap yang telah ditukar kembali ke memori dan dalam swap kalau-kalau mereka tidak berubah dalam RAM dan perlu ditukar lagi seperti yang disebutkan dalam /server//a/100636/98204 . Tetapi nilai SwapCached hanya 24MB.
Yang aneh adalah bahwa penggunaan swap perlahan meningkat sementara jumlah output dari skrip kira-kira sama. Dalam 3 hari terakhir swap yang digunakan meningkat dari 1100MB menjadi 1230MB saat ini sementara jumlahnya meningkat dari 430MB menjadi 449MB saat ini (ca.).
Server memiliki cukup RAM (mampu) sehingga saya bisa mematikan swap dan menyalakannya kembali. Atau saya mungkin bisa mengatur swappiness ke 0 sehingga swap hanya akan digunakan jika tidak ada cara lain. Tapi saya ingin menyelesaikan masalah atau setidaknya mencari tahu apa penyebabnya.
Jawaban:
Fedora 18 ke atas ada
smem
di repo. Anda dapat mengunduh skrip python dan menginstal dari sumber .Berikut ini contoh keluaran (agak terpotong dan dianonimkan) dari mesin saya:
Sumber juga menyediakan
smemcap
yang akan menyimpan semua data yang relevan sehingga smem dapat dijalankan nanti.sumber
Anda harus memeriksa skrip ini di komputer lain, karena sistem saya menunjukkan penggunaan swap yang benar:
Sangat dekat 111280 ~ = 120368.
Lihat juga skrip ini:
Dari utas ini:
/unix/71714/linux-total-swap-used-swap-used-by-processes
sumber