把之前做的碎片化的性能分析进行系统化学习,这里参考的是陈志勇、马利伟、万龙著《全栈性能测试修炼宝典Jmeter实战》,感觉自己上了一个台阶。
1 评估标准
先看一下web项目性能测试通过的标准,有了评判标准,系统设计的是否优秀就有了依据。
2 瓶颈阈值分析
下图把什么方面使用什么样的命令进行了梳理。
2.1 CPU定位分析
2.1.1 uptime\w命令
使用uptime
显示当前系统运行了658天,当前有1个用户在线,过去1分钟平均负载为0.62,过去5分钟平均负载为0.53,过去15分钟平均负载为0.45。一般系统建议每个CPU内核的当前活动进程数分析如下:
-
不大于0.8,证明系统是空闲的。
-
大于1且不大于3的时候,如果系统的其他资源都很正常,那么系统的性能是可以接受的
-
大于5,证明系统的性能有问题了。这里我的理解应该是大于3,性能就算有问题。
书上举了个例子,4核CPU,当uptime输出的结果是15,意味着当前系统负载非常严重,需要分析进程调度策略是否有阻塞。如果上面说的规则是34=12,,12就是上限了,而54=20,莫非要等待20才算有问题?
平均负载的意思是在特定时间间隔内运行队列中的平均进程数,什么情况进程会进入运行队列内 -
它没有等待io操作的结果
-
它没有主动进入等待状态(即没有调用wait)
-
没有被停止
uptime
是分析一段时间内的负载,读取的数据来自/proc/loadavg
[root@bwsc55 ~]# uptime
19:52:34 up 658 days, 5:40, 1 user, load average: 0.62, 0.53, 0.45
[root@bwsc55 ~]# cat /proc/loadavg
0.47 0.41 0.41 3/545 4664```
使用`w`命令可以查看到当前登录用户的信息。
```sh
[root@bwsc55 ~]# w
19:56:46 up 658 days, 5:45, 1 user, load average: 0.18, 0.38, 0.41
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
test pts/0 10.101.7.111 19:50 6.00s 0.01s 0.05s sshd: test [priv]
2.1.2 top命令
如果要查看当前负载平均值,则需要top等命令,
默认是3s刷新,输入top后,按下d,输入数字即可改变刷新频率
输入top,输入数字1,显示各CPU的利用情况
如果想讲top命令的结果输出到文件中,可以执行下面的命令。
top -b -d 5 -n 3 > top.log
如果想看具体某个进程的,则执行,其中23809是PID,如果要输出用户下的,则使用-u
top -b -d 5 -n 3 -p 23809 > top.log
[root@bwsc55 ~]# top
# 这一行跟uptime的内容相同
top - 20:14:06 up 658 days, 6:02, 1 user, load average: 0.26, 0.31, 0.37
# 显示进程状态信息,R运行态、S睡眠态、T被跟踪或已停止、Z僵尸态
Tasks: 233 total, 1 running, 232 sleeping, 0 stopped, 0 zombie
# CPU信息 sy:内核空间占用CPU百分比,ni:用户进程空间内该表过优先级的进程CPU占用,id:空闲CPU占比,wa:等待输入输出的CPU占比,hi:硬终端CPU占比,si软终端CPU占比。一般关注多的是us、sy、hi、si、id、wa这6个数值。
# wa:使用率过高,要考虑IO的性能是否有瓶颈。可以通过iostat、sar等命令进一步分析
# hi:使用率过高,一般硬件中终端可以分析/proc/interrupts、/proc/irq/pid/smp_affinity(这个文件centos中没有)、服务irqbalance是否配置,以及CPU的频率设置,来帮系统打散优化系统的硬件终端
# si: linux kernel通过软件的方法(可延迟函数)来模拟硬件的中断模式,常见的软件中断都和网络有关,从网卡到IP层的数据报文收发都是由软件中断来处理,初次之外长时间地写日志也可能产生软件中断。当发生软件中断出现瓶颈,系统有个ksoftirqd进程,每个CPU都有自己对应的ksoftirqd/n(n为CPU的逻辑id)。每个ksoftirqd的内核线程都会去运行对应的ksoftirqd函数来处理自己的中断队列上的软件中断,所有当网络出现阻塞的时候,软件中断程序ksoftirqd肯定会出现瓶颈
# ni:优先级为操作系统决定CPU分配的参数,linux使用round-robin的算法来做CPU排程,可以通过nice命令来更改优先序
# 一般监控分析获取系统CPU利用率=us+sy+si=6.4+0.6+0.1=7.1%
%Cpu(s): 6.4 us, 0.6 sy, 0.0 ni, 93.0 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
# 内存信息,total:使用的物理内存总量,free:空闲内存容量,buffers:用作内核缓存的内存量,cached:缓冲的交换区总量,
# buffer和cache的作用是缩短io系统调用的时间,比如读写等。一般如果cache的值很大,说明cache住的文件数多。如果频繁地访问文件都能命中,比读取磁盘调用快,磁盘IO必定会减小。但如果频繁访问的文件不能被命中,对cache而言则是资源浪费,此时考虑drop cache并提升对应cache命中率。
# free表示的空闲内存总量,虽然buffer/cache会占一定的物理内存,但当系统需要内存的时候,这些内存也会释放,故buffer/cache可以看成可用内存。
KiB Mem : 24523884 total, 198040 free, 14137036 used, 10188808 buff/cache
total:交换区总量,used:使用的交换区总量,free:空闲交换区总量
KiB Swap: 0 total, 0 free, 0 used. 8775552 avail Mem
# PR是进程优先级,NI是nice值,负值表示高优先级,正值表示低优先级,VIRT是进程使用的虚拟内存,RES是实际物理内存,SHR是共享内存,TIME+表示进程使用的CPU时间总计,单位1/100秒。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9224 es 20 0 0.124t 0.014t 1.289g S 83.7 61.3 233437:44 java
1 root 20 0 50028 3292 1448 S 0.0 0.0 151:47.07 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:03.68 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 3:12.04 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u24:0
8 root rt 0 0 0 0 S 0.0 0.0 4:59.38 migration/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/1
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/2
执行/proc/interrupts
,不过看不懂里面的内容
[root@bwsc55 ~]# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11
0: 50 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge timer
1: 10 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge i8042
8: 1 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge rtc0
9: 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-fasteoi acpi
12: 151 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge i8042
14: 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge ata_piix
15: 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge ata_piix
16: 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-fasteoi vmwgfx
24: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
25: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
26: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
27: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
28: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
29: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
30: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
31: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
32: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
33: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
34: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
35: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
36: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
37: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
38: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
39: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
40: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
41: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
42: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
43: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
44: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
45: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
46: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
47: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
48: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
49: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
50: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
51: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
52: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
53: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
54: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
55: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge PCIe PME, pciehp
56: 4026 0 0 0 0 0 0 0 0 1919164127 0 0 PCI-MSI-edge vmw_pvscsi
57: 54 0 1517 0 0 822 2039819237 0 1972 1706 0 143309 PCI-MSI-edge eth0-rxtx-0
58: 7 0 1627377101 0 0 0 0 0 0 0 0 0 PCI-MSI-edge eth0-rxtx-1
59: 6 0 0 0 0 1683 0 0 1786555780 403 0 0 PCI-MSI-edge eth0-rxtx-2
60: 7 0 0 2221955592 0 0 0 0 0 0 0 0 PCI-MSI-edge eth0-rxtx-3
61: 11 0 0 0 0 0 0 0 0 0 2814025662 0 PCI-MSI-edge eth0-rxtx-4
62: 4 0 0 0 1765472497 0 0 0 0 0 0 0 PCI-MSI-edge eth0-rxtx-5
63: 9 0 0 0 0 0 0 0 0 0 0 2303819533 PCI-MSI-edge eth0-rxtx-6
64: 11 0 0 0 0 1480298046 0 0 0 0 0 0 PCI-MSI-edge eth0-rxtx-7
65: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge eth0-event-8
66: 50 0 0 400 0 0 0 89016209 16 73 0 111 PCI-MSI-edge eth1-rxtx-0
67: 26459 11180 3 0 0 336 224 3 0 0 31 314 PCI-MSI-edge eth1-rxtx-1
68: 37096 100962 0 5 6 807 363 419 0 0 0 2451 PCI-MSI-edge eth1-rxtx-2
69: 1 0 0 0 0 0 0 0 0 0 0 138 PCI-MSI-edge eth1-rxtx-3
70: 368017 57936 14 0 6 1642 863 109 0 20 0 4025 PCI-MSI-edge eth1-rxtx-4
71: 16313 44883 0 0 0 447 288 51 0 0 0 188 PCI-MSI-edge eth1-rxtx-5
72: 2146 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge eth1-rxtx-6
73: 79304 9024 9 0 0 338 146 49 4 12 0 3292 PCI-MSI-edge eth1-rxtx-7
74: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge eth1-event-8
75: 20 0 0 0 0 0 0 0 0 0 8529392 0 PCI-MSI-edge vmw_vmci
76: 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-edge vmw_vmci
NMI: 0 0 0 0 0 0 0 0 0 0 0 0 Non-maskable interrupts
LOC: 2826434280 3154169679 2588674915 2242186769 2045144257 1847115399 2336735121 1769226329 1875015771 1283264538 2275927646 1753449694 Local timer interrupts
SPU: 0 0 0 0 0 0 0 0 0 0 0 0 Spurious interrupts
PMI: 0 0 0 0 0 0 0 0 0 0 0 0 Performance monitoring interrupts
IWI: 177080596 73445593 65204847 54516603 51894355 62200467 138079135 94926969 94136599 94058553 61603286 59969983 IRQ work interrupts
RTR: 0 0 0 0 0 0 0 0 0 0 0 0 APIC ICR read retries
RES: 1220116857 630404425 669953608 555973176 505931659 537516009 1678402842 1613703048 1571729441 1556244426 1326767133 1251567899 Rescheduling interrupts
CAL: 95198784 68756911 94760429 95358936 75822921 79770125 172124438 115430462 148154866 4265367119 147467278 143102130 Function call interrupts
TLB: 1008109044 996337354 1106719245 1064506050 946245186 949002417 1039855144 813134430 972116554 748178961 949989864 980449115 TLB shootdowns
TRM: 0 0 0 0 0 0 0 0 0 0 0 0 Thermal event interrupts
THR: 0 0 0 0 0 0 0 0 0 0 0 0 Threshold APIC interrupts
MCE: 0 0 0 0 0 0 0 0 0 0 0 0 Machine check exceptions
MCP: 189580 189580 189580 189580 189580 189580 189580 189580 189580 189580 189580 189580 Machine check polls
ERR: 0
MIS: 0
2.2 内存定位分析
2.2.1 drop cache 释放内存
下面的命令是按照书上执行的,每个命令执行了两遍,估计是确保执行成功,sync
是内核同步,echo 3 > /proc/sys/vm/drop_caches
是释放内存。因为清理buffer/cache是一个物理内存的数据同步到磁盘的过程,为了保证在执行完drop cache的过程不丢数据,需要执行sync
命令,sync命令执行同步避免丢失数据。
[root@bwsc52 ~]# free -m
total used free shared buff/cache available
Mem: 3791 1485 363 184 1942 1832
Swap: 4095 235 3860
[root@bwsc52 ~]# sync
[root@bwsc52 ~]# sync
[root@bwsc52 ~]# echo 3 > /proc/sys/vm/drop_caches
[root@bwsc52 ~]# echo 3 > /proc/sys/vm/drop_caches
[root@bwsc52 ~]# free -m
total used free shared buff/cache available
Mem: 3791 1452 2082 184 256 2022
Swap: 4095 235 3860
2.3 网络定位分析
2.4 IO定位分析