1 分钟内对 Linux 进行性能诊断的10 个命令

2021-08-31 18:00 PHP开源社区
点击进入“PHP开源社区”    
免费获取进阶面试、文档、视频资源
PHP开源社区
PHP开源社区
免费提供10GPHP进阶架构师学习教程,关注即可免费领取。每天推送PHP最新资讯技术文章。
84篇原创内容
公众号

当你发现 Linux 服务器上的系统性能问题,在最开始的 1 分钟时间里,你会查看哪些系统指标呢?

Netflix 在 AWS 上有着大规模的 EC2 集群,以及各种各样的性能分析和监控工具。比如我们使用 Atlas 来监控整个平台,用 Vector 实时分析 EC2 实例的性能。这些工具已经能够帮助我们解决大部分的问题,但是有时候我们还是要登录进机器内部,用一些标准的 Linux 性能分析工具来定位问题。

在这篇文章里,Netflix 性能工程团队会介绍一些我们使用的标准的 Linux 命令行工具,在发现问题的前 60 秒内去分析和定位问题。在这 60 秒内,你可以使用下面这 10 个命令行了解系统整体的运行情况,以及当前运行的进程对资源的使用情况。在这些指标里面,我们先关注和错误、以及和资源饱和率相关的指标,然后再看资源使用率。相对来讲,错误和资源饱和率比较容易理解。饱和的意思是指一个资源(CPU,内存,磁盘)上的负载超过了它能够处理的能力,这时候我们观察到的现象就是请求队列开始堆积,或者请求等待的时间变长。

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 包。通过这些命令行的使用,你可以熟悉一下分析系统性能问题时常用的一套方法或者流程:USE 。这个方法主要从资源使用率(Utilization)、资源饱和度(Satuation)、错误(Error),这三个方面对所有的资源进行分析(CPU,内存,磁盘等等)。在这个分析的过程中,我们也要时刻注意我们已经排除过的资源问题,以便缩小我们定位的范围,给下一步的定位提供更明确的方向。

下面的章节对每个命令行做了一个说明,并且使用了我们在生产环境的数据作为例子。对这些命令行更详细的描述,请查看相应的帮助文档。

1. uptime

$ uptime  08:28:50 up  1:54,  1 user,  load average: 0.70, 0.26, 0.25

这个命令能很快地检查系统平均负载,你可以认为这个负载的值显示的是有多少任务在等待运行。在 Linux 系统里,这包含了想要或者正在使用 CPU 的任务,以及在 io 上被阻塞的任务。这个命令能使我们对系统的全局状态有一个大致的了解,但是我们依然需要使用其它工具获取更多的信息。

这三个值是系统计算的 1 分钟、5 分钟、15 分钟的指数加权的动态平均值,可以简单地认为就是这个时间段内的平均值。根据这三个值,我们可以了解系统负载随时间的变化。比如,假设现在系统出了问题,你去查看这三个值,发现 1 分钟的负载值比 15 分钟的负载值要小很多,那么你很有可能已经错过了系统出问题的时间点。

在上面这个例子里面,负载的平均值显示 1 分钟为 30,比 15 分钟的 19 相比增长较多。有很多原因会导致负载的增加,也许是 CPU 不够用了;vmstat 或者 mpstat 可以进一步确认问题在哪里。

2. dmesg | tail

$ dmesg | tail [  906.272650] RDX: 0000000002c2a270 RSI: 0000000002bc45d0 RDI: 0000000002d4aec0[  906.272651] RBP: 0000000002b5b850 R08: 0000000000000002 R09: 0000000000000013[  906.272652] R10: 0000000001920b02 R11: 0000000000000246 R12: 0000000000000001[  906.272653] R13: 0000000000000001 R14: 00007ffefbcd05d0 R15: 0000000000000000[ 4109.039186] qtcreator[7032]: segfault at 60 ip 0000000000000060 sp 00007ffe974d9ed8 error 14 in qtcreator[400000+19000][ 4109.042406] Code: Unable to access opcode bytes at RIP 0x36.[ 4112.078331] e1000: ens33 NIC Link is Down[ 4118.138850] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None[ 4767.415158] e1000: ens33 NIC Link is Down[ 4771.529478] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None

