CentOS 6.5でelasticsearchとSugarCRM7を実行しています。毎日同じ問題に直面しています:Java outOfMemoryエラー。これはvm.max_map_countの値が小さいために発生し、65530は262144が推奨されている場合にのみ発生します。
問題は、vm.max_map_countが変更できないように見えることです。
ルートの下で変更
Sudo sysctl -w vm.max_map_count=262144
戻り値
エラー:権限がキー 'vm.max_map_count'で拒否されました
ながら
ps aux | grep Java
Grepプロセスのみを返します
Elasticsearch起動時の変更
Sudo service elasticsearch start
エラーも返す
エラー:権限がキー 'vm.max_map_count'で拒否されました
Elasticsearchの開始:[OK]
ファイルによる手動変更(ダーティダーティハック):
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を再起動するのは良い考えではありません...または、少なくともこのエラーが発生する理由を誰かが知っている可能性がありますか?
あなたはほとんどそこにいます、それが仮想マシンであるか物理マシンであるかは問題ではありません、それらの設定は常に変更可能です。
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年前の質問だからです;)
よろしく、ラファエルプラド
あなたの「仮想マシン」は実際にはOpenVZコンテナだと思います(virt-what
を実行してこれを確認できます)。
この場合、vm.max_map_count
sysctlまたは他の多くを変更することはできません。値は固定されています。
これはelasticsearch( issue#4978 )の既知の問題です。それはElasticsearchだけではありません。 JavaアプリはさまざまなOpenVZプロバイダーで十分に機能しないことがよく知られています。主にホストが十分に調整されておらず、それに対してあなたができることは何もないためです。丁度:
joshuajonahが2015年10月20日にコメントしました
これは異常です。 KVM VPSに変更するつもりだと思います。
あなたは公式の指示に従うかもしれません:
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 を参照してください