Pertanyaan Mengapa drop cache di Linux?


Di server kami, kami memiliki kebiasaan menjatuhkan cache pada tengah malam.

sync; echo 3 > /proc/sys/vm/drop_caches

Ketika saya menjalankan kode tampaknya membebaskan banyak RAM, tetapi saya benar-benar perlu melakukan itu. Bukankah RAM gratis itu sia-sia?


81
2018-05-20 03:12




Temukan orang yang memasukkan ini dan tanyakan mengapa dia melakukannya. Seperti yang Anda tebak dengan benar, tidak ada alasan yang jelas untuk itu. - Michael Hampton♦
Debugging kernel. Itu saja. Ini sebenarnya tidak membebaskan RAM apa pun; itu menjatuhkan cache, seperti namanya, dan dengan demikian mengurangi kinerja. - Michael Hampton♦
@ivcode Maka Anda harus mencari dan memperbaiki masalah dengan server tersebut daripada mencoba untuk menghindari kondisi yang menyebabkannya. Jika mobil saya terhenti setiap kali saya berbelok ke kanan, menghindari belokan kanan yang tajam adalah perbaikan yang buruk. - David Schwartz
Terkait thedailywtf.com/Articles/Modern-Memory-Management.aspx Sangat berdebat itu ide yang buruk. - Drunix
Terkait, dan deskripsi yang berguna tentang "masalah": linuxatemyram.com - Bill Weiss


Jawaban:


Anda 100% benar. ini tidak praktik yang baik untuk membebaskan RAM. Ini mungkin contoh administrasi sistem kultus kargo.


85
2018-05-20 04:59



