このメモリの問題を適切に解決するにはどうすればよいですか?


10

私は標準のLinux(Debianテスト)ラップトップとスワップパーティションを持っています。

私はそれで多くの実験をしています。それらのいくつかは本当にメモリを大量に消費し、Linuxがデフォルトでどのように動作するかは私にとって問題です...愚かな例を挙げましょう:

  1. ノートパソコンの前に座る
  2. ターミナルを開く
  3. 入力しpythonた後、a = [0]*100000000

この大きなリストを処理するための十分なRAMがない可能性が高くなっています。LinuxがRAMを埋め、次にスワップを行い、数分後にOOMキラーがトリガーされ、(ほぼ)ランダムなサービスが強制終了されます。うまくいけば、Ctrl + Cを押すpythonと、ターミナルがまだフォーカスがあったので、コンピュータは再び反応するようになります。

いくつかのメモリ制限を適用して、不要なスワッピングを回避し、(RAMに)持っているよりも多くのメモリを割り当てる権利をプロセスに拒否したいと思います。メモリ要求が特定の制限を下回っている場合、またはrootから要求された場合は、root以外のユーザーのメモリを最も消費しているプロセスを強制終了します。

ulimit -Sv [mem] 後ろで聞く!

ホーホー!「cgroups経由で使用してくださいcgexec!」誰かが最初の行で言う!

はい、そうです。これらは確かに非常に優れたソリューションです。だが:

  • システム全体には適用されません
  • 制限はプロセスごとに設定されます
  • 制限は静的であり、実際の空きRAM量を無視します(AFAIK)
  • ここそこに、彼らが言うこれらは本当にハード制限を強制するための良い解決策ではありません。

カーネルが言うことは、「あなたはユーザーfoo(rootではなく)に属しています。大量のメモリを使用しているので、メモリが足りなくなります。ごめんなさい...今すぐ死にます!」

または:「一体何をしているのですか?x MB が必要で、y MB しか利用できません。はい、SWAPは空ですが、SWAPを使用してダーティな作業を行うつもりはありませんか?いいえ、私はいいえと言った!記憶はない!主張すれば死ぬぞ!」


2
この記事では、OOMキラーが正しいプロセスを選択するのに役立つアルゴリズムを既に説明しいます。変更/proc/sys/vm/overcommit_memoryすると、メモリ不足時のカーネルの動作に影響します。
jofel 2013

1
はい。ただし、overcommit_memory特殊ファイルはRAM + SWAPを使用可能なメモリとして使用します。私はまだスワップします:)

1
また、これがこれと重複していないことを説明する必要があります。unix.stackexchange.com / questions / 34334 / これは、WRT cgroupと個々のユーザーと矛盾します。PS。入れ替えたくない場合は、swapを無効にします。
goldilocks 2013

1
入れ替えたい!休止状態にしたい、未使用のバイトを保存したい!しかし、使用済みのバイトをそこに格納したくありません。リンクについて、ulimitsほとんどどこでも示したように、それはプロセスあたりの制限ですので、悪い考えです...私はあなたが知っている:)についてフォークcgroupsも私は私のラップトップについて話しているが、I:、これは間違いなく良いですが、より一般的な何かが欠けています私たちが共有する「計算」サーバーを所有しています。このようなユーザーごとの制限を適用すると、最悪の場合のシナリオによって制限されますか?

1
cgroupsは、ユーザーが決定したすべてのプロセスに適用されます。ユーザーのすべてのプロセスを別のグループに入れれば、必要な処理を実行できます。
peterph 2013

回答:


4

誰かがあなたの声で提案しましたcgroups。まあ、それはあなたを提供することができるので、その方向を模索してみてください:

  • 選択したタスクのグループに適用されます(したがって、システム全体ではなく、プロセスごとにも適用されません)
  • グループに制限が設定されています
  • 制限は静的です
  • 彼らはメモリおよび/またはメモリ+スワップにハード制限を強制することができます

そのような何かはあなたをあなたの目標に近づけることができます

group limited {
  memory {
    memory.limit_in_bytes = 50M;
    memory.memsw.limit_in_bytes = 50M;
  }
}

これは、このcgroupの下のタスクが最大50Mのメモリのみと50Mのメモリ+スワップを使用できることを示しているため、メモリがいっぱいの場合はスワップされませんが、メモリがいっぱいではなく、一部のデータがマッピングされる可能性がありますスワップ、これは許可される可能性があります。

以下は、cgroupのメモリのドキュメントからの抜粋です。

memsw制限を使用することにより、スワップ不足が原因で発生する可能性があるシステムOOMを回避できます。


それでも、私が期待していたこととまったく同じではありません。しかし、私が期待することと現実との違いはしばしばかなり大きいです:)この場合、私はovercommit_memoryカーネル変数のようなものを見逃さないようにしたかったのです。皆さん、ありがとうございました。

0

同じ問題が頻繁に発生します。私の一般的なワークフローには、MATLABでの重い計算が含まれます。ときどき、利用可能なメモリの量を超える新しい変数を割り当てようとすることがあります。システムがハングし、通常は、マシンをハードリブートして動作させる必要があります。:P

私の場合、あなたのようにも聞こえますが、MATLABが使用するメモリの量を静的な量に制限することにはそれほど関心がありませんでした。マシンがフリーズしないことに興味があり、MATLABプロセスを犠牲にしたいと思っていましたシステムの応答性を維持するため。

この投稿への応答に触発されて、私は次のスクリプトを書きました(私はそれをwatch_memory.shと呼びました)。

#!/bin/bash

MONITOR=$(free | grep 'buffers/cache:')
MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')

MEM_PERC=$(( 100*MEM_USED / (MEM_FREE+MEM_USED) ))

while :; do
    if [ "$MEM_PERC" -gt "95" ]
    then
        kill $1
        echo "$1 killed for using too much memory."
        exit
    fi
    sleep 1

    MONITOR=$(free | grep 'buffers/cache:')
    MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
    MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')
    MEM_PERC=$(( 100*MEM_USED / (MEM_FREE+MEM_USED) ))
done

このスクリプトは、空きメモリの割合を毎秒チェックします。システムが不足すると、「スクリプトゴート」pid(スクリプトへの引数として渡される)が強​​制終了されます。

スクリプトの優先度(素晴らしさ)を調整せずに、スケープゴートが殺されるまでに約10〜20秒かかりましたが、それでも機能しました。負の優先順位でスクリプトを実行すると、違反後に即座に強制終了されました(この例の11916は、メモリが不足した場合に強制終了するpidです)。

sudo nice -n -5 bash watch_memory.sh 11916
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.