暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MOP 顾问说:Linux Nice 值与 CPU 优先级揭秘

白瑞钧: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?它到底是如何改变优先级的呢?

创建模拟环境

  1. 安装 stress 命令

    yum install stress-ng
  2. 创建两个进程参考博客内容,使用 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)
  3. 然后将这 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
  4. 然后使用 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




文章转载自青年数据库学习互助会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论