Linux 经常使用性能排查命令

经过执行如下命令,能够在1分钟内对系统资源使用状况有个大体的了解。html

  • uptime
  • dmesg | tail
  • vmstat 1
  • mpstat -P ALL 1
  • pidstat 1
  • iostat -xz 1
  • free -m
  • sar -n DEV 1
  • sar -n TCP,ETCP 1
  • top

其中一些命令须要安装sysstat包,有一些由procps包提供。这些命令的输出,有助于快速定位性能瓶颈,检查出全部资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,也就是所谓的USE方法前端

 

uptimejava

$ uptime
23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02

这个命令能够快速查看机器的负载状况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可让咱们对系统资源使用有一个宏观的了解。node

命令的输出分别表示1分钟、5分钟、15分钟的平均负载状况。经过这三个数据,能够了解服务器负载是在趋于紧张仍是区域缓解。若是1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载状况,须要进一步排查CPU资源都消耗在了哪里。反之,若是15分钟平均负载很高,1分钟平均负载较低,则有多是CPU资源紧张时刻已通过去。linux

上面例子中的输出,能够看见最近1分钟的平均负载很是高,且远高于最近15分钟负载,所以咱们须要继续排查当前系统中有什么进程消耗了大量的资源。能够经过下文将会介绍的vmstat、mpstat等命令进一步排查。ios

 

dmesg | taildocker

$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.  Check SNMP counters.

该命令会输出系统日志的最后10行。示例中的输出,能够看见一次内核的oom kill和一次TCP丢包。这些日志能够帮助排查性能问题。千万不要忘了这一步。后端

 

vmstat 1缓存

复制代码

$ 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
34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  0
32  0    0 200889920  73708 591860    0    0     0   592 13284 4282 98  1  1  0  0
32  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  0
32  0    0 200889568  73712 591856    0    0     0    48 11900 2459 99  0  0  0  0
32  0    0 200890208  73712 591860    0    0     0     0 15898 4840 98  1  1  0  0

复制代码

vmstat(8) 命令,每行会输出一些系统核心指标,这些指标可让咱们更详细的了解系统状态。后面跟的参数1,表示每秒输出一次统计信息,表头提示了每一列的含义,这几介绍一些和性能调优相关的列:服务器

  • r:等待在CPU资源的进程数。这个数据比平均负载更加可以体现CPU负载状况,数据中不包含等待IO的进程。若是这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。
  • free:系统可用内存数(以千字节为单位),若是剩余内存不足,也会致使系统性能问题。下文介绍到的free命令,能够更详细的了解系统内存的使用状况。
  • si, so:交换区写入和读取的数量。若是这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。
  • us, sy, id, wa, st:这些都表明了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,通常被其余虚拟机消耗)。

上述这些CPU时间,可让咱们很快了解CPU是否出于繁忙状态。通常状况下,若是用户时间和系统时间相加很是大,CPU出于忙于执行指令。若是IO等待时间很长,那么系统的瓶颈可能在磁盘IO。

示例命令的输出能够看见,大量CPU时间消耗在用户态,也就是用户应用程序消耗了CPU时间。这不必定是性能问题,须要结合r队列,一块儿分析。

 

mpstat -P ALL 1

复制代码

$ mpstat -P ALL 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)
07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle
07:38:50 PM  all  98.47   0.00   0.75    0.00   0.00   0.00    0.00    0.00    0.00   0.78
07:38:50 PM    0  96.04   0.00   2.97    0.00   0.00   0.00    0.00    0.00    0.00   0.99
07:38:50 PM    1  97.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   2.00
07:38:50 PM    2  98.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   1.00
07:38:50 PM    3  96.97   0.00   0.00    0.00   0.00   0.00    0.00    0.00    0.00   3.03
[...]

复制代码

该命令能够显示每一个CPU的占用状况,若是有一个CPU占用率特别高,那么有多是一个单线程应用程序引发的。

 

pidstat 1

复制代码

$ pidstat 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)
07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/0
07:41:03 PM     0      4214    5.66    5.66    0.00   11.32    15  mesos-slave
07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java
07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java
07:41:03 PM     0      6564 1571.70    7.55    0.00 1579.25    28  java
07:41:03 PM 60004     60154    0.94    4.72    0.00    5.66     9  pidstat
07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:04 PM     0      4214    6.00    2.00    0.00    8.00    15  mesos-slave
07:41:04 PM     0      6521 1590.00    1.00    0.00 1591.00    27  java
07:41:04 PM     0      6564 1573.00   10.00    0.00 1583.00    28  java
07:41:04 PM   108      6718    1.00    0.00    0.00    1.00     0  snmp-pass
07:41:04 PM 60004     60154    1.00    4.00    0.00    5.00     9  pidstat

复制代码

pidstat命令输出进程的CPU占用率,该命令会持续输出,而且不会覆盖以前的数据,能够方便观察系统动态。如上的输出,能够看见两个JAVA进程占用了将近1600%的CPU时间,既消耗了大约16个CPU核心的运算资源。

 

