环境准备
- 首先你得拥有一个linux环境
- 安装sysstat包
yum install sysstat
- 安装procps包
yum install procps
需要执行的命令
updime
$ uptime
10:41:30 up 45 days, 19:43, 1 user, load average: 0.00, 0.02, 0.00
显示的是过去1分钟,五分钟,十五分钟系统的平均负载情况,通过数据可以了解服务器负载是趋于紧张还是趋于缓解
dmesg | tail
该命令会输出系统日志的最后n行。这些日志可以帮助排查性能问题。千万不要忘了这一步。
vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 558844 24696 150984 65156 0 0 2 150 1 2 0 1 99 0 0
0 0 558844 24688 150984 65160 0 0 0 0 51 72 0 0 100 0 0
0 0 558844 24688 150984 65160 0 0 0 0 50 75 0 0 100 0 0
0 0 558844 24688 150984 65160 0 0 0 0 55 80 0 1 99 0 0
0 0 558844 24688 150984 65160 0 0 0 0 44 67 0 0 100 0 0
每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数1,表示每秒输出一次统计信息,表头提示了每一列的含义,这几介绍一些和性能调优相关的列:
1.r:等待在CPU资源的进程数。这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。
2.free:系统可用内存数(以千字节为单位),如果剩余内存不足,也会导致系统性能问题。下文介绍到的free命令,可以更详细的了解系统内存的使用情况。
3.si, so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。
4.us, sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。
一般情况下,如果用户时间和系统时间相加非常大,CPU出于忙于执行指令。如果IO等待时间很长,那么系统的瓶颈可能在磁盘IO。
mpstat -P ALL 1
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 2015年12月27日 _x86_64_ (1 CPU)
18时45分48秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
18时45分49秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18时45分49秒 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18时45分49秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
18时45分50秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18时45分50秒 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的
pidstat 1
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 2015年12月27日 _x86_64_ (1 CPU)
18时47分22秒 PID %usr %system %guest %CPU CPU Command
18时47分23秒 24331 0.98 0.00 0.00 0.98 0 redis-server
18时47分23秒 PID %usr %system %guest %CPU CPU Command
18时47分24秒 PID %usr %system %guest %CPU CPU Command
18时47分25秒 7 0.00 1.01 0.00 1.01 0 events/0
18时47分25秒 27624 0.00 2.02 0.00 2.02 0 pidstat
pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态
iostat -xz 1
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 2015年12月27日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.41 0.00 0.52 0.23 0.00 98.85
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.04 29.67 0.08 8.22 4.77 299.70 36.67 0.11 12.74 0.66 0.55
dm-0 0.00 0.00 0.11 37.40 4.63 299.11 8.10 0.50 13.35 0.15 0.55
dm-1 0.00 0.00 0.02 0.07 0.14 0.59 8.00 0.00 27.85 0.76 0.01
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 2.00 0.00 98.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 1.00 0.00 16.00 0.00 16.00 0.01 15.00 15.00 1.50
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
iostat命令主要用于查看机器磁盘IO情况。该命令输出的列,主要含义是:
r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
%util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。
如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能
free -m
total used free shared buffers cached
Mem: 458 435 23 0 147 63
-/+ buffers/cache: 223 234
Swap: 927 545 382
free命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。需 要注意的是,第二行-/+ buffers/cache,一般缓存会占用大量内存空间。这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会 立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。
如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能。
sar -n DEV 1
18时52分14秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
18时52分15秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
18时52分15秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
18时52分15秒 eth1 1.01 0.00 0.07 0.00 0.00 0.00 0.00
18时52分15秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
18时52分16秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
18时52分16秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
18时52分16秒 eth1 1.01 1.01 0.07 0.49 0.00 0.00 0.00
sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。
sar -n TCP,ETCP 1
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 2015年12月27日 _x86_64_ (1 CPU)
18时52分36秒 active/s passive/s iseg/s oseg/s
18时52分37秒 0.00 0.00 0.00 0.00
18时52分36秒 atmptf/s estres/s retrans/s isegerr/s orsts/s
18时52分37秒 0.00 0.00 0.00 0.00 0.00
18时52分37秒 active/s passive/s iseg/s oseg/s
18时52分38秒 0.00 0.00 2.00 2.00
18时52分37秒 atmptf/s estres/s retrans/s isegerr/s orsts/s
18时52分38秒 0.00 0.00 0.00 0.00 0.00
sar命令在这里用于查看TCP连接状态,其中包括:
active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;
passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;
retrans/s:每秒TCP重传数量;
TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。
top
top - 18:53:43 up 53 days, 3:55, 1 user, load average: 0.00, 0.00, 0.02
Tasks: 86 total, 1 running, 85 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.4%us, 0.4%sy, 0.0%ni, 98.8%id, 0.2%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 469452k total, 446128k used, 23324k free, 151644k buffers
Swap: 950264k total, 558844k used, 391420k free, 65716k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19232 520 348 S 0.0 0.1 0:44.68 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 38:03.76 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
6 root RT 0 0 0 0 S 0.0 0.0 0:15.98 watchdog/0
7 root 20 0 0 0 0 S 0.0 0.0 57:02.33 events/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
13 root 20 0 0 0 0 S 0.0 0.0 0:31.42 sync_supers
14 root 20 0 0 0 0 S 0.0 0.0 0:33.01 bdi-default
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0
16 root 20 0 0 0 0 S 0.0 0.0 32:20.76 kblockd/0
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpid
18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_hotplug
20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_aux
21 root 20 0 0 0 0 S 0.0 0.0 0:00.21 ata_sff/0
22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksuspend_usbd
23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
24 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kseriod
25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 md/0
26 root 20 0 0 0 0 S 0.0 0.0 0:00.00 md_misc/0
27 root 20 0 0 0 0 S 0.0 0.0 0:00.00 linkwatch
28 root 20 0 0 0 0 S 0.0 0.0 0:02.11 khungtaskd
29 root 20 0 0 0 0 S 0.0 0.0 0:27.30 kswapd0
30 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
31 root 20 0 0 0 0 S 0.0 0.0 0:00.00 aio/0
32 root 20 0 0 0 0 S 0.0 0.0 0:00.00 crypto/0
37 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthrotld/0
39 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kpsmoused
40 root 20 0 0 0 0 S 0.0 0.0 0:00.00 usbhid_resumer
70 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kstriped
128 root 20 0 0 0 0 S 0.0 0.0 0:02.82 scsi_eh_0
129 root 20 0 0 0 0 S 0.0 0.0 0:00.00 scsi_eh_1
215 root 20 0 0 0 0 S 0.0 0.0 13:53.06 kdmflush