跳转至

调整内核调度参数

简介

Linux 内核具有高度可配置性,有一套完整的体系调整内核行为:作用于进程、网卡、磁盘、内存等。

最常见的调整项是 nice 进程值和 I/O 优先级,它们分别调整进程 CPU 和 I/O 时间的优先级。可以使用 nice 和 ionice 在创建进程时设置该值。

nice

要理解 nice 值,首先要说明一下优先级的概念,先来看一下进程的信息:

F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root           1       0  0  80   0 - 43565 ep_pol 2月14 ?       00:01:09 /usr/lib/systemd/systemd rhgb --system --deserialize 26
1 S root           2       0  0  80   0 -     0 kthrea 2月14 ?       00:00:06 [kthreadd]
  • PRI 指进程优先级,优先级小的进程会获得比较多的 CPU 时间,程序就会被优先处理
  • NI 即为 nice 值
  • 两者关系为 :PRI(new) = PRI(default) + nice

对于 nice 来说,进程可以从 -20 到 +19,0 是标准值,-20 表示最高优先级,19 表示最低优先级。也就是说,数值越大,该进程在与其他进程抢占资源时,表现的越 "好"、越谦让。

nice 用于进程启动前,renice 用于进程启动后重新调整进程的优先级。

设置程序启动时的优先级

nice 只有一个参数:-n 启动程序时指定优先级:

nice -n -20  /opt/backup.sh  # 优先级最高
nice -n 19  /opt/backup.sh   # 优先级最低

设置程序运行时的优先级

对于长期执行的备份任务,每次执行都期望它是成功的,所以不会人为停止或 kill 该进程。但又希望备份不影响服务器的性能及其他应用。如果用 nice 19 的值定义备份进程,这意味着系统中的任何进程都将获得更多的优先权,备份进程会继续运行,但不会使系统更加繁忙。

使用以下命令 renice 执行备份的进程,将进程名包含 backup 模式的进程设置为最低优先级:

pgrep -f backup | xargs renice -n 19

pgrep 收集了一个 PID 列表,该列表作为 renice 的参数进行管道处理,优先级调整为 19,这使得 backup 进程对系统中实际运行的其他进程更友好。

在系统中重复前面的例子,使用 bc 运行 pi (π) 计算,如 bc 的手册页所示。首先,测试正常执行需要多长时间,然后,通过 renice 执行它。计时如下所示:

time echo "scale=10000; 4*a(1)" | bc -l

在该示例中,结果如下:

real    2m0.824s
user    2m0.274s
sys 0m0.007s

执行 renice:

time echo "scale=10000; 4*a(1)" | bc -l & 
pgrep -f bc |xargs renice -n 19; fg

执行结果如下:

real    2m1.833s
user    2m1.116s
sys 0m0.006s

有 1 秒的细微差别,但是可以尝试运行更多的进程或添加更多的 0 来增加执行时间,以便观察结果。

ionice

参考文档:https://man7.org/linux/man-pages/man2/ioprio_set.2.html

类似地,ionice 可以调整进程 I/O 操作的优先级 (读、写),仍然以 backup 进程为例,可以运行以下命令:

pgrep -f backup | xargs ionice -c 3 -p

默认不会输出信息,但可以通过执行以下命令来检查该值:

pgrep -f backup | xargs ionice -p

在本例中,调整了 backup 进程,在系统空闲时处理 I/O 请求。

-c 参数指定的类可以是下面的其中一个:

  • 0:none 即 Best Effort,进程未指定策略和优先级时显示为 none,会使用依据 cpu nice 设置计算出优先级
  • 1:realtime 立即访问磁盘,无视其它进程 IO
  • 2:best-effort 缺省调度策略,可以设置 0-7 的优先级,数值越小优先级越高,同优先级的进程采用 round-robin 算法调度;
  • 3:idele 其他进程没有磁盘 IO 时,才进行磁盘 IO

-p 参数用来指定要操作的进程。

限制优先级

最低优先级

为了对生产环境造成影响最小,设置备份脚本运行时,cpu 和磁盘 io 的优先级都最低:

nice -n 19 ionice -c2 -n7  /bin/sh /opt/backup.sh

从 systemd 进行配置

> /etc/systemd/system/xxx.service.d/override.conf

[Service]
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7

最高优先级

从命令行启动

nice -n -20 ionice -c1 /bin/sh /opt/backup.sh

从 systemd 进行配置

> /etc/systemd/system/xxx.service.d/override.conf

[Service]
Nice=-20
IOSchedulingClass=realtime
IOSchedulingPriority=0

其他进程管理参数

系统的大部分设置通过 /proc/ 虚拟文件系统应用于每个 PID,例如,调整 oom_score_adj 文件以减少 oom_score 文件中显示的数值,这最终决定了当 OOM 不得不杀死某些进程以尝试将系统从灾难中恢复时,该进程是否在列表中处于较高的位置。

当然,还有一些系统级的设置,比如 /proc/sys/vm/panic_on_oom,可以调整系统在不得不调用 OOM 的情况下的反应 (恐慌或不恐慌)。

磁盘也有一个定义正在使用的调度程序的设置。例如,对于名为 sda 的磁盘,可以通过 cat /sys/block/sda/queue/scheduler 查看。

磁盘使用的调度器有不同的方法,取决于内核版本。例如,在 CentOS 7 中使用过的 noop、deadline 或者 cfq,在 CentOS/Rocky 8 被删除了,并使用了 md-deadline、bfq、kyber,以及 none。