iostat -xz 1

复制代码

$ iostat -xz 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          73.96    0.00    3.73    0.03    0.06   22.21
Device:   rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda        0.00     0.23    0.21    0.18     4.52     2.08    34.37     0.00    9.98   13.80    5.42   2.44   0.09
xvdb        0.01     0.00    1.02    8.94   127.97   598.53   145.79     0.00    0.43    1.78    0.28   0.25   0.25
xvdc        0.01     0.00    1.02    8.86   127.79   595.94   146.50     0.00    0.45    1.82    0.30   0.27   0.26
dm-0        0.00     0.00    0.69    2.32    10.47    31.69    28.01     0.01    3.23    0.71    3.98   0.13   0.04
dm-1        0.00     0.00    0.00    0.94     0.01     3.78     8.00     0.33  345.84    0.04  346.81   0.01   0.00
dm-2        0.00     0.00    0.09    0.07     1.35     0.36    22.50     0.00    2.55    0.23    5.62   1.78   0.03
[...]

复制代码

iostat命令主要用于查看机器磁盘IO状况。该命令输出的列,主要含义是:

  • r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引发性能问题。
  • await:IO操做的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,须要消耗的时间,包括IO等待和实际操做的耗时。若是这个数值过大,多是硬件设备遇到了瓶颈或者出现故障。
  • avgqu-sz:向设备发出的请求平均数量。若是这个数值大于1,多是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
  • %util:设备利用率。这个数值表示设备的繁忙程度,经验值是若是超过60,可能会影响IO性能(能够参照IO操做平均等待时间)。若是到达100%,说明硬件设备已经饱和。

若是显示的是逻辑设备的数据,那么设备利用率不表明后端实际的硬件设备已经饱和。值得注意的是,即便IO性能不理想,也不必定意味这应用程序性能会很差,能够利用诸如预读取、写缓存等策略提高应用性能。

 

free –m

$ free -m
             total       used       free     shared    buffers     cached
Mem:        245998      24545     221453         83         59        541
-/+ buffers/cache:      23944     222053
Swap:            0          0          0

free命令能够查看系统内存的使用状况,-m参数表示按照兆字节展现。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。须要注意的是,第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。这是Linux系统的内存使用策略,尽量的利用内存,若是应用程序须要内存,这部份内存会当即被回收并分配给应用程序。所以,这部份内存通常也被当成是可用内存。

若是可用内存很是少,系统可能会动用交换区(若是配置了的话),这样会增长IO开销(能够在iostat命令中提现),下降系统性能。

 

sar -n DEV 1

复制代码

$ sar -n DEV 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015     _x86_64_    (32 CPU)
12:16:48 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12:16:49 AM      eth0  18763.00   5032.00  20686.42    478.30      0.00      0.00      0.00      0.00
12:16:49 AM        lo     14.00     14.00      1.36      1.36      0.00      0.00      0.00      0.00
12:16:49 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:16:49 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12:16:50 AM      eth0  19763.00   5101.00  21999.10    482.56      0.00      0.00      0.00      0.00
12:16:50 AM        lo     20.00     20.00      3.25      3.25      0.00      0.00      0.00      0.00
12:16:50 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

复制代码

sar命令在这里能够查看网络设备的吞吐率。在排查性能问题时,能够经过网络设备的吞吐量,判断网络设备是否已经饱和。如示例输出中,eth0网卡设备,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,没有达到1Gbit/sec的硬件上限。

 

sar -n TCP,ETCP 1

复制代码

$ sar -n TCP,ETCP 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)
12:17:19 AM  active/s passive/s    iseg/s    oseg/s
12:17:20 AM      1.00      0.00  10233.00  18846.00
12:17:19 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
12:17:20 AM      0.00      0.00      0.00      0.00      0.00
12:17:20 AM  active/s passive/s    iseg/s    oseg/s
12:17:21 AM      1.00      0.00   8359.00   6039.00
12:17:20 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
12:17:21 AM      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
top - 00:15:40 up 21:56,  1 user,  load average: 31.09, 29.87, 29.92
Tasks: 871 total,   1 running, 868 sleeping,   0 stopped,   2 zombie
%Cpu(s): 96.8 us,  0.4 sy,  0.0 ni,  2.7 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  25190241+total, 24921688 used, 22698073+free,    60448 buffers
KiB Swap:        0 total,        0 used,        0 free.   554208 cached Mem
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 20248 root      20   0  0.227t 0.012t  18748 S  3090  5.2  29812:58 java
  4213 root      20   0 2722544  64640  44232 S  23.5  0.0 233:35.37 mesos-slave
 66128 titancl+  20   0   24344   2332   1172 R   1.0  0.0   0:00.07 top
  5235 root      20   0 38.227g 547004  49996 S   0.7  0.2   2:02.74 java
  4299 root      20   0 20.015g 2.682g  16836 S   0.3  1.1  33:14.42 java
     1 root      20   0   33620   2920   1496 S   0.0  0.0   0:03.82 init
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd
     3 root      20   0       0      0      0 S   0.0  0.0   0:05.35 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:06.94 kworker/u256:0
     8 root      20   0       0      0      0 S   0.0  0.0   2:38.05 rcu_sched