1 untuk menyebutkan Administrasi Sistem Kargo Kargo. Setiap sysadmin yang tidak tahu istilah itu dan apa artinya harus dipecat. - Tonny
@Tonny: Kami akan ditinggalkan tanpa departemen sysadmin kemudian :( - PlasmaHH
Seperti kebanyakan manusia, saya suka pernyataan singkat dengan banyak persetujuan, tetapi mengutip atau bernalar akan menghasilkan +1 superego saya. - Aaron Hall
Jelaskan administrasi kargo-kultus, serta di atas, jika Anda tidak keberatan. Mungkin dalam pengeditan lanjutan? Saya masih menahan +1 saya ...: P - Aaron Hall
"mungkin bahwa meskipun aplikasi Anda mungkin tidak menggunakan RAM ini, tetapi Linux melakukan cache secara agresif ke dalam memorinya dan meskipun aplikasi membutuhkan memori, ia tidak akan membebaskan beberapa cache ini tetapi lebih baik mulai menukar." Tidak terlalu spesifik. Dalam prakteknya, manajemen memori tidak sempurna, dan memiliki tombol untuk berubah ketika ketidaksempurnaan itu muncul adalah hal yang baik. - Dan Pritts


Ya, membersihkan cache akan membebaskan RAM, tetapi menyebabkan kernel mencari file di disk daripada di cache yang dapat menyebabkan masalah kinerja.

Biasanya kernel akan mengosongkan cache ketika RAM yang tersedia habis. Sering menulis konten kotor ke disk menggunakan pdflush.


62
2018-05-20 06:26



1 untuk penjelasan Mengapa itu ide yang buruk. - Ogre Psalm33


Alasan untuk menjatuhkan cache seperti ini adalah untuk membandingkan kinerja disk, dan merupakan alasan satu-satunya.

Ketika menjalankan benchmark I / O-intensif, Anda ingin memastikan bahwa berbagai pengaturan yang Anda coba semuanya benar-benar melakukan disk I / O, jadi Linux memungkinkan Anda untuk menjatuhkan cache daripada melakukan reboot penuh.

Kutipan dari dokumentasi:

File ini bukan sarana untuk mengontrol pertumbuhan berbagai kernel   cache (inode, gigi, pagecache, dll ...) Objek-objek ini   secara otomatis direklamasi oleh kernel ketika memori diperlukan di tempat lain   pada sistem.

Penggunaan file ini dapat menyebabkan masalah kinerja. Karena itu membuang   cache objek, mungkin biaya sejumlah besar I / O dan CPU   membuat ulang objek yang jatuh, terutama jika mereka sedang digunakan berat.   Karena itu, gunakan di luar lingkungan pengujian atau debugging   tidak direkomendasikan.


34
2018-05-20 13:51



Tentu saja, tergantung pada apa yang Anda coba lakukan, bahkan reboot penuh mungkin tidak cukup membersihkan cache disk. - α CVn
"Objek-objek ini secara otomatis direklamasi oleh kernel ketika memori diperlukan" adalah tujuan desain tetapi mungkin tidak selalu menjadi perilaku yang sebenarnya. - Dan Pritts
@DanPritts Apa tepatnya yang membuat Anda berpikir itu tidak begitu? - Joe
Kasus yang jelas adalah ketika Anda ingin membersihkan RAM untuk memungkinkan alokasi lebih banyak (non-trnsparent) hugepages; Kasus lain adalah halamat sampah sampah koleksi transparan (lihat jawaban / komentar saya di tempat lain pada pertanyaan ini). Tetapi komentar saya ditujukan untuk kasus umum. Terkadang orang yang mengoperasikan sistem lebih tahu daripada orang yang merancang / mengimplementasikannya. Seringkali, tidak - itulah yang komentar mereka coba lindungi. Saya hanya senang karena itu - Dan Pritts


Ide dasar di sini mungkin tidak seburuk itu (hanya sangat naif dan menyesatkan): Mungkin ada file yang di-cache, yang sangat tidak mungkin diakses dalam waktu dekat, misalnya file log. Ini "memakan" ram, yang nantinya harus dibebaskan ketika diperlukan oleh OS dengan satu atau cara lain.

Tergantung pada pengaturan swappiness, pola akses file, pola alokasi memori, dan banyak lagi hal yang tidak dapat diprediksi, dapat terjadi bahwa ketika Anda tidak membebaskan cache ini, mereka nantinya akan dipaksa untuk digunakan kembali, yang membutuhkan waktu sedikit lebih lama daripada mengalokasikan memori dari kolam memori yang tidak terpakai. Dalam kasus terburuk pengaturan swappiness linux akan menyebabkan memori program di-swap, karena linux menganggap file-file itu mungkin lebih sering digunakan dalam waktu dekat daripada memori program.

Di lingkungan saya, linux menebak cukup sering salah, dan pada awal sebagian besar bursa saham Eropa (sekitar 0900 waktu setempat) server akan mulai melakukan hal-hal yang hanya dilakukan sekali per hari, perlu menukar memori yang sebelumnya ditukar karena menulis logfile, mengompresi mereka, menyalinnya, dll. mengisi cache ke titik di mana hal-hal harus ditukar.

Tetapi menjatuhkan solusi cache untuk masalah ini? tentu saja tidak. Apa yang akan menjadi solusi di sini adalah untuk memberi tahu linux apa yang tidak diketahui: bahwa file-file ini kemungkinan tidak akan digunakan lagi. Ini dapat dilakukan oleh aplikasi penulisan menggunakan hal-hal seperti posix_fadvise()atau menggunakan alat garis cmd seperti vmtouch (yang juga dapat digunakan untuk melihat hal-hal serta file cache).

Dengan cara itu Anda dapat menghapus data yang tidak diperlukan lagi dari cache, dan menjaga barang-barang yang harus di-cache, karena ketika Anda menjatuhkan semua cache, banyak hal harus dibaca ulang dari disk. Dan itu pada saat yang paling buruk: ketika dibutuhkan; menyebabkan keterlambatan dalam aplikasi Anda yang terlihat dan sering tidak dapat diterima.

Apa yang seharusnya Anda miliki adalah sebuah sistem yang memonitor pola penggunaan memori Anda (misalnya jika ada sesuatu yang bertukar) dan kemudian menganalisa sesuai, dan bertindak sesuai. Solusinya mungkin mengusir beberapa file besar pada akhir hari menggunakan vtouch; mungkin juga untuk menambah lebih banyak ram karena penggunaan puncak harian server hanya itu.


25
2018-05-20 19:46



Semua aplikasi di server saya berjalan di nohup. Mungkin nohup.out sedang di-cache dan memakan memori? - ivcode
@ivcode: Ini bisa menjadi alasan, periksa seberapa besar nohup.out. Mungkin gunakan vmtouch untuk mencari tahu berapa banyak cache. - PlasmaHH
Saya memiliki tugas cron untuk cat /dev/null > path/nohup.out dalam setiap 15 menit saat nohup.out berkembang pesat. Mungkin linux adalah caching nohup.out bahkan jika saya membersihkannya - ivcode
@ivcode Jika Anda tidak membutuhkan output dari nohup Anda harus mengarahkan kembali ke /dev/null. Sepertinya Anda memiliki beberapa sysadmin yang tidak berpengalaman yang bekerja pada sistem Anda di beberapa titik. Lihat stackoverflow.com/questions/10408816/… untuk cara mengarahkan nohupoutput untuk /dev/null - David Wilkins
meskipun nohup.out dihapus dalam interval 15 menit, jika proses aplikasi terbunuh karena alasan tertentu, nohup.out akan dicadangkan secara otomatis dari skrip lain. saya mencoba vmtouch. itu alat yang sangat bagus - ivcode


Saya telah melihat drop cache berguna ketika memulai sekelompok mesin virtual. Atau apa pun yang menggunakan Halaman Besar seperti beberapa server basis data.

Halaman Besar di Linux sering perlu men-defrag RAM untuk menemukan 2MB RAM fisik yang berdekatan untuk dimasukkan ke dalam halaman. Membebaskan semua cache file membuat proses ini sangat mudah.

Tetapi saya setuju dengan sebagian besar jawaban lainnya karena tidak ada alasan yang bagus untuk menghapus file cache setiap malam.


16
2018-05-22 00:47



Saya memberi suara untuk menunjukkan prasangka orde kedua adalah tanggapan untuk menjatuhkan cache. - Noah Spurrier
Juga, dalam aplikasi HPC pada node memori tinggi (1Tb), membaca dalam beberapa file besar menghasilkan sejumlah besar cache memori. Karena banyak aplikasi HPC melakukan malloc dengan ratusan GB, sistem dapat mengulur waktu selama berjam-jam karena proses migrasi memindahkan potongan kecil dari memori yang terfragmentasi tanpa hasil di NUMA node setelah sistem mencapai "batas" memori tembolok. Lebih buruk lagi, tidak ada yang dapat Anda lakukan di userland untuk membebaskan cache kecuali mengelabui sistem agar mengalokasikan semua blok kecil 2MB yang dapat sekaligus membebaskan, membiarkan defrag yang dicuri dan aplikasi berjalan normal. - user1649948
+1 Perintah untuk membuat halaman besar (sysctl -w vm.nr_hugepages=...) menolak untuk bahkan bekerja kecuali saya drop cache pertama (Arch linux). - Aleksandr Dubinsky


Ada kemungkinan bahwa ini dilembagakan sebagai cara untuk menstabilkan sistem ketika tidak ada seorang pun dengan keterampilan atau pengalaman untuk benar-benar menemukan masalah.

Membebaskan sumber daya

Menjatuhkan cache pada dasarnya akan membebaskan beberapa sumber daya, tetapi ini memiliki efek samping untuk membuat sistem benar-benar bekerja lebih keras untuk melakukan apa yang coba dilakukan. Jika sistem bertukar (mencoba membaca dan menulis dari partisi swap disk lebih cepat daripada yang sebenarnya mampu) maka menjatuhkan cache secara berkala dapat mempermudah gejala, tetapi tidak melakukan apa pun untuk menyembuhkan sebab.

Apa yang memakan memori?

Anda harus menentukan apa yang menyebabkan banyak konsumsi memori yang membuat cache drop tampaknya berfungsi. Ini dapat disebabkan oleh sejumlah proses server yang tidak dikonfigurasi dengan benar atau salah. Sebagai contoh, pada satu server saya menyaksikan penggunaan memori max out ketika situs Magento mencapai sejumlah pengunjung dalam interval 15 menit. Ini akhirnya disebabkan oleh Apache yang dikonfigurasi untuk memungkinkan terlalu banyak proses untuk berjalan secara bersamaan. Terlalu banyak proses, menggunakan banyak memori (Magento kadang-kadang binatang) = swapping.

Intinya

Jangan hanya berasumsi bahwa itu adalah sesuatu yang diperlukan. Jadilah proaktif dalam mencari tahu mengapa itu ada, memiliki nyali untuk melumpuhkannya jika yang lain mengatakan itu salah, dan amati sistemnya - pelajari apa masalah sebenarnya dan perbaiki.


8
2018-05-20 15:16





Linux / m68k sebenarnya memiliki bug kernel yang menyebabkan kswapd menjadi gila dan memakan 100% CPU (50% jika ada beberapa tugas yang terikat dengan CPU lainnya, seperti autobuilder paket binary Debian - vulgo buildd - sudah berjalan), yang dapat (sebagian besar) waktu, tidak selalu) dikurangi dengan menjalankan perintah khusus ini setiap beberapa jam.

Yang sedang berkata ... server Anda kemungkinan besar bukan sistem m68k (Atari, Amiga, Classic Macintosh, VME, Q40 / Q60, Sun3) ;-)

Dalam hal ini, orang yang memasang dialog baik mengikuti beberapa saran yang dapat dipertanyakan atau, paling lama, usang, atau mendapat ide tentang bagaimana RAM harus digunakan salah (pemikiran modern memang mengatakan "RAM bebas terbuang" dan menyarankan caching) , atau "menemukan" bahwa ini "memperbaiki" [sic!] masalah lain di tempat lain (dan terlalu malas untuk mencari perbaikan yang tepat).


4
2018-05-21 08:03



"bug kernel yang menyebabkan kswapd menjadi gila" - Bug apa ini? - Ben
@Ben lihat utas ini (pesan ini dan beberapa tindak lanjut, salah satunya termasuk menebak darimana datangnya) - mirabilos
Saya mengalami masalah yang sama (meskipun itu x86_64) dan satu-satunya solusi saat ini adalah untuk meletakkan cache serverfault.com/questions/740790/… - Fernando
@Fernando Saya memiliki cronjob “drop cach” di kotak m68k juga - mirabilos