Mengapa Linux membersihkan cache memori ketika hampir penuh?

14

Seperti apa grafik memori pada VPS yang menjalankan CentOS dengan RAM 512MB dan nginx / php-fpm / mysqld yang menyajikan konten (kebanyakan statis) untuk beberapa ribu pengunjung per hari.

Grafik memori mingguan

(Itu adalah hari pada sumbu x)

Seperti yang Anda lihat, itu cukup gelisah di daerah cache dan buffer. Cache memori dibersihkan pada interval yang tidak teratur (mengesampingkan tugas cron yang bertanggung jawab). Biasanya, tetapi tidak selalu, dibersihkan pada titik di mana ia bisa tumbuh tidak lebih besar. Kadang-kadang hampir seluruhnya bersih, di lain waktu hanya setengah jalan.

Saya mencoba memahami logika di balik pembersihan ini. Saya berharap data file di-cache lebih lama & tidak melihat program lain menggunakan lebih banyak memori daripada biasanya ketika cache memori dihapus.

Apakah ini perilaku normal, atau saya kehilangan sesuatu?

PEMBARUAN: Pembaruan memori tampaknya telah menstabilkan grafik. Masih melihat penurunan kecil, tapi tidak ada yang signifikan sebelum upgrade.

Setelah peningkatan memori

redburn
sumber
Apakah ini wadah OpenVZ / Virtuozzo atau VM nyata seperti XEN atau KVM?
jordanm
1
Tidak dapat menjelaskan apa itu, tetapi saya memiliki VPS yang menampilkan perilaku yang sama. dl.dropbox.com/u/1578899/memory-week.png
EightBitTony
@jordanm Ini adalah mesin virtual berbasis Xen.
redburn
@EightBitTony Terima kasih telah berbagi. Milik Anda terlihat sedikit lebih 'alami', tetapi saya benar-benar melihat pola tetes memori cache yang serupa (tapi mungkin lebih dapat diprediksi).
redburn
Saya bertanya-tanya apakah Munin 2 adalah grafik / pengumpulan data cukup berbeda untuk menghasilkan beberapa perbedaan (grafik lebih halus pada Anda), tetapi bahkan saya menunjukkan penurunan di tengah siklus daripada setiap hari. Pasti aneh.
EightBitTony

Jawaban:

3

Bisa jadi banyak hal. Mungkin salah satu program yang Anda jalankan adalah sesekali dan sebentar menggunakan banyak RAM. Jika itu benar-benar minggu pada sumbu x, Anda harus mengambil sampel pada resolusi yang jauh lebih tinggi (misalnya sekali per menit atau bahkan detik) untuk mendapatkan informasi lebih lanjut tentang apa yang terjadi yang menyebabkan cache turun. psdan topoutput (termasuk rata-rata beban) selama waktu itu akan berguna juga.

Jim Paris
sumber
Ya, saya kira kita bisa berteori bahwa ledakan yang sangat singkat, tiba-tiba dalam penggunaan memori yang terjadi dalam satu menit atau lebih, dan tidak terlihat oleh Munin dapat membuang cache, yang tentu saja, terlihat karena tetap ada.
EightBitTony
Headernya agak membingungkan, karena sebenarnya menampilkan satu minggu data, jadi itu adalah hari-hari pada x-as, bukan minggu. Adapun frekuensi pemungutan suara: Munin mengambil data setiap 5 menit, dan saya tidak berpikir frekuensi itu dapat diubah. Saya hanya menjalankan nginx, mysql, php-fpm dan munin-node. Bisakah itu ada hubungannya dengan cache mysql, mungkin?
redburn
Saya telah top (diurutkan berdasarkan penggunaan memori) menulis outputnya ke file setiap 5 detik, kemudian saya menganalisis file itu dan tidak menemukan proses yang menunjukkan perilaku tidak biasa pada titik di mana memori cache tiba-tiba turun. Kecuali suatu proses dapat menggunakan memori sebanyak ini dan masih lolos dari jendela 5 detik itu, saya tidak yakin ini bisa menjadi penyebabnya. Tetapi jika tidak ada proses mengamuk, apa yang bisa terjadi?
redburn
Utas ini agak basi, tetapi pengamatan cepat tentang metodologi: berapa banyak proses yang berkontribusi pada cache memori sistem tidak akan (dengan mudah) tercermin di atas , karena proses yang sangat aktif dapat menumpuk item ke dalam cache dengan sangat cepat tanpa prosesnya sendiri. memori yang dialokasikan meningkat banyak. Misalnya, membaca file yang sangat besar dalam potongan-potongan kecil untuk transmisi - sementara prosesnya mungkin tidak pernah menggunakan lebih dari beberapa MB yang dialokasikan , beberapa MB itu akan terus-menerus mengubah dan mengumpulkan referensi dalam cache. Jadi hal yang harus dilihat pada output teratas adalah akumulasi waktu CPU yang tiba-tiba.
goldilocks
Anda mungkin juga tertarik dengan ini: cognitivedissonance.ca/cogware/plog
goldilocks
2

Salah satu alasan yang mungkin adalah file yang tumbuh, seperti katakanlah log, baik dihapus, dikompresi atau dikirim ke tempat lain ketika mencapai ukuran tertentu.

Dalam kedua kasus tersebut, ukurannya yang di-cache, mungkin keseluruhannya jika tidak ada tekanan memori di OS Anda, akan dibebaskan dari cache segera setelah file asli dihapus.

Jlliagre
sumber
Ide yang menarik, tetapi file log paling aktif jarang melebihi ukuran file 25MB sebelum diputar, dan penggunaan cache / buffer cenderung turun sekitar 200MB.
redburn