Apakah ada cara untuk memberitahu kernel Linux untuk hanya menggunakan persentase memori tertentu untuk cache buffer? Saya tahu /proc/sys/vm/drop_caches
dapat digunakan untuk menghapus cache sementara, tetapi apakah ada pengaturan permanen yang mencegahnya tumbuh lebih dari misalnya 50% dari memori utama?
Alasan saya ingin melakukan ini, adalah bahwa saya memiliki server yang menjalankan OSD Ceph yang terus-menerus menyajikan data dari disk dan mengelola untuk menggunakan seluruh memori fisik sebagai buffer cache dalam beberapa jam. Pada saat yang sama, saya perlu menjalankan aplikasi yang akan mengalokasikan sejumlah besar (beberapa 10 GB) memori fisik. Bertentangan dengan kepercayaan populer (lihat saran yang diberikan pada hampir semua pertanyaan mengenai cache buffer), otomatis membebaskan memori dengan membuang entri cache bersih tidak instan: memulai aplikasi saya bisa memakan waktu hingga satu menit ketika cache buffer penuh ( *), sementara setelah membersihkan cache (menggunakan echo 3 > /proc/sys/vm/drop_caches
) aplikasi yang sama dimulai hampir secara instan.
(*) Selama menit waktu startup ini, aplikasi salah dalam memori baru tetapi menghabiskan 100% waktunya di kernel, menurut Vtune dalam fungsi yang disebut pageblock_pfn_to_page
. Fungsi ini tampaknya terkait dengan pemadatan memori yang diperlukan untuk menemukan halaman besar, yang membuat saya percaya bahwa sebenarnya fragmentasi adalah masalahnya.
sumber
Jawaban:
Jika Anda tidak menginginkan batas absolut tetapi cukup menekan kernel untuk membersihkan buffer lebih cepat, Anda harus melihatnya
vm.vfs_cache_pressure
Mulai dari 0 hingga 200. Pindahkan ke arah 200 untuk tekanan lebih tinggi. Nilai standarnya adalah 100. Anda juga dapat menganalisis penggunaan memori menggunakan
slabtop
perintah. Dalam kasus Anda,dentry
dan*_inode_cache
nilai harus tinggi.Jika Anda menginginkan batas absolut, Anda harus melihat ke atas
cgroups
. Tempatkan server Ceph OSD di dalam cgroup dan batasi memori maksimum yang dapat digunakan dengan mengaturmemory.limit_in_bytes
parameter untuk cgroup.Referensi:
[1] - GlusterFS Linux Kernel Tuning
[2] - RHEL 6 Panduan Manajemen Sumber Daya
sumber
limit_in_bytes
set tampaknya melakukannya. Terima kasih!vfs_cache_pressure
hanya membersihkan cache gigi dan inode, dan tidak ada hubungannya dengan buffer cache.vfs_cache_pressure
atas100
dapat membantu jika Anda tidak memiliki RAM yang cukup untuk beban kerja Anda. Ini akan mengurangi penggunaan RAM tetapi akan menyebabkan kinerja I / O yang lebih buruk secara keseluruhan.Saya tidak tahu tentang A% tetapi, Anda dapat menetapkan batas waktu sehingga turun setelah x jumlah menit.
Pertama di terminal
Untuk menghapus cache saat ini.
Buat itu
cron-job
Tekan Alt-F2, ketikgksudo gedit /etc/crontab
, Kemudian Tambahkan baris ini di dekat bagian bawah.Ini membersihkan setiap 15 menit. Anda dapat mengatur ke 1 atau 5 menit jika Anda benar-benar ingin dengan mengubah parameter pertama menjadi * atau * / 5 daripada * / 15
Untuk melihat RAM gratis Anda, kecuali cache:
sumber
3 > drop_caches
termasuk perilakusync
Saya pikir firasat Anda di akhir pertanyaan Anda ada di jalur yang benar. Saya menduga A, NUMA-sadar alokasi memori memigrasikan halaman antara CPU, atau B, lebih mungkin, kode defrag hugepages transparan berusaha menemukan daerah yang berdekatan dan selaras.
Hugepage dan hugepage transparan telah diidentifikasi untuk peningkatan kinerja yang ditandai pada beban kerja tertentu dan bertanggung jawab untuk menghabiskan banyak waktu CPU tanpa memberikan banyak manfaat.
Ini akan membantu untuk mengetahui kernel mana yang Anda jalankan, isi / proc / meminfo (atau setidaknya nilai HugePages_ *.), Dan, jika mungkin, lebih banyak dari vtune profiler callgraph yang merujuk pageblock_pfn_to_page ().
Juga, jika Anda menuruti tebakan saya, coba nonaktifkan defrag hugepage dengan:
(mungkin ini sebagai gantinya, tergantung pada kernel Anda :)
Terakhir, apakah aplikasi ini menggunakan puluhan pertunjukan ram sesuatu yang Anda tulis? Bahasa apa?
Karena Anda menggunakan istilah, "kesalahan dalam halaman memori," Saya kira Anda cukup terbiasa dengan desain operasi dan memori virtual. Saya berjuang untuk membayangkan situasi / aplikasi yang akan menyalahkan begitu agresif sehingga tidak membaca banyak I / O - hampir selalu dari buffer cache yang Anda coba batasi.
(Jika Anda penasaran, lihat mmap (2) flag seperti MAP_ANONYMOUS dan MAP_POPULATE dan mincore (2) yang dapat digunakan untuk melihat halaman virtual mana yang sebenarnya memiliki halaman fisik yang dipetakan.)
Semoga berhasil!
sumber
Jika Ceph OSD adalah satu proses terpisah, Anda bisa menggunakan cgroup untuk mengontrol sumber daya yang digunakan oleh proses:
Buat cgroup bernama like group1 dengan batas memori (50GB, misalnya, batas lain seperti CPU didukung, misalnya CPU juga disebutkan):
Kemudian, jika aplikasi Anda sudah berjalan, bawa aplikasi ke dalam cgroup ini:
Atau jalankan aplikasi Anda dalam cgroup ini:
sumber
tuned adalah daemon tuning sistem adaptif dinamis yang menyetel pengaturan sistem secara dinamis tergantung pada penggunaan.
Lihat dokumentasi terkait, dan file konfigurasi.
Informasi tambahan
The sync perintah flushes buffer, yaitu, kekuatan semua data yang tidak tertulis yang akan ditulis ke disk, dan dapat digunakan ketika seseorang ingin untuk memastikan bahwa semuanya aman ditulis. Dalam sistem UNIX tradisional, ada program yang disebut pembaruan yang berjalan di latar belakang yang melakukan sinkronisasi setiap 30 detik, sehingga biasanya tidak perlu menggunakan sinkronisasi. Linux memiliki daemon tambahan, bdflush , yang melakukan sinkronisasi lebih tidak sempurna lebih sering untuk menghindari pembekuan mendadak karena I / O disk yang berat yang kadang-kadang menyebabkan sinkronisasi .
Di Linux, bdflush dimulai dengan pembaruan. Biasanya tidak ada alasan untuk mengkhawatirkannya, tetapi jika bdflush mati karena suatu alasan, kernel akan memperingatkan tentang hal ini, dan Anda harus memulainya dengan tangan ( / sbin / update ).
sumber