服务异常时首先检查监控,观察QPS,RT以及成功率是否有抖动,如果没有明显抖动,再检查服务器状态
CPU负载
使用top命令或uptime命令查看CPU负载
top - 18:06:34 up 35 days, 3:53, 1 user, load average: 1.41, 1.61, 1.70
[root@sean ~]# uptime
18:07:35 up 35 days, 3:54, 1 user, load average: 1.46, 1.56, 1.68
CPU的每个核都维护了一个运行队列,特定时间间隔内运行队列中的平均线程数即为CPU负载,例如,一个CPU有8个核,应用程序启动了16个线程,并且这些线程都处于运行状态,平均分配的情况下,每个核的运行队列中有2个线程在运行,持续1分钟,则这1分钟内,CPU的负载为2
load值越大,CPU越繁忙,通常CPU的load值不会超过3,如果load值大于5,表明CPU的负载已经非常高了
三个值分别表示过去1分钟、5分钟以及15分钟内的CPU负载
CPU利用率
使用top命令查看CPU利用率
Cpu(s): 5.3%us, 0.4%sy, 0.0%ni, 94.2%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
us:User Time,CPU执行用户进程所占用的时间,越大越好
sy:System Time,CPU在内核态所占用的时间,如果该值过大,说明系统某些方面设计不合理,例如,频繁的系统调用导致的用户态与内核态频繁切换
ni:Nice Time,系统调整进程优先级所花费的时间
id:Idel Time,系统空闲时间,等待进程运行,越小越好
wa:Waiting Time,CPU等待IO操作所花费的时间,该值过大表示系统某些方面设计不合理
hi:Hard Irq Time,系统处理硬件中断所占用时间
si:Soft Irq Time,系统处理软件中断所占用时间
st:Steal Time,硬件虚拟化流行后新增,表示等待虚拟CPU时间,st占比较高,表示当前虚拟机与该宿主机上的其它虚拟机间的CPU争用比较频繁
按1可以查看CPU每个核的利用率
Cpu0 : 4.3%us, 0.3%sy, 0.0%ni, 95.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 4.7%us, 0.3%sy, 0.0%ni, 95.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 4.7%us, 0.3%sy, 0.0%ni, 95.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 9.4%us, 1.3%sy, 0.0%ni, 87.9%id, 0.0%wa, 0.3%hi, 1.0%si, 0.0%st
Cpu4 : 4.7%us, 0.3%sy, 0.0%ni, 95.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu5 : 26.7%us, 0.0%sy, 0.0%ni, 73.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 5.3%us, 0.3%sy, 0.0%ni, 94.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 44.4%us, 6.6%sy, 0.0%ni, 49.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
按Shift+H可以按照线程查看CPU使用情况
内存使用率
[root@sean ~]# free -m
total used free shared buffers cached
Mem: 32109 28878 3231 0 317 14928
-/+ buffers/cache: 13632 18477
Swap: 2015 0 2015
特别需要注意的是Swap内存,如果Swap内存使用过多,表示物理内存已经不够使用,操作系统将物理内存存储的部分数据调度到了磁盘上,以腾出足够的内存供当前进程使用,当之前的进程需要运行时,再将磁盘上的数据调度至物理内存中,这个过程过于频繁将严重影响系统性能,使用vmstat可以查看swap IO
[root@sean ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 3308192 324940 15289716 0 0 0 4 1 1 6 1 93 0 0
si:每秒从磁盘交换到内存的数据量(KB)
so:每秒从内存交换到磁盘的数据量(KB)
磁盘使用率
使用df -h命令查看磁盘使用率
[root@sean ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/ma 37G 3.7G 33G 11% /
tmpfs 16G 0 16G 0% /dev/shm
/dev/vda1 477M 35M 417M 8% /boot
/dev/vdb 99G 14G 81G 14% /data
如何需要查看具体目录所占用的空间,分析大文件所处位置,需要使用du命令
[root@sean ~]# du -sh /data
13G /data
[root@sean ~]# du -h --max-depth=1 /data
8.0K /data/keytab
13G /data/logs
8.0K /data/shell
198M /data/java
16K /data/lost+found
533M /data/apps
13G /data
磁盘IO
使用iostat命令,其中:-k指结果使用KB统计,-d表示查看的是磁盘
[root@sean ~]# iostat -kd
Linux 2.6.32-642.el6.x86_64 (sean) 10/11/2018 _x86_64_ (8 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.99 0.15 16.85 455025 51301563
vdb 0.56 0.00 15.04 2221 45808724
dm-0 4.20 0.15 16.75 450297 50997068
dm-1 0.00 0.00 0.00 1308 0
tps:每秒处理的IO请求数
kB_read/s:每秒向设备写入的数据量
kB_wrtn/s:每秒从设备读取的数据量
kB_read:读取数据总量
kB_wrtn:写入数据总量
磁盘每秒能够写入的数据量需要根据具体环境确定,一般的磁盘可以支持几十MB/s的写入速度
IO密集型的应用需要充分测试,以MQ系统为例,写入持久化消息以及事务日志是其主要的性能瓶颈点,需要支持较高的写入速度(例如100MB/s)
CPU密集型的应用磁盘IO一般不是瓶颈
优化策略:使用缓存,使用合理的RAID策略
网络traffic
-n指定统计信息,如DEV统计网络接口信息,SOCK统计套接字信息
5表示每5s抽样一次
1表示总共抽样一次
[root@sean ~]# sar -n DEV 5 1
Linux 2.6.32-642.el6.x86_64 (sean) 10/11/2018 _x86_64_ (8 CPU)
07:49:04 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
07:49:05 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:49:05 PM eth0 637.00 415.00 133.03 84.45 0.00 0.00 0.00
Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: eth0 637.00 415.00 133.03 84.45 0.00 0.00 0.00
IFACE:lo为本地回环网络,eth0表示网卡
rxpck/s:每秒接收包个数
txpck/s:每秒发送包个数
rxkB/s:每秒接收字节数(KB)
txkB/s:每秒发送字节数(KB)
txcmp/s:每秒发送压缩包个数
rxmcst/s:每秒接收的广播包个数
TCP连接
主机可以使用的端口范围,可使用端口个数为60999-32768=28231个
root@sean:~# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
使用netstat命令统计处于各种状态下的TCP连接数,重点关注处于TIME_WAIT和CLOSE_WAIT状态下的TCP连接数
root@sean:~# netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key, state[key]}'
TIME_WAIT 141
CLOSE_WAIT 20
ESTABLISHED 729
出现大量CLOSE_WAIT状态连接:短连接客户端业务完成后需要关闭连接或者使用长连接
出现大量TIME_WAIT状态连接:使用长连接或者减小TIME_WAIT等待时间(默认大概2分钟)
-s:每个协议统计数据,能看见TCP连接细节
root@sean:~# netstat -s
......
Tcp:
59 active connections openings
4 passive connection openings
54 failed connection attempts
0 connection resets received
0 connections established
234 segments received
233 segments send out
0 segments retransmited
0 bad segments received.
54 resets sent
......
优化策略:使用缓存降低请求次数,多次请求合并为一次请求,数据传输前进行压缩