web-dev-qa-db-ja.com

マウス/キーボード/ターミナル/ ctrl-cを優先し、プログラムがLinuxシステムをフリーズしないようにします

はい、これは幅広い質問ですが、私はかなり有効な質問だと思います。プログラムやスクリプトに時間がかかりすぎたり、メモリを使いすぎたりして、システムの速度が低下し始めることがあります。結構です。時々、システムの速度が非常に遅くなり、マウスを端末にスライドショーしてスパムを送信することがほとんどできなくなります。 Ctrl+C。 OSが、ユーザーがマウス、キーボードを使用して物事を殺すことができるようにスケジューリングの優先順位を与えない理由について、私は困惑します。これを見たことがありますか?

> ./program
^C^C^C^C^C^C^C^C^C^C^C^Z^Z^Z^C^C^C^C^C^Clsdhafjkasdf

さて、 Ctrl+C 他のいくつかほど厳しくはありません(アプリで処理でき、無視することもできますが、ここではそうではありません)。 Ctrl+Z 私ができるので、仕事もうまくいくでしょうkill -9 %1直後ですが、どちらも機能しません。

別の方法は、仮想コンソールにジャンプすることかもしれません Ctrl+Alt+F2、ログインして問題のアプリを強制終了しますが、システムがビジーであるため、これは機能せず、黒い画面が表示されます。同様に、新しい端末を開くことはできません(ウィンドウはポップアップしますが、シェルにドロップできません)。開いている他の端末は、コマンドに応答または実行しない場合があります。

システムが非常に動作不能である理由の1つは、問題のあるプログラムがスワップにヒットし、より多くのコアアプリをメインメモリからプッシュしていることだと思います。 bashプロンプトを表示したりkillを実行したりする最も単純なコマンドでさえ、エッジウェイでサイクルを取得することはできません。 topが発生したときに実行できないため、この証拠はありません。 オリジナルの可能性を高めるためのオプションはありますか Ctrl+C 動作していますか?。 Xと端末の優先度を上げたり、メモリの大部分を使用したり、スワップしすぎたりするプログラムを自動的に強制終了するという方針に沿ったものでしょうか。

これが発生したときに制御を取り戻すために使用できる他のlinux-fuはありますか(例: SysRq コマンド)?

更新:さらにいくつかのテストを行った後、メモリを使いすぎてスワップをヒットしているアプリであると確信しています。問題のアプリを強制終了した後でも、メインメモリから押し出されたかのように応答を開始するのに非常に長い時間がかかる人もいます。 メモリ使用量の多いプログラムをメインメモリに自動的に制限する方法が本当に必要です。スワップに当たった場合、とにかく遅すぎるので、それを継続させることのポイントは何ですか。

注:私は特定のアプリの解決策を求めているわけではなく、何らかの操作でメモリが消費される時期を事前に知りません。このような減速システムを広く解決したい。つまり多くのプログラムがこれを引き起こします。 AFAIK私はシステム設定をいじっていません、そしてそれはかなり標準的なFedoraインストールです。私はこれらの減速に驚いていませんが、もっとコントロールしたいです。


ウィンドウマネージャーを実行し続けたいのですが、これが避けたい最後の手段です。私は通常、GPUがループに陥ってXをブロックしている場合にのみこれらが必要です。 有効な場合 、 Ctrl+Alt+backspace Xとすべてのアプリを強制終了し、ログインに戻るための便利なショートカットです。より強力なコマンドは、やはり 有効な場合 です。 Alt+SysRq+K。それが機能しない場合は、電源ボタンの時間を押し続けています。


Alt+SysRq+F (ありがとう、@ Hastur)、これはメモリホギングプロセスを強制終了しますが、これは非常に破壊的ですが、最後の手段として役立ちます。更新:ここでのすべての結果を完全に確信しているわけではありませんが、@ Xen2050のulimitの提案は多くの問題を解決しているようです...

TOTAL_PHYSICAL_MEMORY=$(grep MemTotal /proc/meminfo | awk '{print $2}')
ulimit -Sv $(( $TOTAL_PHYSICAL_MEMORY * 4 / 8))

これを私のbashrcに残して、状況がどうなるかを確認します。

更新:大きなライブラリを共有し、大きなファイルをマップするいくつかのアプリを除いて、状況はほとんど良好に見えます。実際のメモリをほとんど消費せず、スワップに頻繁にヒットする可能性は低い場合でも。致命的なスワップヒットアプリを殺すのに十分な数はないようですが、通常のアプリ(4.6gb VIRT amarokなど)は実行したままにしておきます。

関連: https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894 、しかしそれでもスワップを頻繁にヒットし始めるアプリケーションを制限する問題。


これはまさに私が求めている親切な解決策です: OOMキラーを早期に介入させることは可能ですか?

2
jozxyqk

あなたの特定のケースは、利用可能なすべてのCPUを使用するプロセスのようには聞こえません。ディスプレイのように、またはRAMの問題が原因である可能性があります。 RAMの制限は、 cgroups またはulimit/userlimitsのようなもので可能である必要があります。

ただし、一部のプロセスのCPU使用率を制限したい場合は、次のように機能する可能性があります。
CPUで実行されているプロセスが正確にわかっている場合は、cpulimitを使用して速度を落とすことができます。それを下げます。私は、CPUで時々暴走する優先度の低いプロセスで定期的に使用し、うまく機能します。それ:

sIGSTOPおよびSIGCONTシグナルをプロセスに送信して、プロセスが制御できることを確認し、プロセスが消費するCPUの平均量を制限します。これにより、ジョブが停止したことを示す誤解を招く(迷惑な)ジョブ制御メッセージが表示される可能性があります(実際には停止したが、すぐに再開した場合)。これは、SIGSTOP/SIGCONTを検出または依存するインタラクティブシェルで問題を引き起こす可能性もあります。たとえば、ジョブをフォアグラウンドに配置して、すぐに停止してバックグラウンドで再開したことを確認できます。 ( http://bugs.debian.org/55876 も参照してください。)

マニュアルページで実行する例は次のとおりです。

   Assuming you have started `foo --bar` and you find out with  top(1)  or
   ps(1) that this process uses all your CPU time you can either

   # cpulimit -e foo -l 50
          limits  the CPU usage of the process by acting on the executable
          program file (note: the argument "--bar" is omitted)

   # cpulimit -p 1234 -l 50
          limits the CPU usage of the process by acting  on  its  PID,  as
          shown by ps(1)

   # cpulimit -P /usr/bin/foo -l 50
          same as -e but uses the absolute path name
1
Xen2050

「xkill」アプリケーションをインストールして、Ctrl + shift + kなどのキーボードショートカットに「xkill」を割り当てることができます。スクリプトまたはプログラムが遅れる場合は、crtl + shift + kを押して、強制終了するアプリケーションをクリックするだけです。それでおしまい

0