白瑞钧:Oracle ACE Pro,中国 OCM 之家(OCMH)用户组成员;PostgreSQL ACE,PG分会广州用户组负责人;从业 10+ 年,资深 Oracle 数据库专家。在数据库领域有丰富的经验。有丰富的数据库项目管理经验。致力于推广和分享数据库技术。主要工作职责是负责公司 Oracle、MySQL、PostgreSQL 数据库、Greenplum 数据库的运维工作。包括数据库架构方案设计和开发规范制定等。热衷参加各类数据库相关活动。
环境
异常环境:AWS RDS For MySQL8.0
测试环境:Oracle Linux 8.10
异常
这么多的资源都给 nice 用了,那么 nice 究竟是什么,平时为什么我们自己安装的 MySQL 数据库看不到这样的情况?真的像 AWS 反馈那样,就是 MySQL 给消耗了的么?

概念
TOP
hi【Hardware IRQ】:硬中断占用CPU的百分比
PID:进程id
USER:进程所有者
PR:进程优先级
NI:nice 值。负值表示高优先级,正值表示低优先级
%CPU:上次更新到现在的CPU时间占用百分比
%nice(nice/total*100):改变优先级的进程的占用 CPU 的百分比。
实验
那么,nice%,改变个优先级能占用多少 CPU?它到底是如何改变优先级的呢?
创建模拟环境
安装 stress 命令
yum install stress-ng创建两个进程参考博客内容,使用 stress 命令起 2 个进程,对 CPU 制造一些压力
[root@model ~]# stress-ng -c 2 &
[1] 313748
[root@model ~]# stress-ng: info: [313748] defaulting to a 86400 second (1 day, 0.00 secs) run per stressor
stress-ng: info: [313748] dispatching hogs: 2 cpu
# 查看两个 stress 进程,进程号为 313749、313750
[root@model ~]# pstree -Tp $$
bash(279789)─┬─pstree(313751)
└─stress-ng(313748)─┬─stress-ng-cpu(313749)
└─stress-ng-cpu(313750)然后将这 2 个进程绑定到 1 号核上运行
# 绑定2个stress进程到CPU的1号核上
[root@model ~]# taskset -pc 1 313749
pid 313749's current affinity list: 0,1
pid 313749's new affinity list: 1
[root@model ~]# taskset -pc 1 313750
pid 313750's current affinity list: 0,1
pid 313750's new affinity list: 1然后使用 top 查看,如下图

此时 %Cpu1 是占满的 98%,两个 stress 进程各占 49%,两个同样的 CPU 进程跑在一个核上,大家各分一半。
实验
nice 值表示优先级,其范围是从 -20 到 19,默认值为 0。这个值越小,表示进程”优先级”越高,而值越大,表示进程“优先级”越低。
PR 值表示实时优先级,范围是从 0 到 99,默认值为 20。与 nice 值相反,pri 的值越高,进程优先级就越高。任何实时进程的优先级都高于普通进程
通过 renice 命令调整 313749 进程的 nice 值为 5,以降低它的优先级
[root@model ~]# renice -n 5 -p 313749
313749 (process ID) old priority 0, new priority 5
[root@model ~]#
现在 %Cpu1 的 us 是 74.3,ni 是 23,没被调整 nice 的进程 313750 的 %CPU 是 83.8,而调整了的进程313749 的 %CPU 是 27,同时 NI 列从 0 变成了 5,PR 列从 20 变成了 25,可以发现 %ni 的值 23 几乎等于被调整过 nice 值进程的 CPU 使用率,即 23.8。
ni% 代表被调整过 nice 值的进程占用的 CPU 使用率,被调整了 nice 值的进程,会从 us% 中分离出来单独显示,这样当一批非常吃 CPU 的进程被调整 nice 值后,调整的人就能非常清楚的知道,这些进程现在占用多少 CPU 了。
AWS CPU 部分工作机制
此时换到 AWS 上来思考官方给到的解释就是:平时运行时,数据库资源会略高于其他内容所消耗的性能,当数据库急需资源时,就会提升 RDS 所使用的进程的优先级,即会将近乎全部的 CPU 资源,从 usr% 中分离出来,给到 nice%,然后再将 nice% 所获取到的资源给到 RDS,所以出现了最初给到的图示。而平时我们在 IDC 看不到这样的情况原因是没人会去调这个东西。
参考
Linux命令拾遗-top中的%nice是啥?https://juejin.cn/post/7040095840089669639





