web-dev-qa-db-ja.com

elasticsearchのvm.max_map_countを変更できません

先史時代

CentOS 6.5でelasticsearchとSugarCRM7を実行しています。毎日同じ問題に直面しています:Java outOfMemoryエラー。これはvm.max_map_countの値が小さいために発生し、65530は262144が推奨されている場合にのみ発生します。

問題

問題は、vm.max_map_countが変更できないように見えることです。

  1. ルートの下で変更

    Sudo sysctl -w vm.max_map_count=262144
    

    戻り値

    エラー:権限がキー 'vm.max_map_count'で拒否されました

    ながら

    ps aux | grep Java
    

    Grepプロセスのみを返します

  2. Elasticsearch起動時の変更

    Sudo service elasticsearch start
    

    エラーも返す

    エラー:権限がキー 'vm.max_map_count'で拒否されました

    Elasticsearchの開始:[OK]

  3. ファイルによる手動変更(ダーティダーティハック):

    Sudo vi /proc/sys/vm/max_map_count
    

    どちらも機能しません:

    "/ proc/sys/vm/max_map_count" [読み取り専用] 1L、6C

    -挿入-W10:警告:読み取り専用ファイルの変更

    E45:「読み取り専用」オプションが設定されている(オーバーライドするには!を追加)

    "/ proc/sys/vm/max_map_count" E212:書き込み用にファイルを開けません

    ながら

    ls -la /proc/sys/vm/ | grep max_map_count
    

    戻り値

    -rw-r--r-- 1ルートルート0 Apr 10 09:36 max_map_count

    (しかし、これはLinuxが/ procディレクトリについて話すのは普通のことだと思います)

では、この変数の値を変更するにはどうすればよいですか?毎晩elasticsearchを再起動するのは良い考えではありません...または、少なくともこのエラーが発生する理由を誰かが知っている可能性がありますか?

14
Valentina

あなたはほとんどそこにいます、それが仮想マシンであるか物理マシンであるかは問題ではありません、それらの設定は常に変更可能です。

3つの方法を紹介します。

事前情報:

1)可能であれば、ルートとして実行することをお勧めします。

2)/ proc on UNIXは実際のファイルシステムではなく、メモリ内のカーネルファイルシステムですが、通常のディスクファイルシステムのように見えます。 「偽のファイルシステム」または「特別なファイルシステム」と呼ぶことができます。これらの偽のファイルはファイルではないため、viや他のエディターで編集することはできません。私は何年も前に同じ問題に固執しました。

しかし、それらの値を変更するのは簡単です。それらを編集するには、別の種類の「メカニズム」が必要です。

説明します:まず、rootになる必要があります:(Sudoは一部のディストリビューションでは機能しますが、他の一部のディストリビューションでは機能しません。この最初の方法はユニバーサルであり、Linux、macOS、またはUnixベースのすべてで機能します。rootパスワードにアクセスできることを願っています。

プロンプトで続行:

    $ su root

Rootパスワードを入力します。

Rootになりました。現在の値を確認してみましょう。/ proc/sys/vm/max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

変更しましょう:

    echo 262144 > /proc/sys/vm/max_map_count

確認しましょう:

    cat /proc/sys/vm/max_map_count
    262144

終わった!そして、それはすでに適用され、機能しています。/procの下にある疑似ファイルの値を変更することにより、設定は即座にアクティブになります。ただし、再起動後は保持されません。 elasticsearhまたはその他のアプリケーションまたはシステムメトリックで、値を操作してパフォーマンスの変化を測定できます。システムを調整し、値を紙に書いて、最高の値を維持します。間違いがあった場合は、再起動するとすべて元の値に戻り、希望する値がすべて最適になるまで再起動します。/procの下には、多くのディスクとメモリの調整可能なパラメータがあります。そして、それらをうまく調整すると(そして、そのための時間があれば)、それらは大きな違いとパフォーマンスの向上をもたらします。あなたは正しい道を進んでいます。

満足したら、永続的にしましょう:

最初の方法:

/ etc/rc.localを使用する

    vi /etc/rc.local 

すべてのパラメーターをrc.localファイル内に配置します。例:

    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

ファイルを保存するviエディターを終了します。

これらのパラメータは、ログインプロンプトが表示される直前に、すべてのinitサービスが開始された後、再起動するたびに設定されます。

/ etc/rc.localすべての起動Linuxサービスの後にファイルが実行されます。Elasticsearchがサービスとして起動する前に起動すると、このファイルは機能しない可能性がありますが、この方法はinitスクリプトはrootとして実行されるため、initスクリプト内で使用するのと同じ構文ですので、将来必要になった場合や、elasticsearch initスクリプト内に配置してこのように使用できる場合は、別のセットアップで役立ちます)

また、それらを今すぐコピーして貼り付けて、即座に変更することもできます。上記のパラメーターは有効で、調整されており、Apache cassandraサーバーで実行されています。必要に応じて、これらのパラメーターを開始点として試してください。

それらを永続的にする2番目の方法:

Linuxのスタートアップサービスの前にパラメータが設定されるようになりました。

編集/ etc/sysctl.conf、パラメータを中に入れます

 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

他のユーザーと一緒に進み、/ etc/sysctl.confを保存し、サーバーを再起動して変更を適用するか、次のコマンドを実行してくださいsysctl -p再起動せずに変更を適用します。再起動後も永続的になります。

上記の2つの方法が最も一般的です。もう1つあります。あなたにとってはうまくいくかもしれません。それはSudoを使用することです。

の代わりに:

  Sudo sysctl -w vm.max_map_count=262144

試してください:

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

Ubuntuで動作します。

確認:

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

問題に対処するための3つの異なるオプションを提供することで、私が何らかの形で助けてくれたことを願っています。それは、ほぼ1年前の質問だからです;)

よろしく、ラファエルプラド

13
user62739

あなたの「仮想マシン」は実際にはOpenVZコンテナだと思います(virt-whatを実行してこれを確認できます)。

この場合、vm.max_map_count sysctlまたは他の多くを変更することはできません。値は固定されています。

これはelasticsearch( issue#4978 )の既知の問題です。それはElasticsearchだけではありません。 JavaアプリはさまざまなOpenVZプロバイダーで十分に機能しないことがよく知られています。主にホストが十分に調整されておらず、それに対してあなたができることは何もないためです。丁度:

joshuajonahが2015年10月20日にコメントしました
これは異常です。 KVM VPSに変更するつもりだと思います。

4
Michael Hampton

あなたは公式の指示に従うかもしれません:

sysctl -w vm.max_map_count=262144

変更を永続的にするには、/ etc/sysctl.confのvm.max_map_count設定を更新します

https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html を参照してください

0
heroin