作为后端研发人员,了解Linux服务器的性能状态是非常必要的,Linux设计的性能检测命令也很多,如何在最短时间内定位到影响服务器性能的瓶颈,这也是每个研发人员的必备的技能之一。
uptime
以下是uptime
的输出信息:
04:03:58 up 10 days, 13:19, 1 user, load average: 0.54, 0.40, 0.20
其中,0.54, 0.40, 0.20,最近1分钟、5分钟、15分钟系统的负载。
通过这三个数据,可以了解服务器负载是在趋于紧张还是趋于缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里;反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。
系统负载
系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数。如果一个进程满足以下条件就会认为位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态
- 没有被停止
负载高 or 低
一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好。也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重。
dmesg
dmesg命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构、cpu、挂载的硬件,内存等多个层次的系统信息。这也有助于我们排查性能问题。
一般我们会将dmesg
结合命令more
、less
、head
、tail
、grep
等使用,打印出我们需要的信息,或者过滤掉我们不需要的信息。
dmesg | head -20
显示前20行的内核信息dmesg | tail -20
显示后20行的内核信息dmesg | grep sda
搜索包含sda关键字的信息tail -f /var/log/dmesg
或者watch "dmesg | tail"
实时监控dmesg的日志输出
vmstat
vmstat命令每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
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
1 0 2593888 45303876 18504760 37989512 0 0 2 700 0 0 7 2 89 2 0
0 0 2593888 45303964 18504760 37989644 0 0 0 764 11204 21249 3 1 96 0 0
1 0 2593888 45302544 18504760 37989668 0 0 0 184 8455 16237 2 1 97 0 0
3 0 2593888 45303872 18504760 37989692 0 0 0 200 13497 27806 5 1 94 0 0
1 0 2593888 45302944 18504760 37989744 0 0 0 300 26437 53148 12 4 85 0 0
其中,和性能调优相关的信息包括:
r
表示运行和等待CPU时间片的进程数。如果这个数值长期大于机器CPU核数,那么机器的CPU资源已经饱和。free
系统可用内存数(KB为单位),如果剩余内存不足,也会导致系统性能问题。(具体可以看free命令)。si, so
交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足,或者存在内存泄漏了。us, sy, id
这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)。一般来说,id+us+sy=100,如果us长期大于50%,那就要考虑程序优化了;如果us+sy超过80%,就说明CPU的资源存在不足。wa
表示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。
mpstat
mpstat(Multiprocessor Statistics)最大的特点是可以查看多核心cpu中每个计算核心的统计数据;而上述的vmstat只能查看系统整体cpu情况。以下命令是每2秒更新一次,查看多核CPU核心的当前运行状况信息:
mpstat -P ALL 2
19:43:58 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
19:43:59 all 0.00 0.00 0.04 0.00 0.00 0.00 0.00 0.00 99.96
19:43:59 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
19:43:59 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
.......
19:43:59 13 0.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.01
19:43:59 14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
19:43:59 15 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
如果有一个CPU占用率特别高,那么我们可以推断有可能是一个单线程应用程序引起的。
pidstat
pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。
pidstat 1
Linux 2.6.32.12-0.7-default (linux) 06/18/12 _x86_64_
11:37:19 PID %usr %system %guest %CPU CPU Command
……
11:37:19 11452 0.00 0.00 0.00 0.00 2 bash
11:37:19 11509 0.00 0.00 0.00 0.00 3 dd
执行pidstat 1
,将以采样间隔1s,输出系统启动后所有活动进程的cpu统计信息,等同于pidstat -u 1
常用命令如下:
pidstat -u 1
采样周期1s, 输出所有活动进程的CPU统计信息pidstat -u -p 2938 1
采样周期1s, 输出进程号为2938的CPU统计信息(通过-p指定进程,下述的内存、磁盘IO统计类似)pidstat -r 1
采样周期1s, 输出所有活动进程的内存统计信息pidstat -d 1
采样周期1s, 输出所有活动进程的磁盘IO统计信息