Linux 常用性能排查命令
通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解。
- 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方法。
uptime
$ uptime 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。
命令的输出分别表示1分钟、5分钟、15分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是区域缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。
上面例子中的输出,可以看见最近1分钟的平均负载非常高,且远高于最近15分钟负载,因此我们需要继续排查当前系统中有什么进程消耗了大量的资源。可以通过下文将会介绍的vmstat、mpstat等命令进一步排查。
dmesg | tail
$ 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性能查看 ################ 1、查看物理cpu个数: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l 2、查看每个物理cpu中的core个数: cat /proc/cpuinfo |grep "cpu cores"|wc -l 3、逻辑cpu的个数: cat /proc/cpuinfo |grep "processor"|wc -l 物理cpu个数*核数=逻辑cpu个数(不支持超线程技术的情况下) ############## 内存查看 ############# 1、查看内存使用情况: 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很快就会被使用。我们工作时候应该从应用角度来看。 ######## 硬盘查看 ############ 1、查看硬盘及分区信息: fdisk -l 2、查看文件系统的磁盘空间占用情况: df -h 3、查看硬盘的I/O性能(每隔一秒显示一次,显示5次): iostat -x 1 5 iostat是含在套装systat中的,可以用yum -y install systat来安装。 常关注的参数: 如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 如果idle小于70%,I/O的压力就比较大了,说明读取进程中有较多的wait。 4、查看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
转载于:https://my.oschina.net/u/923508/blog/741746
相关推荐
Linux 下常用排查命令 Linux 操作系统提供了许多实用的命令来排查和解决问题。以下是 Linux 下常用排查命令的整理。 用户信息 * `/etc/passwd` 文件用于存储用户信息 * `/etc/shadow` 文件用于存储用户密码信息 *...
在IT行业中,Linux系统是许多车载设备和交通系统的首选操作系统,因为它的稳定性和...总之,熟练掌握这些Linux命令对于车载Linux系统测试和运维工作至关重要,它们能帮助我们高效地进行系统管理、故障排查和性能优化。
"Linux性能调优命令精华"这个主题涵盖了在优化Linux系统性能时常用的命令,这些命令可以帮助我们监控系统状态、诊断问题,并进行必要的调整。 首先,`top`和`htop`命令是实时查看系统资源使用情况的基本工具。`top`...
本压缩包"Linux常用命令-API手册.zip"包含了两个重要的参考资料:"Linux基础命令教程豪华版.chm"和"Linux常用命令大全.chm",它们为用户提供详尽的Linux命令学习指南。 "Linux基础命令教程豪华版.chm"可能是对Linux...
从给定的文件信息中,我们可以提取并生成与IT领域相关的多个知识点,主要围绕Linux常用命令、数据库常用命令,以及Windows环境下VHD虚拟磁盘的管理和数据库连接数的监控与调整。 ### Windows环境下VHD虚拟磁盘管理 ...
这份"Linux常用命令全集"的文档集合,旨在帮助用户理解和熟练运用各种Linux命令,从而更高效地管理系统、进行文件操作、网络通信以及系统维护。 1. **文件与目录操作** - `cd`: 改变当前工作目录,如`cd /home/...
以下是一些关于Linux常用网络命令的知识点,主要集中在标题和描述中提到的几个命令:ifconfig、ifup、ifdown、route和ip。 1. **ifconfig**: - `ifconfig`命令主要用于查看和配置网络接口的参数,如IP地址、子网...
### Linux常用性能诊断工具知识点详解 #### 一、性能概述与标准 - **性能基准**:性能基准是指衡量一个高性能系统的参考数据。它为评估系统的实际表现提供了标准。 - **设计阶段解决性能问题**:在设计阶段就考虑...
通过掌握这些命令,DB2的开发者可以在Linux环境中高效地进行数据库管理、数据操作、故障排查和性能优化。了解并熟练运用这些工具,将极大地提升工作效率。记住,实践是检验真理的唯一标准,多练习才能真正掌握这些...
以上命令是Linux系统中常用的性能监控工具,通过这些命令可以详细了解系统的运行状态、资源使用情况及硬件设备信息,有助于管理员进行有效的系统管理和故障排查。在实际使用中,可以根据具体需求选择合适的命令进行...
### Linux常用命令详解 在深入探索Linux世界的过程中,掌握一系列常用命令是不可或缺的技能。Linux命令行,作为操作系统的核心组成部分,不仅效率高、资源占用低,而且安全性强,尤其在服务器管理和高级用户操作中...
通过学习这个“Linux常用命令手册”,用户不仅可以掌握基本的Linux操作,还能了解如何高效地利用Linux进行系统管理、问题排查以及自动化工作流程。这些知识对于任何想要提升自己在Linux环境中的技能的人来说都是必不...
运维人员需要熟悉更多的命令来有效地完成系统维护、故障排查、性能优化等工作。每个命令都有其特定的选项和参数,通过组合使用这些选项和参数,可以实现更复杂的操作。 例如,`cat` 命令不仅可以显示文件内容,还...
### Linux系统问题排查知识...上述知识点涵盖了问题排查的基本思路和常用工具,有助于提高系统管理员的工作效率,并确保系统的稳定运行。希望读者能够通过学习这些知识点,在实际工作中灵活运用,提升自己的技能水平。
1. **基础命令**:如`cd`(改变目录)、`pwd`(显示当前工作目录)、`ls`(列出目录内容)、`mkdir`(创建目录)、`rm`(删除文件或目录)等,这些都是日常操作中最常用的命令。 2. **文件和目录管理**:包括`touch...
### Linux常用命令详解 Linux作为一款强大的开源操作系统,其丰富的命令行工具是其核心优势之一。对于初学者和资深用户而言,熟练掌握一系列基础至高级的Linux命令是必不可少的技能。以下是从“Linux常用命令PDF”...
这些命令的使用对于系统性能调优和故障排查至关重要。 在用户和组管理方面,`/etc/group`文件存放了用户组信息,`/etc/passwd`文件包含了用户账户信息,而`/etc/shadow`则存放了加密后的用户密码信息。 网络配置是...