问题描述
启用 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 进程
对于 Ondemand 和 Conservative 调节器:
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