Monday, November 5, 2018

Linux System Command



https://www.jianshu.com/p/f595ee986b55
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。通过 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 系统调用的开销很大
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
st 和虚拟化相关,这里说说我的理解。
利用虚拟化技术,一台 32 CPU 核心的物理机,可以创建出几十上百个单 CPU 核心的虚拟机。这在公有云场景下,简称“超卖”。
大部分情况下,物理服务器的资源有大量是闲置的。此时,“超卖”并不会造成明显影响。
当很多虚拟机的 CPU 压力变大,此时物理机的资源明显不足,就会造成各个虚拟机之间相互竞争、相互等待。
st 就是用来衡量被 Hypervisor “偷去” 给其它虚拟机使用的 CPU。这个值越高,说明这台物理服务器的资源竞争越激烈。
(云厂商会不会把他们的内核给改了,把 st 改成 0 不让你发现这种情况?)




Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts