Dari waktu ke waktu server "saya" terhenti karena kehabisan memori dan ruang swap. (itu terus merespons ping tetapi tidak lebih dari itu, bahkan tidak ssh).
Saya diberi tahu linux bahwa memory overcommitment, yang sejauh yang saya pahami sama dengan yang dilakukan bank dengan uang: ia memberikan bantuan untuk memproses lebih banyak memori daripada yang sebenarnya tersedia, dengan asumsi bahwa sebagian besar proses tidak akan benar-benar menggunakan semua memori yang mereka tanyakan, pada Setidaknya tidak semua pada saat bersamaan.
Harap asumsikan ini adalah penyebab mengapa sistem saya sesekali hang, mari kita tidak membahas di sini apakah ini masalahnya (lihat Apa yang dapat menyebabkan SEMUA layanan pada server turun, namun masih merespons ping? Dan bagaimana mencari tahu ) .
Begitu,
bagaimana cara menonaktifkan atau mengurangi overcommitment memori secara drastis di CentOS? Saya telah membaca ada dua pengaturan yang disebut vm.overcommit_memory (nilai 0, 1, atau 2) dan vm.overcommit_ratiom tapi saya tidak tahu di mana saya harus menemukan dan mengubahnya (beberapa file konfigurasi mudah-mudahan), nilai apa yang harus saya coba , dan apakah saya perlu me-reboot server untuk membuat perubahan efektif.
dan apakah itu aman? Efek samping apa yang bisa saya harapkan? Ketika googling untuk overcommit_memory saya menemukan hal-hal menakutkan seperti orang mengatakan server mereka tidak bisa boot lagi ....
Karena apa yang menyebabkan peningkatan mendadak dalam penggunaan memori adalah mysql karena pertanyaan yang dibuat oleh php yang pada gilirannya dipanggil saat melayani permintaan http, saya berharap hanya beberapa script php gagal untuk menyelesaikan dan karenanya sekitar 500 tanggapan dari waktu ke waktu ketika server terlalu sibuk, yang merupakan risiko yang dapat saya ambil (tentu saja lebih baik yang membuat seluruh server menjadi tidak dapat diakses dan harus mem-boot ulang dengan keras).
Atau dapatkah ini menyebabkan server saya tidak dapat melakukan reboot jika saya memilih pengaturan yang salah?
Jawaban:
Memori overcommit dapat dinonaktifkan oleh
vm.overcommit_memory=2
0 adalah mode default, di mana kernel heuristik menentukan alokasi dengan menghitung memori bebas dibandingkan dengan permintaan alokasi yang dibuat. Dan mengaturnya ke 1 memungkinkan mode sihir, di mana kernel selalu mengiklankan bahwa ia memiliki cukup memori bebas untuk alokasi apa pun. Pengaturan ke 2, berarti proses hanya dapat mengalokasikan hingga jumlah yang dapat dikonfigurasi (
overcommit_ratio
) dari RAM dan akan mulai mendapatkan kegagalan alokasi atau pesan OOM ketika melampaui jumlah itu.Apakah aman untuk melakukannya, tidak. Saya belum melihat kasus penggunaan yang tepat di mana menonaktifkan overcommit memori benar-benar membantu, kecuali jika Anda 100% yakin dengan beban kerja dan kapasitas perangkat keras. Jika Anda tertarik, instal
kernel-docs
paket dan kunjungi/Documentation/sysctl/vm.txt
untuk membaca lebih lanjut, atau membacanya secara online .Jika Anda mengaturnya
vm.overcommit_memory=2
maka itu akan overcommit hingga persentase RAM fisik yang dikonfigurasi dalamvm.overcommit_ratio
(default adalah 50%).Ini tidak akan selamat dari reboot. Untuk kegigihan, letakkan ini di
/etc/sysctl.conf
file:dan lari
sysctl -p
. Tidak perlu reboot.sumber
Pernyataan benar-benar tidak memenuhi syarat: Menonaktifkan overcommit memori jelas "lebih aman" daripada mengaktifkannya.
$ Pelanggan telah menetapkannya pada beberapa ratus server web dan banyak membantu masalah stabilitas. Bahkan ada nagios yang memanggil api sangat keras jika tidak pernah dinonaktifkan.
Di sisi lain, orang mungkin tidak menganggapnya "aman" mengeluarkan proses dari ingatan ketika mereka hanya ingin terlalu banyak memakan ram dan tidak akan pernah benar-benar menggunakannya. (yaitu SAP akan menjadi contoh yang sangat baik)
Jadi, Anda kembali melihat apakah itu memperbaiki keadaan untuk Anda. Karena Anda sudah mencarinya untuk menyingkirkan masalah terkait - saya pikir itu mungkin membantu Anda.
(Saya tahu saya akan mengambil risiko downvote oleh beberapa orang yang pemarah)
sumber
Saya setuju bahwa menonaktifkan komitmen berlebihan lebih aman daripada mengaktifkannya dalam beberapa keadaan. Jika server menjalankan hanya beberapa pekerjaan memori besar (seperti simulasi rangkaian dalam kasus saya), jauh lebih aman untuk menolak aplikasi permintaan memori di muka daripada menunggu acara OOM (yang pasti akan segera menyusul). Cukup sering kita melihat server mengalami masalah setelah pembunuh OOM melakukan tugasnya.
sumber