質問

次の問題は、2.6.32-22-GenericカーネルでUbuntu 10.04を実行しているマシンで発生します。プロセスの常駐セットサイズ(RSS)の制限を設定しても効果はないようです。現在、次のコードでPythonで制限を設定しました。

import resource
# (100, 100) is the (soft, hard) limit. ~100kb.
resource.setrlimit(resource.RLIMIT_RSS, (100, 100))
memory_sink = ['a']*10000000   # this should fail

リスト、Memory_sinkは、毎回成功します。 RSSの使用量をTOPで確認すると、1GBのRAMを使用するプロセスを簡単に取得できます。つまり、制限が機能していません。 RSSは、このカーネルやディストリビューションでは機能しませんか?それが役立つ場合、resource.rlimit_nproc(ユーザープロセス制限)が機能します。

役に立ちましたか?

解決

getrlimitマンページを形成します:

RLIMIT_RSS
Specifies the limit (in pages) of  the  process's  resident  set
(the  number of virtual pages resident in RAM).  This limit only
has effect in Linux 2.4.x, x < 30, and there only affects  calls
to madvise(2) specifying MADV_WILLNEED.

これはLinuxカーネル2.6ではサポートされていないようです。

他のヒント

これをCGROUPSを使用して達成できます。長いバージョンが私にあります ブログ, 、しかし、短いバージョン(Ubuntu 11.04でテスト)は次のとおりです。

  • インストールします cgroup-bin パッケージ。

  • 編集 /etc/cgconfig.config メモリが限られているグループを作成します。たとえば、次のように付け加えました。

    group limited {
      memory {
        memory.limit_in_bytes = 50M;
      }
    }
    
  • 走る

    $ sudo restart cgconfig
    $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited
    $ cgexec -g memory:limited your/program
    

93mのRSSでプロセスを観察しましたが、50mしか使用しないように頼んだのですが、それは私にとって問題ではありませんでした。

cgclassify ランニングプロセスにも制限を添付できます。 RSSの注これは、制限が有効になった後に割り当てられたメモリにのみ適用されます。

関連する制限 - 仮想メモリまたはアドレス空間(rlimit_as) - 機能します。これにより、外部ツールなしでPythonプロセスとサブプロセスメモリを制限できます。

>>> size = 50*1024*1024 # In bytes
>>> resource.setrlimit(resource.RLIMIT_AS, (size, resource.RLIM_INFINITY))
>>> a = 'a' * size
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

から 男ページ:

rlimit_as. 。プロセスの仮想メモリ(アドレススペース)の最大サイズはバイトです。

これは、居住者セットとVMサイズの違いの良い説明です - Linuxメモリ管理におけるRSSとVSZとは何ですか.

CGROUPSとCGROUP Managerを使用してメモリ使用量を制限するスクリプトを作成しました。これは、アドホックコマンドに使用できる、ルート特権を必要としません。見る https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-aprocess-and-its-children/174894#174894

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top