Prasejarah
Saya memiliki elasticsearch dan SugarCRM7 berjalan pada CentOS 6.5. Setiap hari saya menghadapi masalah yang sama: kesalahan java outOfMemory. Itu terjadi karena nilai vm.max_map_count kecil, 65530 hanya ketika 262144 direkomendasikan.
Masalah
Masalahnya adalah bahwa vm.max_map_count tampaknya tidak dapat diubah:
Mengubah di bawah root
sudo sysctl -w vm.max_map_count=262144
kembali
galat: izin ditolak pada kunci 'vm.max_map_count'
Sementara
ps aux | grep java
Hanya mengembalikan proses grep
Mengubah startup elasticsearch
sudo service elasticsearch start
Pengembalian kesalahan juga
galat: izin ditolak pada kunci 'vm.max_map_count'
Memulai elasticsearch: [Oke]
Perubahan manual melalui file (hack kotor-kotor):
sudo vi /proc/sys/vm/max_map_count
Juga tidak berfungsi:
"/ proc / sys / vm / max_map_count" [readonly] 1L, 6C
- INSERT - W10: Peringatan: Mengubah file yang hanya bisa dibaca
E45: opsi 'readonly' diatur (tambahkan! Untuk menimpa)
"/ proc / sys / vm / max_map_count" E212: Tidak dapat membuka file untuk ditulis
Sementara
ls -la /proc/sys/vm/ | grep max_map_count
Kembali
-rw-r - r-- 1 root root 0 Apr 10 09:36 max_map_count
(Tapi saya rasa ini bisa normal untuk linux berbicara tentang direktori / proc)
Jadi bagaimana saya bisa mengubah nilai variabel ini? Memulai ulang elasticsearch setiap malam bukanlah ide yang baik ... Atau setidaknya mungkin ada yang tahu mengapa kesalahan ini terjadi?
sumber
Jawaban:
Anda hampir sampai, Tidak masalah apakah itu mesin virtual atau mesin fisik, pengaturan itu selalu dapat diubah.
Saya akan menunjukkan 3 metode.
Beberapa informasi awal:
1) Lebih baik dieksekusi sebagai root, jika memungkinkan.
2) / proc di unix bukan sistem file nyata, ini adalah sistem file kernel di-memori, tetapi tampaknya seperti sistem file disk normal. Anda dapat menyebutnya 'sistem file palsu' atau 'sistem file khusus', Anda tidak dapat mengedit file-file palsu dengan vi atau editor lain, karena mereka bukan file, mereka hanya terlihat seperti file. Saya terjebak dengan masalah yang sama tahun lalu.
Tetapi mudah untuk mengubah nilai-nilai mereka, hanya membutuhkan 'mekanika' jenis lain untuk mengeditnya.
Saya akan menjelaskan: Pertama, perlu root: (sudo berfungsi di beberapa distro, tetapi tidak pada beberapa distro lain seperti yang Anda coba, metode pertama ini bersifat universal dan bekerja pada Linux, macOS, atau sembarang berbasis-Unix Semoga Anda memiliki akses ke root kata sandi.
Lanjutkan saat diminta:
Masukkan kata sandi root.
Sekarang Anda root, mari kita periksa nilai saat ini: / proc / sys / vm / max_map_count
Mari kita ubah:
Mari kita verifikasi:
Selesai! Dan itu sudah diterapkan dan fungsional. Dengan mengubah nilai file pseudo apa pun di bawah / proc, pengaturan menjadi aktif secara instan. Tetapi mereka tidak bertahan setelah reboot. Anda dapat bermain dengan nilai-nilai dan mengukur perubahan kinerja di elasticsearh atau aplikasi atau sistem metrik lainnya. Go tunning sistem Anda, tulis nilai-nilai di atas kertas, pertahankan nilai terbaik. Pada kesalahan apa pun, reboot dan semuanya akan kembali ke nilai asli, dan mulai lagi sampai semua nilai yang diinginkan optimal. Ada banyak parameter disk dan memori yang bisa diperbaiki di / proc. Dan mereka membuat perbedaan besar dan peningkatan kinerja jika Anda menyetelnya dengan baik (dan punya waktu untuk itu). Anda berada di jalan yang benar.
Ketika puas, mari kita buat mereka permanen:
Metode pertama:
menggunakan /etc/rc.local
letakkan semua parameter di dalam file rc.local, contoh:
berhenti vi editor menyimpan file.
Parameter tersebut akan ditetapkan pada setiap reboot, SETELAH semua layanan init telah dimulai, tepat sebelum prompt login muncul.
( /etc/rc.local file dijalankan setelah semua layanan startup linux, ini mungkin tidak berfungsi jika elasticsearch memulai sebelum itu sebagai layanan, tetapi metode ini dapat berguna pada pengaturan lain jika Anda perlu di masa depan, atau Anda dapat menggunakan seperti ini dengan meletakkannya di dalam skrip init elasticsearch Anda, karena skrip init dijalankan sebagai root, jadi ini adalah sintaks yang sama dengan yang digunakan di dalam skrip init)
Anda juga dapat menyalinnya sekarang dan menempelkannya untuk perubahan instan. Parameter di atas valid, disetel, dan berjalan di server cassandra apache saya. Jika Anda mau, coba mereka sebagai titik awal untuk menyetel milik Anda.
Metode kedua untuk membuatnya permanen:
Parameter sekarang akan ditetapkan SEBELUM layanan startup di linux.
Edit /etc/sysctl.conf , masukkan parameter di dalamnya
lanjutkan dengan yang lain, simpan /etc/sysctl.conf , reboot server Anda untuk menerapkan perubahan, atau jalankan: sysctl -p untuk menerapkan perubahan tanpa reboot. Mereka akan permanen di seluruh reboot.
Dua metode di atas adalah yang paling umum. Ada satu lagi, dan itu bisa bekerja untuk Anda, itu dengan menggunakan sudo , hampir seperti yang Anda lakukan:
dari pada:
mencoba:
Ini berfungsi di ubuntu.
Memeriksa:
Semoga saya telah membantu, setidaknya dengan memberikan 3 opsi berbeda untuk mengatasi masalah, karena pertanyaan Anda sudah hampir setahun;)
Salam, Rafael Prado
sumber
Saya pikir "mesin virtual" Anda sebenarnya adalah sebuah wadah OpenVZ (yang dapat Anda verifikasi dengan menjalankannya
virt-what
).Dalam hal ini, Anda tidak dapat mengubah
vm.max_map_count
sysctl atau banyak lainnya. Nilai-nilainya tetap.Ini adalah masalah yang dikenal dengan elasticsearch ( edisi # 4978 ). Bukan hanya Elasticsearch. Aplikasi Java terkenal berkinerja buruk di berbagai penyedia OpenVZ, terutama karena host sering disetel dengan buruk dan tidak ada yang dapat Anda lakukan. Seorang komentator tentang masalah itu menggemakan apa yang akan menjadi rekomendasi saya dengan tepat:
sumber
Anda dapat mengikuti instruksi resmi:
Untuk membuat perubahan, perbarui pengaturan vm.max_map_count secara permanen di /etc/sysctl.conf
Lihat https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html
sumber