问题描述

启用 CPU 频率调节器时,LSF 作业可能运行时间比直接在机器上执行要长。例如,一个 CPU 密集型应用作为 LSF 作业可能运行 6 天,但直接在主机上运行只需 3 天。

根本原因

某些 CPU 频率调节器在调整处理器时钟速度时,不考虑调用了 nice() 的进程。而 LSF 的默认行为是所有作业都会调用 nice(),导致作业运行时间变长。

受影响的 CPU 频率调节器

调节器 特性
Ondemand / Conservative 有一个 ignore_nice_load 参数控制是否计入 nice 进程
Userspace (如 cpuspeed) 可配置是否将 niced 程序视为空闲时间

ignore_nice_load 参数

行为
0 所有进程都计入 CPU 利用率值(默认)
1 nice 进程不计入整体使用率计算,被忽略

解决方案

根据不同场景选择合适的优化策略:

场景一:追求高性能和作业吞吐量

方法1:禁用队列的 NICE 值

从队列配置中移除 NICE 参数:

1
2
3
4
5
# lsb.queues 中
Begin Queue
QUEUE_NAME = normal
# 移除 NICE = xx 行
End Queue

LSF 作业将作为普通进程在执行主机上运行,即使 CPU 频率调节器配置为忽略 nice 进程,作业也将正常影响 CPU 频率。

方法2:让调节器考虑 nice 进程

对于 OndemandConservative 调节器:

1
2
3
4
5
6
7
# 设置 ignore_nice_load 为 0
echo 0 > /sys/devices/system/cpu/cpuX/cpufreq/ondemand/ignore_nice_load

# 或对于每个 CPU
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/ondemand/ignore_nice_load; do
    echo 0 > $cpu
done

对于 Userspace 调节器(如 cpuspeed):

1
cpuspeed -n

此选项禁用”将 niced 程序视为空闲时间”的功能。

场景二:追求节能

设置 CPU 频率调节器忽略 nice 进程,并在队列中配置 NICE 值:

1
2
3
4
5
# lsb.queues 中
Begin Queue
QUEUE_NAME = normal
NICE = 20
End Queue

同时配置 ignore_nice_load=1

1
echo 1 > /sys/devices/system/cpu/cpuX/cpufreq/ondemand/ignore_nice_load

场景三:平衡性能与节能

配合使用 LSF 的自动 CPU 频率选择功能,根据作业需求动态调整 CPU 频率。

详见 Automatic CPU frequency selection

配置对比

目标 队列 NICE ignore_nice_load 效果
最高性能 移除 任意 作业运行最快
最高性能 保留 0 nice 进程也提升 CPU 频率
节能优先 设置 1 作业运行慢但节省电力
平衡 设置 配合自动选择 按需调整频率

验证方法

检查当前 CPU 频率调节器

1
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

检查 ignore_nice_load 设置

1
cat /sys/devices/system/cpu/cpu0/cpufreq/ondemand/ignore_nice_load

查看队列 NICE 配置

1
bqueues -l <queue_name> | grep NICE

参考资料

  1. IBM Documentation - Optimizing job processing with CPU frequency governors
  2. Linux Kernel CPU Frequency Governors
  3. IBM Documentation - Automatic CPU frequency selection