代码之家  ›  专栏  ›  技术社区  ›  Helmut Grohne

通过多处理减少内存占用?

  •  4
  • Helmut Grohne  · 技术社区  · 15 年前

    我的一个应用程序运行大约100个工人。一开始是 threading 应用程序,但性能(延迟)问题受到影响。所以我把那些工人改成 multiprocessing.Process 锿。下面的基准测试表明,减少负载是以消耗更多内存为代价的(因子6)。

    那么,如果Linux使用cow而工作人员不共享任何数据,那么内存使用量究竟来自哪里呢?

    如何减少内存占用?(另一个问题:我如何减少 穿线 ?)

    Linux 2.6.26、4 CPU 2G RAM上的基准: (注意,cpu使用率是以一个cpu的百分比表示的,所以满负载是400%。这些数字是通过查看Munin图得出的。)

                      | threading | multiprocessing
    ------------------+-----------+----------------
    memory usage      | ~0.25GB   | ~1.5GB
    context switches  | ~1.5e4/s  | ~5e2/s
    system cpu usage  | ~30%      | ~3%
    total cpu usage   | ~100%     | ~50%
    load avg          | ~1.5      | ~0.7
    

    背景:应用程序正在处理来自网络的事件,并将其中一些事件存储在MySQL数据库中。

    1 回复  |  直到 15 年前
        1
  •  3
  •   John Montgomery    15 年前

    我的理解是,对于像Python这样的动态语言,按写即复制不如分叉后写入(并因此复制)更多内存那么有效。随着Python解释器在程序中的运行,不仅仅是您的代码。例如,引用计数-由于引用计数需要将引用计数写入内存(触发副本),因此非常快地写入对象。

    考虑到这一点,您可能需要一种混合的线程/处理方法。使用多个进程来利用多个核心等,但是每个进程运行多个线程(这样您就可以处理所需的并发级别)。您只需要测试运行的线程数与进程数。