19

2.6.32-22-generic カーネルを使用して Ubuntu 10.04 を実行しているマシンで、次の問題が発生します。プロセスの Resident Set Size (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 は毎回成功します。top で RSS の使用状況を確認すると、プロセスが 1 GB の RAM を使用するように簡単に取得できます。これは、制限が機能していないことを意味します。RSS 制限はこのカーネルまたはディストリビューションでは機能しませんか? それが役立つ場合、resource.RLIMIT_NPROC (ユーザー プロセス制限) は機能します。

4

4 に答える 4

21

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

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

  • /etc/cgconfig.configメモリが制限されたグループを編集および作成します。たとえば、次のように追加しました。

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

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

プロセスに 50M のみを使用するように依頼したところ、RSS が 93M であることがわかりましたが、それは問題ではありませんでした。私の目標は、プログラムをページに移動させることだけだったからです。

cgclassify実行中のプロセスにも制限を加えることができます。RSS の場合、これは制限が有効になった後に割り当てられたメモリにのみ適用されることに注意してください。

于 2011-06-15T23:13:08.997 に答える
15

マン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 ではサポートされていないようです。

于 2010-06-15T08:53:19.580 に答える
3

関連する制限 - 仮想メモリまたはアドレス空間 (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。プロセスの仮想メモリ (アドレス空間) の最大サイズ (バイト単位)。

Resident Set と VM サイズの違いについては、Linux メモリ管理における RSS と VSZ とは何ですか

于 2015-11-04T15:04:41.487 に答える
1

cgroups と cgroup manager を使用してメモリ使用量を制限するスクリプトを作成しました。アドホック コマンドに使用でき、root 権限は必要ありません。https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894を参照してください

于 2014-12-18T17:07:04.293 に答える