运行多个python程序时的高内核CPU

Dav*_*ker 14 python linux performance multiprocessing

我开发了一个python程序,可以进行繁重的数值计算.我在具有32个Xeon CPU,64GB RAM和64位Ubuntu 14.04的Linux机器上运行它.我并行启动具有不同模型参数的多个python实例以使用多个进程,而不必担心全局解释器锁(GIL).当我使用监视cpu利用率时htop,我看到所有核心都被使用,但大部分时间都是由内核使用的.通常,内核时间是用户时间的两倍以上.我担心系统级别会有很多开销,但我无法找到原因.

如何降低高内核CPU使用率?

以下是我做的一些观察:

  • 此效果与我是否运行10个作业或50无关.如果作业数少于核心数,则不会使用所有核心,但使用的核仍然具有内核的高CPU使用率
  • 我使用numba实现了内部循环,但问题与此无关,因为删除numba部分无法解决问题
  • 我也认为它可能与使用类似于这个SO问题中提到的问题的 python2 有关但是从python2切换到python3没有太大变化
  • 我测量了OS执行的上下文切换总数,大约是每秒10000次.我不确定这是否是一个很大的数字
  • 我尝试通过设置sys.setcheckinterval(10000)(对于python2)和sys.setswitchinterval(10)(对于python3)增加python时间片,但这没有一个帮助
  • 我尝试通过运行影响任务调度程序,schedtool -B PID但这没有帮助

编辑: 以下是截图htop: 在此输入图像描述

我也跑了perf record -a -g,这是报告perf report -g graph:

Samples: 1M of event 'cycles', Event count (approx.): 1114297095227                                   
-  95.25%          python3  [kernel.kallsyms]                           [k] _raw_spin_lock_irqsave   ?
   - _raw_spin_lock_irqsave                                                                          ?
      - 95.01% extract_buf                                                                           ?
           extract_entropy_user                                                                      ?
           urandom_read                                                                              ?
           vfs_read                                                                                  ?
           sys_read                                                                                  ?
           system_call_fastpath                                                                      ?
           __GI___libc_read                                                                          ?
-   2.06%          python3  [kernel.kallsyms]                           [k] sha_transform            ?
   - sha_transform                                                                                   ?
      - 2.06% extract_buf                                                                            ?
           extract_entropy_user                                                                      ?
           urandom_read                                                                              ?
           vfs_read                                                                                  ?
           sys_read                                                                                  ?
           system_call_fastpath                                                                      ?
           __GI___libc_read                                                                          ?
-   0.74%          python3  [kernel.kallsyms]                           [k] _mix_pool_bytes          ?
   - _mix_pool_bytes                                                                                 ?
      - 0.74% __mix_pool_bytes                                                                       ?
           extract_buf                                                                               ?
           extract_entropy_user                                                                      ?
           urandom_read                                                                              ?
           vfs_read                                                                                  ?
           sys_read                                                                                  ?
           system_call_fastpath                                                                      ?
           __GI___libc_read                                                                          ?
    0.44%          python3  [kernel.kallsyms]                           [k] extract_buf              ?
    0.15%          python3  python3.4                                   [.] 0x000000000004b055       ?
    0.10%          python3  [kernel.kallsyms]                           [k] memset                   ?
    0.09%          python3  [kernel.kallsyms]                           [k] copy_user_generic_string ?
    0.07%          python3  multiarray.cpython-34m-x86_64-linux-gnu.so  [.] 0x00000000000b4134       ?
    0.06%          python3  [kernel.kallsyms]                           [k] _raw_spin_unlock_irqresto?
    0.06%          python3  python3.4                                   [.] PyEval_EvalFrameEx       
Run Code Online (Sandbox Code Playgroud)

似乎大部分时间都花在了呼叫上_raw_spin_lock_irqsave.但我不知道这意味着什么.

mya*_*aut 8

如果内核中存在问题,则应使用诸如OProfile或perf之类的分析器来缩小问题范围.

即运行perf record -a -g并读取保存到perf data使用中的分析数据perf report.另请参阅:linux perf:如何解释和查找热点.


在您的情况下,高CPU使用率是由竞争引起的/dev/urandom- 它只允许一个线程从中读取,但多个Python进程正在这样做.

Python模块random仅将其用于初始化.即:

$ strace python -c 'import random;
while True:
    random.random()'
open("/dev/urandom", O_RDONLY)     = 4
read(4, "\16\36\366\36}"..., 2500) = 2500
close(4)                                   <--- /dev/urandom is closed
Run Code Online (Sandbox Code Playgroud)

您也可以/dev/urandom通过使用os.urandomSystemRandom类明确要求.因此,请检查处理随机数的代码.

  • 非常感谢您的帮助!既然我知道我在寻找什么,我意识到我确实在我的*代码库中有一个错误,我会因为某种原因在每次创建某个基础对象时初始化随机数生成器.我只能在一些旧代码中找到那个部分,因为我确切地知道我在寻找什么!我会尽快接受你的回答. (2认同)