sar

系统进程

sar

是目前Linux上最为全面的系统性能分析工具之一,但可能没有预装。在centos上使用以下命令即可安装。

yum install sysstat -y sar主要的好处是可以看到历史,显示友好,可以对结果进行二次处理。sar还有图形化工具,执行sar -A即可获得所有数据。

https://github.com/vlsi/ksar 针对于CPU方面,我们关注: ➊ sar -u默认 ➋ sar -P ALL每颗cpu的使用状态信息 ➌ sar -q cpu队列的长度,runq-sz>cpu count就表明有瓶颈了 ➍ sar -w每秒上下文交换

mpstat

还有pidstat,包括彩色的dstat,功能都差不多

load1代表的是啥

针对这个问题,误解还是比较多的。很多同学认为,load达到1,系统就到了瓶颈,这不完全正确。 load的值和cpu核数息息相关: ➊ 单核的cpu达到100%load1 ➋ 双核的cpu都达到100%load2 ➌ 四核的cpu都达到100%load约为4

CPU

CPU利用率是业务系统利用到CPU的比率,因为往往一个系统上会有一些其他的线程,这些线程会和CPU竞争计算资源,那么此时留给业务的计算资源比例就会下降,典型的像,GC线程的GC过程、锁的竞争过程都是消耗CPU的过程。甚至一些IO的瓶颈,也会导致CPU利用率下降(CPU都在Wait IO,利用率当然不高)

内存

# 查看系统当前的内存
$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.8G        1.2G        627M         85M        6.0G        6.0G
Swap:            0B          0B          0B

上图中总内存与可用内存差值出现不一致性,是因为OS发现系统的物理内存有大量剩余时,为了提高IO的性能,就会使用多余的内存当做文件缓存。

CPU利用率详解

/proc/stat存储的是系统的一些统计信息。

cpu  117450 5606 72399 476481991 1832 0 2681 0 0 0
cpu0 31054 90 19055 119142729 427 0 1706 0 0 0
cpu1 22476 3859 18548 119155098 382 0 272 0 0 0
cpu2 29208 1397 19750 119100548 462 0 328 0 0 0
cpu3 34711 258 15045 119083615 560 0 374 0 0 0

     (us)  (ni)    (sy)     (id)      (wa)   (hi)  (si)  (st) (guest) (guest_nice)

对于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

计算CPU使用率的基本原理就是从/proc/stat进行采样和计算。最简单的方法,一秒采样一次/proc/stat,如: 第N秒采样得到cpu_total1 = us1 + ni1 + sy1 + id1 + wa1 + hi1 + si1 + st1 + guest1 + guest_nice1N+1秒采样得到cpu_total2 = us2 + ni2 + sy2 + id2 + wa2 + hi2 + si2 + st2 + guest2 + guest_nice2 us的占比为(us2 - us1) / (cpu_total2 - cpu_total1)

nice是一个可以修改进程调度优先级的命令,在Linux中,一个进程有一个nice值,代表的是这个进程的调度优先级。越nicenice值越大)的进程,调度优先级越低,越会“谦让”,所以它的获得CPU的机会就越低。ni代表的是niced用户态进程消耗的CPU

如果sy过高,说明程序调用Linux系统调用的开销很大,不同的系统调用开销不一样,pthread_create的开销比较大。

wa高,不能说明系统的IO有问题。如果整个系统只有简单任务不停地进行IO,此时的wa可能很高,而系统磁盘的IO也远远没达到上限。假设有个单核的系统。CPU并不会真的“死等” IO。此时的CPU实际是idle的,如果有其它进程可以运行,则运行其它进程,此时CPU时间就不算入iowait。如果此时系统没有其它进程需要运行,则CPU需要“等”这次IO完成才可以继续运行,此时“等待”的时间算入iowaitwa低,也不能说明系统的IO没问题。假设机器进行大量的IO任务把磁盘带宽打得慢慢的,同时还有计算任务把CPU也跑得满满的。此时wa很低,但系统IO压力很大。

系统调用会触发软中断,网卡收到数据包后,网卡驱动会通过软中断通知CPU

$ iperf -s -i 1  # 服务端

$ iperf -c 192.168.1.4 -i 1 -t 60 # 客户端,可以开几个 terminal 执行多个客户端,这样 si 的变化才会比较明显

%Cpu(s):  1.7 us, 74.1 sy,  0.0 ni,  8.0 id,  0.0 wa,  0.0 hi, 16.2 si,  0.0 st

st和虚拟化相关,利用虚拟化技术,一台32 CPU核心的物理机,可以创建出几十上百个单CPU核心的虚拟机。这在公有云场景下,简称“超卖”。大部分情况下,物理服务器的资源有大量是闲置的。此时“超卖”并不会造成明显影响。当很多虚拟机的CPU压力变大,此时物理机的资源明显不足,就会造成各个虚拟机之间相互竞争、相互等待。st就是用来衡量被Hypervisor “偷去” 给其它虚拟机使用的CPU。这个值越高,说明这台物理服务器的资源竞争越激烈。

上一页
下一页