经过执行如下命令,能够在1分钟内对系统资源使用状况有个大体的了解。html
其中一些命令须要安装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,表示每秒输出一次统计信息,表头提示了每一列的含义,这几介绍一些和性能调优相关的列:服务器
上述这些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状况。该命令输出的列,主要含义是:
若是显示的是逻辑设备的数据,那么设备利用率不表明后端实际的硬件设备已经饱和。值得注意的是,即便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链接状态,其中包括:
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