2009-02-23 14 views
36

Linuxに特定のプロセスのメモリをディスクにスワップするべきではないと伝える方法はありますか?Linuxに特定のプロセスのメモリをスワップしないように伝えることはできますか?

それはJavaアプリケーションなので、理想的には私はコマンドラインからこれを行う方法を期待しています。

グローバルスワップを0に設定することはできますが、これは賢明ですか?

+0

あなたがアプリで「chmod + S」を実行した場合、Unixは「スティッキービット」を尊敬していましたが、それ以上は機能しないと思います。 –

+1

申し訳ありませんが、私は "chmod + t"を意味しますが、私はちょうど見て、Linuxはスティッキービットを無視します。 –

+0

http://blogs.msdn.com/b/oldnewthing/archive/2005/06/07/426294.aspx – Hello71

答えて

22

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

あなたは本当にコア全体を引き出す必要がありますか?それがJavaアプリなら、おそらくJVM全体をコアでロックするでしょう。私はこれを行うためのコマンドラインの方法はわかりませんが、forkを呼び出すには、mlockall、次にexecと呼ぶ簡単なプログラムを書くことができます。

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

今のところSunOSのもとで、vadvise(2)というmadviseに似たメカニズムがありました。

+0

@sanityこれを試しましたか?どのようにあなたのために働いたのですか?私は似たようなことをやっていた。 –

+6

["メモリロックはfork(2)によって作成された子によって継承されず、execve(2)の間、またはプロセスが終了すると自動的に削除されます(ロックされません)。]] [http://www.kernel.org/doc /man-pages/online/pages/man2/mlock.2.html) - fork/mlock/execのアプローチはうまくいきません。 – Mat

+0

@Matは正しいようです... OK ...何かを書くことのようなものmlockallを呼び出すJNI経由ですか?しかし、それはかなりハックを感じ始める... –

2

これは、mlockファミリーのシステムコールで実行できます。しかし、あなたが別のプロセスのためにそれを行うことができるかどうかはわかりません。

+0

私はシステムメモリのどれくらいがロックされているかには注意が必要です。私はあなたが慎重でないならば、あなたがゴミ箱を通ってシステムをダウンさせることができると思う。 –

2

スーパーユーザーでは、最高の優先度レベル-20にすることができますし、スワップアウトされないようにすることができます。それは通常です。正の数はスケジューリング優先度を下げます。

+3

私が間違っていない限り、これはメインメモリ使用の傾向ではなく、プロセスが与えられたCPU時間にのみ影響します。 – intuited

+3

@intuited:彼は、VMサブシステムはプロセスがどれほど重要であるかを判断し、それをスワップしないように 'nice '値を調べることを意味すると考えています。妥当な音。しかし、Linuxがこれを実際に行っているかどうかはわかりません。 – sleske

+0

'ionice'もここで役に立つかもしれません。 – fread2281

2

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

Linuxがスワップしたいときに、プロセスをメモリに保存しようとすると、OSに不合理な要求が生じます。あなたのアプリがそれほど重要であれば、1)より多くのメモリを購入する、2)マシンから他のアプリケーション/デーモンを削除する、またはマシンをアプリに専用にする、そして/または3)本当に高速なディスクサブシステムに投資する。これらの手順は重要なアプリにとって合理的です。あなたがそれらを正当化できない場合は、おそらく配線メモリと他のプロセスの飢えを正当化することはできません。

+26

暗号化に関連している場合は、メモリにとどまりたいと思うのは全く妥当です。例えば、gnome-keyringは、重要な部分をスワップから守るためにかなりのステップを必要とします。 (それ以外は、合理的な観察。) –

+1

良い点、ポール。私はこれが異常な状況に該当すると感じています。 – dwc

+2

すべての強力な暗号化要件を備えたバンキングおよびペイメントカード業界ではかなり一般的です。 –

1

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

2

は、アプリケーションのクラスが存在しているあなたがそれらを入れ替えたいことはありません。そのようなクラスの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を調べると、次のことに気付きます。

  • スワップの最大の寄付者はスタックセグメントです! 437 MBと変動します。これは明白なパフォーマンス上の問題です。また、スタックベースのメモリリークを示します。
  • ゼロのロックされたページがあります。これは、MySQL(またはLinux)のmemlockオプションが壊れていることを示しています。この場合、MySQLはスタックをロックすることができないため、大したことはありません。
関連する問題