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

High Kernel CPU when running multiple python programs

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

如何减少高内核 CPU 的使用?

以下是我的一些观察:

编辑: 这是 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       

好像大部分时间都花在打电话_raw_spin_lock_irqsave上了。不过我不知道这意味着什么。

如果内核中存在问题,您应该使用分析器(例如 OProfile 或 perf 缩小问题范围。

即运行 perf record -a -g 然后使用 perf report 读取保存到 perf data 中的分析数据。另见:linux perf: how to interpret and find hotspots.


在你的例子中,CPU 的高使用率是由对 /dev/urandom 的竞争引起的——它只允许一个线程从中读取,但多个 Python 进程正在这样做。

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

$ strace python -c 'import random;
while True:
    random.random()'
open("/dev/urandom", O_RDONLY)     = 4
read(4, "6}"..., 2500) = 2500
close(4)                                   <--- /dev/urandom is closed

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