Tidak dapat mengubah vm.max_map_count untuk elasticsearch

14

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:

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

  2. Mengubah startup elasticsearch

    sudo service elasticsearch start
    

    Pengembalian kesalahan juga

    galat: izin ditolak pada kunci 'vm.max_map_count'

    Memulai elasticsearch: [Oke]

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

Valentina
sumber
3
Mesin macam apa itu? Virtual? Jika demikian, virtualisasi macam apa yang digunakan? Perhatikan bahwa beberapa virtualisasi misalnya, wadah OpenVZ memaksakan batasan pada wadah Anda, dan tidak memungkinkan Anda untuk "mengubah" kernel dan hal-hal tingkat rendah lainnya.
Miroslav Koškár
@MiroslavKoskar Saya tidak tahu, sayangnya. Bagaimana saya bisa mengetahuinya?
Valentina
@MiroslavKoskar Lupa menyebutkan - mesin ini virtual, tentu saja
Valentina
1
Bagaimana cara mengetahuinya? Nah, di mana tempatnya? Itu harus agak jelas karena biasanya bagian dari kontrak Anda dengan penyedia hosting Anda. Jika masih ragu, hubungi dukungan penyedia hosting Anda, IMHO itulah tempat terbaik untuk memulai (karena itu biasanya bagian dari kesepakatan dan sesuatu yang kemungkinan Anda bayar).
Miroslav Koškár
@ MiroslavKoskar baik, penyedia menjawab tanpa menyebutkan teknologi yang mereka tidak dapat membantu saya dengan masalah ini (itu agak masuk akal). Terima kasih atas bantuan Anda
Valentina

Jawaban:

13

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:

    $ su root

Masukkan kata sandi root.

Sekarang Anda root, mari kita periksa nilai saat ini: / proc / sys / vm / max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

Mari kita ubah:

    echo 262144 > /proc/sys/vm/max_map_count

Mari kita verifikasi:

    cat /proc/sys/vm/max_map_count
    262144

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

    vi /etc/rc.local 

letakkan semua parameter di dalam file rc.local, contoh:

    echo 220000000 > /proc/sys/vm/dirty_background_bytes
    echo 320000000 > /proc/sys/vm/dirty_bytes
    echo 0 > /proc/sys/vm/dirty_background_ratio
    echo 0 > /proc/sys/vm/dirty_ratio
    echo 500 > /proc/sys/vm/dirty_writeback_centisecs
    echo 4500 > /proc/sys/vm/dirty_expire_centisecs
    echo 1 > /proc/sys/net/ipv4/tcp_rfc1337
    echo 10 > /proc/sys/vm/swappiness
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 0 > /proc/sys/vm/zone_reclaim_mode
    echo deadline > /sys/block/sda/queue/scheduler
    echo 8 > /sys/class/block/sda/queue/read_ahead_kb
    echo 1048575 > /proc/sys/vm/max_map_count

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

 vm.max_map_count=1048575
 vm.zone_reclaim_mode=0
 vm.dirty_background_bytes=220000000
 vm.dirty_background_ratio=0
 vm.dirty_bytes=320000000
 vm.dirty_ratio=0
 vm.swappiness=10

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:

  sudo sysctl -w vm.max_map_count=262144

mencoba:

  echo 262144 | sudo tee /proc/sys/vm/max_map_count

Ini berfungsi di ubuntu.

Memeriksa:

   user@naos:~$ cat /proc/sys/vm/max_map_count
   262144

Semoga saya telah membantu, setidaknya dengan memberikan 3 opsi berbeda untuk mengatasi masalah, karena pertanyaan Anda sudah hampir setahun;)

Salam, Rafael Prado

pengguna62739
sumber
3
Mereka sudah melakukan ini, dan itu gagal.
Michael Hampton
1
Hai Michael, ya kamu benar. Awalnya saya mengerti bahwa masalahnya terkait dengan sistem operasi CentOS dan unix izin pengguna, jadi saya mengikuti baris itu pada jawaban saya. Tetapi informasi yang lebih baru menempatkan fokus masalah pada OpenVZ "host", yang membatasi beberapa pengaturan. Pengetahuan saya tentang Centos dan VmWare, tetapi tidak pada OpenVZ.
user62739
4

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_countsysctl 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:

joshuajonah berkomentar pada 20 Okt 2015
Ini gila. Saya kira saya akan berubah menjadi VPS KVM.

Michael Hampton
sumber