web-dev-qa-db-ja.com

特定のプロセスのメモリをスワップアウトしないようにLinuxに指示できますか?

特定のプロセスのメモリをディスクにスワップアウトしないようにLinuxに指示する方法はありますか?

そのa Javaアプリなので、理想的にはコマンドラインからこれを行う方法を望んでいます。

グローバルなswappinessを0に設定できることは承知していますが、これは賢明ですか?

44
sanity

Linuxで mlockall(2) システムコールを使用してこれを行うことができます。これはプロセス全体で機能しますが、渡す必要がある引数について読んでください。

本当に全部をコアにプルする必要がありますか? Javaアプリの場合、おそらくJVM全体をコア内でロックします。これを行うためのコマンドラインメソッドはわかりませんが、簡単なプログラムを作成して呼び出すことができますforkmlockall、次にexecを呼び出します。

madvise(2) のアクセスパターン通知の1つがニーズを満たしているかどうかを確認することもできます。より適切なページング戦略についてVMサブシステムに助言することは、それがあなたに当てはまる場合にうまくいくかもしれません。

昔、SunOSのもとでは、madviseに似た vadvise(2) と呼ばれるメカニズムがあったことに注意してください。

25
Thomas Kammeyer

プロセスのswappinessを変更する場合は、それをcgroupに追加し、そのcgroupの値を設定します。

https://unix.stackexchange.com/questions/10214/per-process-swapiness-for-linux#10227

15
Matthew Buckett

スーパーユーザーとして、最高の優先度レベル-20に「ナイス」でき、スワップアウトされないようにするのに十分であることを願っています。それは通常です。正の数は、スケジューリングの優先順位を下げます。通常のユーザーは上向きにナイスすることはできません(負の数)。

2
SumoRunner

mlock ファミリのsyscallsによってこれを行うことができます。ただし、別のプロセスで実行できるかどうかはわかりません。

2
jpalecek

アプリケーションを入れ替えたくないアプリケーションのクラスが存在します。そのようなクラスの1つがデータベースです。データベースはディスク領域のキャッシュとバッファとしてメモリを使用しますが、これらがスワップされることはまったく意味がありません。特定のメモリには、クライアントが要求する1日までの1週間は不要な関連データが含まれている場合があります。キャッシング/スワッピングがなければ、データベースは関連するレコードをディスク上で見つけるだけで、非常に高速になります。ただし、スワッピングを使用すると、サービスの応答に突然長い時間がかかる場合があります。

mysqldには、OS /システムコールmemlockを使用するためのコードが含まれています。 Linuxでは、少なくとも2.6.9以降、このシステムコールは、CAP_IPC_LOCK機能を持つルート以外のプロセスに対して機能します [1]memlock()を使用する場合でも、プロセスはLimitMEMLOCK制限の範囲内で機能する必要があります。 [2]systemdの(いくつかの)良い点の1つは、特別なプログラムを必要とせずに、これらの機能をmysqldプロセスに付与できることです。 ulimitで期待どおりにrlimitsを設定することもできます。以下は、データベースなどのプロセスに必要となる可能性のある他のいくつかを含む、必要な手順を実行するoverridemysqldファイルです。

[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を調べると、次のことに注意してください。

  • スワップの最大の貢献者はスタックセグメントからです! 437 MBおよび変動。これは明らかなパフォーマンスの問題を示します。また、スタックベースのメモリリークを示しています。
  • ゼロのロックされたページがあります。これは、MySQL(またはLinux)のmemlockオプションが壊れていることを示しています。この場合、MySQLはスタックをmemlockできないため、それほど重要ではありません。
2
Otheus

非常に珍しい状況を除いて、この質問をすることはあなたが間違っている(tm)ことを意味します。

真剣に、もしLinuxがスワップしたいと思っていて、あなたがプロセスをメモリに保持しようとしているなら、あなたはOSに不当な要求をしているのです。アプリがそれほど重要である場合は、1)メモリを追加購入する、2)マシンから他のアプリ/デーモンを削除する、またはマシンをアプリ専用にする、および/または3)非常に高速なディスクサブシステムに投資する。これらの手順は、重要なアプリにとって合理的です。それらを正当化できない場合は、おそらくメモリの配線と他のプロセスの枯渇も正当化できません。

1
dwc

なぜこれをしたいのですか?
このアプリのパフォーマンスを向上させようとしている場合は、おそらく間違った方向に進んでいます。 OSはディスクキャッシュ用のメモリを増やすためにプロセスをスワップアウトします-空きRAMがある場合でも、カーネルは最もよく知っています(実際にスケジューラを書いたsamrtの人が最もよく知っています)。
応答性が必要なプロセスがある場合(使用されていないときにスワップアウトされ、すぐに再起動する必要がある場合)、優先順位を高くする、mlockする、またはリアルタイムカーネルを使用すると役立つ場合があります。

1
Martin Beckett