这个命令显示了最新的几条系统日志。这里我们主要找一下有没有一些系统错误会导致性能的问题。上面的例子包含了 oom-killer 以及 TCP 丢包。

不要略过这一步!dmesg 永远值得看一看。

3. vmstat 1

$ vmstat 1 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b 交换 空闲 缓冲 缓存   si   so    bi    bo   in   cs us sy id wa st 1  0 842288 954440  71372 1720816   27  117   357   433  181  374  8  3 88  0  0 1  0 842288 954432  71372 1720864    0    0     0    96  246  483  2  1 97  0  0 0  0 842288 954432  71372 1720864    0    0     0     0  215  432  2  1 97  0  0 1  0 842288 954432  71372 1720864    0    0     0     0  160  412  1  1 98  0  0 0  0 842288 954432  71372 1720864    0    0     0     0  554 1078  5  1 95  0  0

vmstat 展示了虚拟内存、CPU 的一些情况。上面这个例子里命令行的 1 表示每隔 1 秒钟显示一次。在这个版本的 vmstat 里,第一行表示了这一次启动以来的各项指标,我们可以暂时忽略掉第一行。

需要查看的指标:

  • r:处在 runnable 状态的任务,包括正在运行的任务和等待运行的任务。这个值比平均负载能更好地看出 CPU 是否饱和。这个值不包含等待 io 相关的任务。当 r 的值比当前 CPU 个数要大的时候,系统就处于饱和状态了。
  • free:以 KB 计算的空闲内存大小。
  • si,so:换入换出的内存页。如果这两个值非零,表示内存不够了。
  • us,sy,id,wa,st:CPU 时间的各项指标(对所有 CPU 取均值),分别表示:用户态时间,内核态时间,空闲时间,等待 io,偷取时间(在虚拟化环境下系统在其它租户上的开销)

把用户态 CPU 时间(us)和内核态 CPU 时间(sy)加起来,我们可以进一步确认 CPU 是否繁忙。等待 IO 的时间 (wa)高的话,表示磁盘是瓶颈;注意,这个也被包含在空闲时间里面(id), CPU 这个时候也是空闲的,任务此时阻塞在磁盘 IO 上了。你可以把等待 IO 的时间(wa)看做另一种形式的 CPU 空闲,它可以告诉你 CPU 为什么是空闲的。

系统处理 IO 的时候,肯定是会消耗内核态时间(sy)的。如果内核态时间较多的话,比如超过 20%,我们需要进一步分析,也许内核对 IO 的处理效率不高。

在上面这个例子里,CPU 时间大部分都消耗在了用户态,表明主要是应用层的代码在使用 CPU。CPU 利用率 (us + sy)也超过了 90%,这不一定是一个问题;我们可以通过 r 和 CPU 个数确定 CPU 的饱和度。

4. mpstat -P ALL 1

$ mpstat -P ALL 1 Linux 5.13.0-051300-generic (linuxmi)   2021年08月28日   _x86_64_  (2 CPU)
08时34分10秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle08时34分11秒 all 2.58 13.40 6.19 0.00 0.00 0.00 0.00 0.00 0.00 77.8408时34分11秒 0 4.21 0.00 2.11 0.00 0.00 0.00 0.00 0.00 0.00 93.6808时34分11秒 1 1.01 26.26 10.10 0.00 0.00 0.00 0.00 0.00 0.00 62.63[...]

这个命令把每个 CPU 的时间都打印出来,可以看看 CPU 对任务的处理是否均匀。比如,如果某一单个 CPU 使用率很高的话,说明这是一个单线程应用。

5. pidstat 1

$ pidstat 1 Linux 5.13.0-051300-generic (linuxmi)   2021年08月28日   _x86_64_  (2 CPU)
08时35分46秒 UID PID %usr %system %guest %wait %CPU CPU Command08时35分47秒 130 1392 0.00 0.92 0.00 0.00 0.92 1
本文章转载自公众号:phpopensource

首页 - PHP 相关的更多文章: