特定のプログラムがスワップするのを防ぐ方法は?


23

特定のプログラム(つまりrhythmboxとその依存関係)がディスクにスワップするのを防ぐことはできますか?

Chromiumがメモリを使いすぎると音楽プレーヤーがしゃっくりするときに問題があるので、私は尋ねています。これを回避する方法はありますか?これはもうWindowsの問題ではないので、おそらく方法があります。


おてんば娘にも同じ問題があります。これは、一部の人々がGNoteに切り替えた理由の1つです。
クリスチャンシウピトゥ

1
しゃっくりの問題は必ずしもスワッピングが原因ではないと思います。プログラムが何かを再生している場合、Linuxはこれに気づき、スワップするべきではありません。あまり役に立たないプログラムが最初に交換されます。あなたが実行したpstoprhytmboxが本当に確認することでスワップされるかどうかを確認するためにRSS/のRESフィールドを?あなたの問題は主に不適切なスケジューリングが原因だと思います。renicerhytmboxプロセスを試すか、オーディオバッファーのサイズなどの設定を変更する必要があります。
クリスチャン・シウピトゥ

1
ありがとう!プログラムの初期nice値を設定する方法はありますか?/ etc / nicetabまたは何か?:)
アレクセイアヴェルチェンコ

回答:


10

しゃっくりの問題は必ずしもスワッピングが原因ではないと思います。プログラムが何かを再生している場合、Linuxはこれに気づき、スワップするべきではありません。あまり役に立たないプログラムが最初に交換されます。プログラムが実際にスワップされているかどうかは、psまたはtopからRSS/ RESフィールドを調べることで確認できます。常駐セットサイズ、タスクが使用しているスワップされていない物理メモリ(キロバイト単位)です。RSS

あなたの問題は、おそらく不適切なCPUとI / Oスケジューリングと、Rhythmboxのわずかな非効率性が原因であると思います。CPUの優先順位は、コマンドniceおよびreniceを使用して変更できます。I / O優先度は、ioniceコマンドで変更できます。スーパーユーザーのみが高い優先度を使用できます。また、Linuxカーネルの担当者は、さまざまな低遅延パッチを使用してデスクトップシステムの応答性を改善しようとしていることを知っておく必要があります。それらの1つは、Min Galbraithによって書かれた〜200行のパッチで、 Linusにも感銘を与えています。このパッチの代替は、Lennart Poetteringのcgroupsトリックです これがFedora 15のデフォルトになると思います。

とにかく、それらのパッチなしで2つのオプションがあります:優先度を高くしてプログラムを開始するか、後でそれを変更します。最初のオプションでは、Rhythmboxのラッパースクリプトを使用できます。

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

ルートとして実行する必要があります。これを開始するためだけにrootとしてログインしたくない場合は、suまたはのいずれかを使用できますsudo

後で優先度を変更することに関して、あなたがそれを変更するためにrootとしてログインするのが面倒なら、5分ごとに実行し、rhythmboxプロセスの優先度を設定するcronジョブを使用してみることができますが、これを行うことはお勧めしません:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`

5

簡単な答え:できないし、すべきではない。

昔、実行可能ファイル+tはカーネルにスワップしないように指示するスティッキービットを尊重していましたが、今日では無視されます。

カーネルがスワップする必要があると判断した場合、正当な理由があります。Linuxは、アイドル状態のRAMが無駄なリソースであるため、メモリの使用に非常に積極的です。

本当にスワップしたくない場合は、RAMを増やすか、または単に# swapoff -a(推奨されていないが、既に問題がある場合はシステムが使用できなくなる可能性があります)。

Shouldn'tアプリを開発しているときに、まったく交換したくないときに使用します。見てみましょうstackoverflowの上でこのポストを


2
約100 MiBを予約してもシステムが停止するとは思わない。私の特定の問題を解決する別の方法があるかもしれません(編集された質問を参照)?
アレクセイアヴェルチェンコ

1
他のプロセスよりも高いレベルの応答性でプロセスを維持する場合、答えは素晴らしいです(これを行うにはルートである必要があります)。手を汚したくない場合は、メモリページングをいじるのは簡単ではありません(コードをタッチ、再コンパイル、またはカスタムライブラリをLD_PRELOADしてプロセスを欺き、メモリの割り当てに使用する関数を微調整します-推奨されません) 。助言 ?プロセスを
放棄

5
「カーネルがスワップする必要があると判断した場合、正当な理由があります」とは言えません。今日、1,3Gの空きメモリがありました。Linuxカーネルは、httpdプロセスをスワッピング(370M)にしました。
bluszcz

@bluszcz(まあ、そのコメントがどれだけ古いかを読んでいる人):それは、httpdによって提供されるファイルのディスクキャッシュが、httpd自体のめったに使用されない部分よりも重要であると判断したためかもしれません-他の回答を参照してください「swappiness」に言及します。
ヤンシェイバル

@JanSchejbalそれは、少なくとも誰かがそれを告げない限り、Linuxはどのプロセスが重要であるかを知らないからです。サーバー環境では、重要なプロセスとそうでないプロセスをシステムに伝えることができるはずです。「他のことは気にしませんが、これらのプロセスはこのサーバーの操作にとって最も重要です」
-Rahly


3

それにはいくつかの方法があります。試してみることができるのは、swapでの Linuxの動作の「言い回し」です(一般的に):

echo 10 > /proc/sys/vm/swappiness

From:https : //www.kernel.org/doc/Documentation/sysctl/vm.txt

スワップピネス

このコントロールは、カーネルがメモリページをどれだけ積極的にスワップするかを定義するために使用されます。値を大きくすると攻撃性が高まり、値を小さくするとスワップの量が減ります。

デフォルト値は60です。

他のオプションはcgroupsカーネルマネージャーを使用することです。これはプロセスごとに固有ですが、「作業」を行う必要があります。回答:https ://unix.stackexchange.com/questions/10214/per-process-swapiness-for -linux#10227


1
これは、プロセス固有ではなく、スワップ性にグローバルに影響します。
ロレンツォフォンマッターホルン

1
はい、「(一般的に)」に書いたことに気づくでしょう。プロセスごとのオプションは、cgroupを使用した他の回答へのリンクです。
ceinmart

それでは助けにはなりませんか?
ケンシャープ

Ken Sharp:この答えは、問題の最良の解決策と思われる(少なくとも一見)に直接リンクしている唯一の回答です。だから...あなたが言ったことのほとんど反対です。
phils

@philsこれがどのように機能するかわかりません。
ケンシャープ

0

mlockall()syscall を使用できます。mlockall()は、メモリプロセスを強制的に常駐させます(=スワップなし、オーバーコミットなしなど)。私の知る限り、それを行うためのシェルコマンドはありませんが、簡単に作成できます。次のようになります。

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

注:を呼び出すには、rootになる必要がありますmlockall()

しかし、他の答えで述べたように、私はそれが本当にあなたが望むものだとは思わない。


1
execvpはexecveのフロントエンドであり、mlockallを取り消すため、コードはまったく機能しません。mlockのマンページの「メモ」セクションを参照してください。
ヨハネス・マトキッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.