调整内核调度参数
简介
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
启动程序时指定优先级:
设置程序运行时的优先级
对于长期执行的备份任务,每次执行都期望它是成功的,所以不会人为停止或 kill 该进程。但又希望备份不影响服务器的性能及其他应用。如果用 nice 19 的值定义备份进程,这意味着系统中的任何进程都将获得更多的优先权,备份进程会继续运行,但不会使系统更加繁忙。
使用以下命令 renice 执行备份的进程,将进程名包含 backup 模式的进程设置为最低优先级:
pgrep 收集了一个 PID 列表,该列表作为 renice 的参数进行管道处理,优先级调整为 19,这使得 backup 进程对系统中实际运行的其他进程更友好。
在系统中重复前面的例子,使用 bc 运行 pi (π)
计算,如 bc 的手册页所示。首先,测试正常执行需要多长时间,然后,通过 renice 执行它。计时如下所示:
在该示例中,结果如下:
执行 renice:
执行结果如下:
有 1 秒的细微差别,但是可以尝试运行更多的进程或添加更多的 0 来增加执行时间,以便观察结果。
ionice
参考文档:https://man7.org/linux/man-pages/man2/ioprio_set.2.html
类似地,ionice 可以调整进程 I/O 操作的优先级 (读、写),仍然以 backup 进程为例,可以运行以下命令:
默认不会输出信息,但可以通过执行以下命令来检查该值:
在本例中,调整了 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 的优先级都最低:
从 systemd 进行配置
> /etc/systemd/system/xxx.service.d/override.conf
[Service]
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7
最高优先级
从命令行启动
从 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。