复制代码

top命令包含了前面好几个命令的检查的内容。好比系统负载状况(uptime)、系统内存使用状况(free)、系统CPU使用状况(vmstat)等。所以经过这个命令,能够相对全面的查看系统负载的来源。同时,top命令支持排序,能够按照不一样的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。

可是,top命令相对于前面一些命令,输出是一个瞬间值,若是不持续盯着,可能会错过一些线索。这时可能须要暂停top命令刷新,来记录和比对数据。

 

 

 

################### cpu性能查看 ################
一、查看物理cpu个数:
cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l

二、查看每一个物理cpu中的core个数:
cat /proc/cpuinfo |grep "cpu cores"|wc -l

三、逻辑cpu的个数:
cat /proc/cpuinfo |grep "processor"|wc -l

物理cpu个数*核数=逻辑cpu个数(不支持超线程技术的状况下)

############## 内存查看 #############
一、查看内存使用状况:
free -m
             total       used       free     shared    buffers     cached
Mem:          3949       2519       1430          0        189       1619
-/+ buffers/cache:        710       3239
Swap:         3576          0       3576

total:内存总数
used:已经使用的内存数
free:空闲内存数
shared:多个进程共享的内存总额
- buffers/cache:(已用)的内存数,即used-buffers-cached
+ buffers/cache:(可用)的内存数,即free+buffers+cached

Buffer Cache用于针对磁盘块的读写;Page Cache用于针对文件inode的读写,这些Cache能有效地缩短I/O系统调用的时间。

对于操做系统来讲free/used是系统可用/占用的内存;而对于应用程序来讲-/+ buffers/cache是可用/占用内存,由于buffers/cache很快就会被使用。咱们工做时候应该从应用角度来看。

######## 硬盘查看 ############
一、查看硬盘及分区信息:
fdisk -l

二、查看文件系统的磁盘空间占用状况:
df -h

三、查看硬盘的I/O性能(每隔一秒显示一次,显示5次):
iostat -x 1 5
iostat是含在套装systat中的,能够用yum -y install systat来安装。
常关注的参数:
若是%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
若是idle小于70%,I/O的压力就比较大了,说明读取进程中有较多的wait。

四、查看linux系统中某目录的大小:
du -sh /root

如发现某个分区空间接近用完,能够进入该分区的挂载点,用如下命令找出占用空间最多的文件或目录,而后按照从大到小的顺序,找出系统中占用最多空间的前10个文件或目录:
du -cksh *|sort -rn|head -n 10

################# 查看平均负载 #######################
有时候系统响应很慢,但又找不到缘由,这时就要查看平均负载了,看它是否有大量的进程在排队等待。
最简单的命令:
uptime
查看过去的1分钟、5分钟和15分钟内进程队列中的平均进程数量。
还有动态命令:
top
咱们只关心如下部分:
top - 21:33:09 up  1:00,  1 user,  load average: 0.00, 0.01, 0.05
若是每一个逻辑cpu当前的活动进程不大于3,则系统性能良好;
若是每一个逻辑cpu当前的活动进程不大于4,表示能够接受;
若是每一个逻辑cpu当前的活动进程大于5,则系统性能问题严重。
通常计算方法:负载值/逻辑cpu个数

还能够结合vmstat命令来判断系统是否繁忙,其中:
procs
r:等待运行的进程数。
b:处在非中断睡眠状态的进程数。
w:被交换出去的可运行的进程数。
memeory
swpd:虚拟内存使用状况,单位为KB。
free:空闲的内存,单位为KB。
buff:被用来做为缓存的内存数,单位为KB。
swap
si:从磁盘交换到内存的交换页数量,单位为KB。
so:从内存交换到磁盘的交换页数量,单位为KB。
io
bi:发送到块设备的块数,单位为KB。
bo:从块设备接受的块数,单位为KB。
system
in:每秒的中断数,包括时钟中断。
cs:每秒的环境切换次数。
cpu
按cpu的总使用百分比来显示。
us:cpu使用时间。
sy:cpu系统使用时间。
id:闲置时间。
标准状况下r和b的值应该为:
r<5,b=0
假设输出的信息中:
若是r常常大于3或4,且id常常少于50,表示cpu的负荷太重。
pi、po长期不等于0,表示内存不足。
bi常常不等于0,且在b中的队列大于2或3,表示io的性能很差。

############ 其余参数 ######################
查看内核版本号:
uname -a
简化命令:
uname -r
查看系统是32位仍是64位的:
file /sbin/init
查看发行版:
cat /etc/issue
或lsb_release -a
查看系统已载入的相关模块:
lsmod
查看pci设置:
lspci
相关文章
相关标签/搜索