特定のプロセスのメモリをディスクにスワップアウトしないようにLinuxに指示する方法はありますか?
そのa Javaアプリなので、理想的にはコマンドラインからこれを行う方法を望んでいます。
グローバルなswappinessを0に設定できることは承知していますが、これは賢明ですか?
Linuxで mlockall(2) システムコールを使用してこれを行うことができます。これはプロセス全体で機能しますが、渡す必要がある引数について読んでください。
本当に全部をコアにプルする必要がありますか? Javaアプリの場合、おそらくJVM全体をコア内でロックします。これを行うためのコマンドラインメソッドはわかりませんが、簡単なプログラムを作成して呼び出すことができますfork
、mlockall
、次にexec
を呼び出します。
madvise(2) のアクセスパターン通知の1つがニーズを満たしているかどうかを確認することもできます。より適切なページング戦略についてVMサブシステムに助言することは、それがあなたに当てはまる場合にうまくいくかもしれません。
昔、SunOSのもとでは、madviseに似た vadvise(2) と呼ばれるメカニズムがあったことに注意してください。
プロセスのswappinessを変更する場合は、それをcgroupに追加し、そのcgroupの値を設定します。
https://unix.stackexchange.com/questions/10214/per-process-swapiness-for-linux#10227
スーパーユーザーとして、最高の優先度レベル-20に「ナイス」でき、スワップアウトされないようにするのに十分であることを願っています。それは通常です。正の数は、スケジューリングの優先順位を下げます。通常のユーザーは上向きにナイスすることはできません(負の数)。
mlock ファミリのsyscallsによってこれを行うことができます。ただし、別のプロセスで実行できるかどうかはわかりません。
アプリケーションを入れ替えたくないアプリケーションのクラスが存在します。そのようなクラスの1つがデータベースです。データベースはディスク領域のキャッシュとバッファとしてメモリを使用しますが、これらがスワップされることはまったく意味がありません。特定のメモリには、クライアントが要求する1日までの1週間は不要な関連データが含まれている場合があります。キャッシング/スワッピングがなければ、データベースは関連するレコードをディスク上で見つけるだけで、非常に高速になります。ただし、スワッピングを使用すると、サービスの応答に突然長い時間がかかる場合があります。
mysqld
には、OS /システムコールmemlock
を使用するためのコードが含まれています。 Linuxでは、少なくとも2.6.9以降、このシステムコールは、CAP_IPC_LOCK
機能を持つルート以外のプロセスに対して機能します [1] 。 memlock()
を使用する場合でも、プロセスはLimitMEMLOCK
制限の範囲内で機能する必要があります。 [2] 。 systemd
の(いくつかの)良い点の1つは、特別なプログラムを必要とせずに、これらの機能をmysqld
プロセスに付与できることです。 ulimit
で期待どおりにrlimitsを設定することもできます。以下は、データベースなどのプロセスに必要となる可能性のある他のいくつかを含む、必要な手順を実行するoverride
のmysqld
ファイルです。
[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にはType=forking
が同梱されており、ExecStart
行のサービスのオプションに--daemonize
を追加しています。これは本質的に上記の方法よりも安定性が低くなります。
[〜#〜] update [〜#〜]私はこのソリューションに100%満足していません。数日実行した後、プロセスにはまだ大量のスワップが残っていることに気付きました。 /proc/XXXX/smaps
を調べると、次のことに注意してください。
memlock
オプションが壊れていることを示しています。この場合、MySQLはスタックをmemlockできないため、それほど重要ではありません。非常に珍しい状況を除いて、この質問をすることはあなたが間違っている(tm)ことを意味します。
真剣に、もしLinuxがスワップしたいと思っていて、あなたがプロセスをメモリに保持しようとしているなら、あなたはOSに不当な要求をしているのです。アプリがそれほど重要である場合は、1)メモリを追加購入する、2)マシンから他のアプリ/デーモンを削除する、またはマシンをアプリ専用にする、および/または3)非常に高速なディスクサブシステムに投資する。これらの手順は、重要なアプリにとって合理的です。それらを正当化できない場合は、おそらくメモリの配線と他のプロセスの枯渇も正当化できません。
なぜこれをしたいのですか?
このアプリのパフォーマンスを向上させようとしている場合は、おそらく間違った方向に進んでいます。 OSはディスクキャッシュ用のメモリを増やすためにプロセスをスワップアウトします-空きRAMがある場合でも、カーネルは最もよく知っています(実際にスケジューラを書いたsamrtの人が最もよく知っています)。
応答性が必要なプロセスがある場合(使用されていないときにスワップアウトされ、すぐに再起動する必要がある場合)、優先順位を高くする、mlockする、またはリアルタイムカーネルを使用すると役立つ場合があります。