Cent OS: Bagaimana cara mematikan atau mengurangi overcommitment memori, dan apakah aman untuk melakukannya?

20

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,

  1. 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.

  2. 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?

matteo
sumber
1
Menonaktifkan overcommit tidak akan membantu Anda ketika Anda benar - benar kehabisan memori. Menambahkan RAM ke server mungkin membantu.
Michael Hampton
2
Menonaktifkan overcommit tidak akan menjadi solusi akhir tetapi IS akan banyak membantu, jika suatu saat server kehabisan memori (yang hanya sekali dalam beberapa saat selama beberapa detik) Saya hanya memiliki beberapa permintaan http yang ditolak (atau dilayani dengan buruk), alih-alih meminta server saya MATI sepenuhnya dan selamanya (sampai saya me-restart-nya)
matteo

Jawaban:

30

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-docspaket dan kunjungi /Documentation/sysctl/vm.txtuntuk membaca lebih lanjut, atau membacanya secara online .

Jika Anda mengaturnya vm.overcommit_memory=2maka itu akan overcommit hingga persentase RAM fisik yang dikonfigurasi dalam vm.overcommit_ratio(default adalah 50%).

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

Ini tidak akan selamat dari reboot. Untuk kegigihan, letakkan ini di /etc/sysctl.conffile:

vm.overcommit_memory=X

dan lari sysctl -p. Tidak perlu reboot.

Soham Chakraborty
sumber
bagian yang tidak Anda jawab ada di file mana saya mengubah pengaturan vm.memory_overcommit dan terutama apakah saya perlu mem-boot ulang (atau apa lagi) untuk membuatnya berlaku
matteo
2
echo 0/1/2> / proc / sys / vm / overcommit_memory Ini tidak akan selamat dari reboot. Untuk ketekunan, letakkan ini di file /etc/sysctl.conf vm.overcommit_memory = X dan jalankan sysctl -p. Tidak perlu reboot
Soham Chakraborty
Terima kasih banyak. Semoga Anda menambahkan ini ke badan jawaban sehingga saya dapat "menerimanya" secara resmi.
matteo
1
Menambahkan bagian baru.
Soham Chakraborty
4
"overcommit_ratio" memiliki efek penting ketika menggunakan overcommit_memory = 2 - ini menentukan persentase RAM fisik yang diizinkan untuk dialokasikan! Jadi jika rasio <100 maka Anda akan membiarkan sebagian RAM tidak teralokasi, mungkin untuk cache disk atau sejenisnya. Rasio default adalah 50% sehingga Anda hanya akan menggunakan 50% dari RAM fisik jika Anda tidak mengubahnya!
David Gardner
6

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)

Florian Heigl
sumber
3

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.

pengguna185690
sumber