Linuxに特定のプロセスのメモリをディスクにスワップするべきではないと伝える方法はありますか?Linuxに特定のプロセスのメモリをスワップしないように伝えることはできますか?
それはJavaアプリケーションなので、理想的には私はコマンドラインからこれを行う方法を期待しています。
グローバルスワップを0に設定することはできますが、これは賢明ですか?
Linuxに特定のプロセスのメモリをディスクにスワップするべきではないと伝える方法はありますか?Linuxに特定のプロセスのメモリをスワップしないように伝えることはできますか?
それはJavaアプリケーションなので、理想的には私はコマンドラインからこれを行う方法を期待しています。
グローバルスワップを0に設定することはできますが、これは賢明ですか?
これはLinuxのmlockall(2)システムコールで行うことができます。これはプロセス全体で機能しますが、渡す必要のある議論について読んでください。
あなたは本当にコア全体を引き出す必要がありますか?それがJavaアプリなら、おそらくJVM全体をコアでロックするでしょう。私はこれを行うためのコマンドラインの方法はわかりませんが、fork
を呼び出すには、mlockall
、次にexec
と呼ぶ簡単なプログラムを書くことができます。
madvise(2)のアクセスパターン通知の1つがお客様のニーズを満たしているかどうかを確認することもできます。より良いページング戦略についてVMサブシステムにアドバイスすることは、それが適切であればうまくいくかもしれません。
今のところSunOSのもとで、vadvise(2)というmadviseに似たメカニズムがありました。
@sanityこれを試しましたか?どのようにあなたのために働いたのですか?私は似たようなことをやっていた。 –
["メモリロックはfork(2)によって作成された子によって継承されず、execve(2)の間、またはプロセスが終了すると自動的に削除されます(ロックされません)。]] [http://www.kernel.org/doc /man-pages/online/pages/man2/mlock.2.html) - fork/mlock/execのアプローチはうまくいきません。 – Mat
@Matは正しいようです... OK ...何かを書くことのようなものmlockallを呼び出すJNI経由ですか?しかし、それはかなりハックを感じ始める... –
これは、mlockファミリーのシステムコールで実行できます。しかし、あなたが別のプロセスのためにそれを行うことができるかどうかはわかりません。
私はシステムメモリのどれくらいがロックされているかには注意が必要です。私はあなたが慎重でないならば、あなたがゴミ箱を通ってシステムをダウンさせることができると思う。 –
スーパーユーザーでは、最高の優先度レベル-20にすることができますし、スワップアウトされないようにすることができます。それは通常です。正の数はスケジューリング優先度を下げます。
非常に珍しい場合を除いて、この質問はあなたが間違っている(tm)ことを意味します。
Linuxがスワップしたいときに、プロセスをメモリに保存しようとすると、OSに不合理な要求が生じます。あなたのアプリがそれほど重要であれば、1)より多くのメモリを購入する、2)マシンから他のアプリケーション/デーモンを削除する、またはマシンをアプリに専用にする、そして/または3)本当に高速なディスクサブシステムに投資する。これらの手順は重要なアプリにとって合理的です。あなたがそれらを正当化できない場合は、おそらく配線メモリと他のプロセスの飢えを正当化することはできません。
暗号化に関連している場合は、メモリにとどまりたいと思うのは全く妥当です。例えば、gnome-keyringは、重要な部分をスワップから守るためにかなりのステップを必要とします。 (それ以外は、合理的な観察。) –
良い点、ポール。私はこれが異常な状況に該当すると感じています。 – dwc
すべての強力な暗号化要件を備えたバンキングおよびペイメントカード業界ではかなり一般的です。 –
なぜこれをやりたいですか?
このアプリのパフォーマンスを向上させようとしている場合は、おそらく間違っている可能性があります。 OSはディスクキャッシュ用のメモリを増やすためにプロセスをスワップアウトします。たとえ空きRAMがあっても、カーネルが最もよく知っています(スケーラを書いたsamrtの人が一番よく知っています)。
プロセスが応答性が必要な場合(使用されていない間にスワップアウトされ、すぐに再起動する必要がある場合)、優先度が高い、mlockになったり、リアルタイムカーネルを使用したりするのが役に立ちます。
あなたは、プロセスのためのswappinessをを変更するcgroupに追加し、そのcgroup内の値を設定したい場合:
https://unix.stackexchange.com/questions/10214/per-process-swapiness-for-linux#10227
は、アプリケーションのクラスが存在しているあなたがそれらを入れ替えたいことはありません。そのようなクラスの1つがデータベースです。データベースは、ディスク領域のキャッシュとバッファーとしてメモリーを使用します。これは、スワップすることが絶対に理にかなっていません。特定のメモリは、クライアントがそれを求めるときまで1週間必要とされないいくつかの関連データを保持することができる。キャッシング/スワッピングがなければ、データベースはディスク上の関連レコードを簡単に見つけることができますが、これはかなり高速です。交換すると、サービスが突然応答するのに長い時間がかかることがあります。
mysqld
には、OS /システムコールmemlock
を使用するコードが含まれています。 Linuxでは、少なくとも2.6.9以降、このシステムコールは、CAP_IPC_LOCK
ケイパビリティ[1]のルート以外のプロセスでも機能します。 memlock()
を使用する場合、処理は依然としてLimitMEMLOCK
制限の範囲内で動作する必要があります。 [2]。 systemd
についてのいくつかの良い点の1つは、特別なプログラムを必要とせずにmysqld
がこれらの機能を処理できることです。もしあなたがulimit
と期待どおりにrlimitsを設定することもできます。 Type=forking
で現在船
[Service]
# Prevent mysql from swapping
CapabilityBoundingSet=CAP_IPC_LOCK
# Let mysqld lock all memory to core (don't swap)
LimitMEMLOCK=-1
# do not kills this process if low on memory
OOMScoreAdjust=-900
# Use higher io scheduling
IOSchedulingClass=realtime
Type=simple
ExecStart=
ExecStart=/usr/sbin/mysqld --memlock $MYSQLD_OPTS
注標準コミュニティMySQLと--daemonize
を追加します。ここでは、データベースなどのプロセスのために必要がある場合がありますいくつかの他のものを含む必要な手順を、行いmysqld
ためoverride
ファイルがありますExecStart
行のサービスのオプションです。これは本質的に上記方法よりも安定性が低い。
更新日私はこの解決策に100%満足していません。ランタイムの数日後、私はプロセスがまだ膨大な量のスワップを持っていたことに気づいた! /proc/XXXX/smaps
を調べると、次のことに気付きます。
memlock
オプションが壊れていることを示しています。この場合、MySQLはスタックをロックすることができないため、大したことはありません。
あなたがアプリで「chmod + S」を実行した場合、Unixは「スティッキービット」を尊敬していましたが、それ以上は機能しないと思います。 –
申し訳ありませんが、私は "chmod + t"を意味しますが、私はちょうど見て、Linuxはスティッキービットを無視します。 –
http://blogs.msdn.com/b/oldnewthing/archive/2005/06/07/426294.aspx – Hello71