https://www.jianshu.com/p/f595ee986b55
越 nice (nice 值越大)的进程,调度优先级越低。怎么理解这句话?进程调度本质上是进程间对 CPU 这一有限资源的争抢,越 nice 的进程,越会“谦让”,所以它的获得 CPU 的机会就越低。
上面的 CPU 利用率里面,将用户态进程使用的 CPU 分成 niced 和 un-niced 两部分,没什么本质差别。平时很少遇到要使用
一般情况下,如果
wa 这一项,连相关的 Linux man-pages 都说它不太靠谱。所以千万不要看到 wa 很高就觉得系统的 I/O 有问题。
The CPU will not wait for I/O to complete; iowait is the time that a task is waiting for I/O to complete. When a CPU goes into idle state for outstanding task I/O, another task will be scheduled on this CPU.
On a multi-core CPU, the task waiting for I/O to complete is not running on any CPU, so the iowait of each CPU is difficult to calculate.
The value in this field may decrease in certain conditions.
说一下我的理解:
假设有个单核的系统。CPU 并不会真的“死等” I/O。此时的 CPU 实际是 idle 的,如果有其它进程可以运行,则运行其它进程,此时 CPU 时间就不算入 iowait。如果此时系统没有其它进程需要运行,则 CPU 需要“等”这次 I/O 完成才可以继续运行,此时“等待”的时间算入 iowait。
对于多核系统,如果有 iowait,要算给哪个 CPU?这是个问题。
wa 高,不能说明系统的 I/O 有问题。如果整个系统只有简单任务不停地进行 I/O,此时的 wa 可能很高,而系统磁盘的 I/O 也远远没达到上限。
wa 低,也不能说明系统的 I/O 没问题。假设机器进行大量的 I/O 任务把磁盘带宽打得慢慢的,同时还有计算任务把 CPU 也跑得满满的。此时 wa 很低,但系统 I/O 压力很大。
网卡收到数据包后,网卡驱动会通过软中断通知 CPU
利用虚拟化技术,一台 32 CPU 核心的物理机,可以创建出几十上百个单 CPU 核心的虚拟机。这在公有云场景下,简称“超卖”。
大部分情况下,物理服务器的资源有大量是闲置的。此时,“超卖”并不会造成明显影响。
当很多虚拟机的 CPU 压力变大,此时物理机的资源明显不足,就会造成各个虚拟机之间相互竞争、相互等待。
(云厂商会不会把他们的内核给改了,把
us, user: time running un-niced user processes
sy, system: time running kernel processes
ni, nice: time running niced user processes
id, idle: time spent in the kernel idle handler
wa, IO-wait: time waiting for I/O completion
hi: time spent servicing hardware interrupts
si: time spent servicing software interrupts
st: time stolen from this vm by the hypervisor
前面一节,对于 CPU 利用率描述,Linux man-pages 用的都是 time( time running, time spent,time stolen)这个单词。这里的统计数据,其实就是 CPU 从系统启动至当前,各项(us, sy, ni, id, wa, hi, si, st)占用的时间,单位是 jiffies。通过
计算 CPU 使用率的基本原理就是从
第 N 秒采样得到
第 N+1 秒采样得到
sysconf(_SC_CLK_TCK)
可以获得 1 秒被分成多少个 jiffies 。一般是 100,即 1 jiffies == 0.01 s。(st、guest、guest_nice 和虚拟化/虚拟机相关,如果这些值太高,说明虚拟化的实现或者宿主机有问题。不是本文关注的重点。)计算 CPU 使用率的基本原理就是从
/proc/stat
进行采样和计算。最简单的方法,一秒采样一次 /proc/stat
,如:第 N 秒采样得到
cpu_total1 = us1 + ni1 + sy1 + id1 + wa1 + hi1 + si1 + st1 + guest1 + guest_nice1
第 N+1 秒采样得到
cpu_total2 = us2 + ni2 + sy2 + id2 + wa2 + hi2 + si2 + st2 + guest2 + guest_nice2
us
的占比为 (us2 - us1) / (cpu_total2 - cpu_total1)
。nice - run a program with modified scheduling priority
nice
是一个可以修改进程调度优先级的命令,具体可以参考 man-pages。在 Linux 中,一个进程有一个 nice 值,代表的是这个进程的调度优先级。越 nice (nice 值越大)的进程,调度优先级越低。怎么理解这句话?进程调度本质上是进程间对 CPU 这一有限资源的争抢,越 nice 的进程,越会“谦让”,所以它的获得 CPU 的机会就越低。
上面的 CPU 利用率里面,将用户态进程使用的 CPU 分成 niced 和 un-niced 两部分,没什么本质差别。平时很少遇到要使用
nice
命令的场景(我个人从来没遇到过)一般情况下,如果
sy
过高,说明程序调用 Linux 系统调用的开销很大The CPU will not wait for I/O to complete; iowait is the time that a task is waiting for I/O to complete. When a CPU goes into idle state for outstanding task I/O, another task will be scheduled on this CPU.
On a multi-core CPU, the task waiting for I/O to complete is not running on any CPU, so the iowait of each CPU is difficult to calculate.
The value in this field may decrease in certain conditions.
说一下我的理解:
假设有个单核的系统。CPU 并不会真的“死等” I/O。此时的 CPU 实际是 idle 的,如果有其它进程可以运行,则运行其它进程,此时 CPU 时间就不算入 iowait。如果此时系统没有其它进程需要运行,则 CPU 需要“等”这次 I/O 完成才可以继续运行,此时“等待”的时间算入 iowait。
对于多核系统,如果有 iowait,要算给哪个 CPU?这是个问题。
wa 高,不能说明系统的 I/O 有问题。如果整个系统只有简单任务不停地进行 I/O,此时的 wa 可能很高,而系统磁盘的 I/O 也远远没达到上限。
wa 低,也不能说明系统的 I/O 没问题。假设机器进行大量的 I/O 任务把磁盘带宽打得慢慢的,同时还有计算任务把 CPU 也跑得满满的。此时 wa 很低,但系统 I/O 压力很大。
网卡收到数据包后,网卡驱动会通过软中断通知 CPU
st
和虚拟化相关,这里说说我的理解。利用虚拟化技术,一台 32 CPU 核心的物理机,可以创建出几十上百个单 CPU 核心的虚拟机。这在公有云场景下,简称“超卖”。
大部分情况下,物理服务器的资源有大量是闲置的。此时,“超卖”并不会造成明显影响。
当很多虚拟机的 CPU 压力变大,此时物理机的资源明显不足,就会造成各个虚拟机之间相互竞争、相互等待。
st
就是用来衡量被 Hypervisor “偷去” 给其它虚拟机使用的 CPU。这个值越高,说明这台物理服务器的资源竞争越激烈。(云厂商会不会把他们的内核给改了,把
st
改成 0 不让你发现这种情况?)