【问题标题】:How to implement a memory intensive python script for test如何实现内存密集型python脚本进行测试
【发布时间】:2015-05-28 14:21:39
【问题描述】:

我已将 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

在这种情况下,总内存为 62GB,因此其中 4.8% 约为 3GB。我将限制设置为 4GB,此用户上没有运行任何其他进程。

那么谁能给我一些关于这个有问题的python脚本的想法?提前致谢。

【问题讨论】:

  • 您的 range(0, 100000000) 是否使用生成器?如果 Python 3 应该已经是生成器,则可以在 Python 2.7 中尝试使用 xrange。只是一个想法,在内存中构建这么大的范围可能是问题的一部分。
  • scipt 结束了吗?也许只是尝试一个无限循环?
  • 当我从range 更改为xrange 时,%mem 没有增长(或者速度很慢),请您解释一下原因吗? @PaulJoireman
  • 看看这个问题stackoverflow.com/questions/6317818/…。我把val = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(200))改成了val = ''.join(random.choice(string.ascii_uppercase + string.digits)) * 1024000,内存成功跨过4G
  • 您更改了哪些 cgroups 参数,您想在脚本中测试哪些方面?

标签: python memory cgroups


【解决方案1】:

我对您的脚本进行了一些尝试,它一直在增长,尽管速度很慢。瓶颈是使用random.choice。如果你想快速填满内存,生成随机性对你不利。因此,仅使用固定字符串确实会很快耗尽内存。如果使用以下内容,同时想观察它是如何增长的,您可能会在您的print 之后抛出一个time.sleep()

if __name__ == '__main__':
    d = {}
    i = 0;
    for i in range(0, 100000000):
        d[i] = 'A'*1024
        if i % 10000 == 0:
            print(i)

更快地填充内存:

只是一条线:

['A'*1024 for _ in xrange(0, 1024*1024*1024)]

【讨论】:

    【解决方案2】:

    如果您想查看 cgroup 是否有效,只需将限制设置为 100MB 并尝试启动脚本即可。关键不是要查看大限制是否比小限制更好或更差 - 您只是想确保执行限制。为此,一个小的限制就足够了。

    为确保dict 按预期增长,您可以使用以下问题的答案打印其大小:Memory-usage of dictionary in Python?

    【讨论】:

      【解决方案3】:

      range 在内存中构造一个列表,然后循环遍历该列表,xrange 创建一个生成器,该生成器是一个对象,它像序列一样为循环提供数据,但不会在内存中构建该序列。 rangexrange 对于短距离而言几乎没有区别,但对于大范围而言差异很大,引用 Python 文档:https://docs.python.org/2/library/functions.html#xrange

      在 Python 3 中,xrange 提供的功能成为内置范围的默认设置。因此,以及 xrange 在 Python 2 中固有的内存优势,我已经看到 Python 2 到 3 兼容层映射 Python 2 range 函数以调用 xrange,而不是在引擎盖下。

      【讨论】:

      • 没关系,因为他将结果具体化为 200 个字符的字符串,然后将它们放入地图中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多