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


14

先史時代

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

問題

問題は、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

    -INSERT-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を再起動するのは得策ではありません...または、少なくとも誰かがこのエラーが発生する理由を知っているかもしれませんか?


3
どんな機械ですか?バーチャル?その場合、どのような仮想化が使用されますか?OpenVZコンテナーなどの一部の仮想化では、コンテナーに制限が課せられ、カーネルやその他の低レベルのものを「微調整」することはできません。
ミロスラフコシュカル

@MiroslavKoskarあいにく、わかりません。どうすれば見つけられますか?
バレンティーナ

マシンはもちろん、仮想的である- @MiroslavKoskarは言及を忘れた
ヴァレンティナ

1
どうやって見つけるの?さて、それはどこでホストされていますか?これは通常、ホスティングプロバイダーとの契約の一部であるため、かなり明白なはずです。まだ疑問がある場合は、ホスティングプロバイダーのサポートに連絡してください。IMHOは開始するのに最適な場所です(通常は取引の一部であり、支払いが必要な場合があるため)。
ミロスラフコシュカル

@MiroslavKoskarよく、プロバイダーは、この問題で私を助けることができない技術を言及せずに答えました(それはかなり合理的です)。ご協力いただきありがとうございます
バレンティーナ

回答:


13

仮想マシンか物理マシンかは関係ありません。これらの設定は常に変更可能です。

3つの方法を示します。

いくつかの事前情報:

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

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

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

説明します:最初に、rootになる必要があります:(sudoはいくつかのディストリビューションで動作しますが、あなたが試したような他のいくつかのディストリビューションでは動作しません。この最初の方法は、Linux、macOS、またはUnixベース。rootパスワードにアクセスできることを願っています。

プロンプトで続行します。

    $ su 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が開始されると機能しない場合があります。それらをelasticsearch initスクリプト内に配置します。これは、initスクリプトがrootとして実行されるため、上記の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つの方法が最も一般的です。別のものがあり、あなたのために働くかもしれません、それはほとんどあなたがやっているように、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つの異なるオプションを提供することで、私が何らかの形で助けてくれたことを願っています。

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


3
彼らはすでにやったこれを、それが失敗しました。
マイケルハンプトン

1
こんにちはマイケル、はい、あなたは正しいです。問題はオペレーティングシステムのCentOSとUNIXユーザーのアクセス許可に関連していることを最初は理解していたので、回答のその行に従いました。しかし、新しい情報により、問題の焦点が「ホスト」OpenVZに置かれるため、一部の設定が制限されます。私の知識はCentosとVmWareにありますが、OpenVZにはありません。
user62739

4

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

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

これはelasticsearchのよく知られた問題です(問題#4978)。Elasticsearchだけではありません。Javaアプリは、さまざまなOpenVZプロバイダーでパフォーマンスが低いことがよく知られています。これは、主にホストのチューニングが不十分であることが多く、それに対してできることは何もないからです。その問題に関する1人のコメント者が、私の推奨事項を正確に反映しました。

joshuajonahは2015年10月20日にコメントしました
これは非常識です。私はKVM VPSに切り替えるつもりだと思います。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.