7

cgroups ルールを特定のユーザーに適用しました。上記のユーザーから実行されているプログラムのメモリが期待どおりに制限されているかどうかをテストしたいと思います。次のスクリプトで試しました。

import string
import random

if __name__ == '__main__':
    d = {}
    i = 0;
    for i in range(0, 100000000):
        val = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(200)) # generate ramdom string of size 200
        d[i] = val
        if i % 10000 == 0:
            print i

コマンドでプロセスを監視したpsところ、%MEM が 4.8 に増加し、両方の cgroups サービスがオンでもオフでも変更されないことが判明しました。

$ ps aux | grep mem_intensive.py
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
jason    11531 88.5  4.8 3312972 3191236 pts/0 R+   22:16   0:07 python mem_intensive.py

このシナリオでは、合計メモリは 62 GB であり、その 4.8% で約 3 GB になります。このユーザーで他のプロセスを実行せずに、制限を 4GB に設定しました。

では、この問題のある python スクリプトについて誰か教えていただけないでしょうか? 前もって感謝します。

4

3 に答える 3

2

cgroup が機能するかどうかを確認したい場合は、制限を 100MB に設定してスクリプトを開始してみてください。重要なのは、大きい制限が小さい制限よりもうまく機能するかどうかを確認することではありません。制限が強制されていることを確認したいだけです。そのためには、小さな制限で十分です。

dictが期待どおりに大きくなることを確認するには、次の質問への回答を使用してサイズを出力できます: Python での辞書のメモリ使用量?

于 2015-05-29T07:38:28.870 に答える
0

rangeループが反復するメモリ内のリストをxrange構築し、シーケンスのようにループをフィードするオブジェクトであるジェネレーターを作成しますが、そのシーケンスをメモリ内に構築しません。rangePython ドキュメントを引用するとxrange、短い範囲ではと の間にほとんど違いはありませんが、大きな範囲では大きな違いがあります: https://docs.python.org/2/library/functions.html#xrange

Python 3 では、 によって提供される機能がxrangerange ビルトインのデフォルトになります。この結果と、Python 2 に固有のメモリの利点によりxrange、Python 2 から 3 への互換性レイヤーが内部で Python 2range関数をxrange代わりに呼び出すようにマップするのを見てきました。

于 2015-05-29T02:40:53.010 に答える