必须了解的Linux性能基础知识( 四 )


如果 CPU 所操作的数据在缓存中,则可以直接读取,称为缓存命中 。命中缓存可以带来很大的性能提升 。因此,考虑 CPU 的缓存命中率对于 linux 性能也至关重要 。
查看系统的内存情况,可通过 top 或 free 命令 。比如,free 命令输出格式为:
$ freetotalusedfreesharedbufferscachedMem:989792489756225214169960147800062018692Swap:000输出分别是物理内存 Mem 和交换分区 Swap 的使用情况 。其中,每一列分别是:

  • total ,总内存大小 。
  • used,已使用内存的大小 。
  • free,未使用的内存大小 。
  • shared,共享内存的大小 。
  • buffers/cached,缓存和缓冲区的大小
查看 buffers 和 cache 的变化情况,可通过 vmstat 命令,输出格式:
$ vmstat 1 1procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- rbswpdfreebuffcachesisobiboincs us sy id wa 900 1571640 1478044 6203479200011200 738 190
  • buffer 和 cache 就是上面所说的缓存和缓冲区的大小,单位为 KB 。
  • bi 和 bo 分别表示块设备读取和写入的大小,单位为块 / 秒 。linux 中块的大小是 1KB,故单位等价于 KB/s 。
实践下面就目前机器出现的系统使用率过高的情况进行排查 。
通过 top 可以查看当前的系统性能情况:
$ toptop - 16:41:29 up 285 days,5:59,2 users,load average: 9.82, 11.53, 12.92Tasks: 2010 total,9 running, 2000 sleeping,0 stopped,1 zombieCpu(s): 34.5%us,6.5%sy,0.0%ni, 57.6%id,0.5%wa,0.0%hi,0.9%si,0.0%stMem:98979248k total, 97548032k used,1431216k free,1478084k buffersSwap:0k total,0k used,0k free, 62122812k cachedPID USERPRNIVIRTRESSHR S %CPU %MEMTIME+COMMAND13159 user200 9128m 6.1g13m S906.5 160516:12 mongod19638 root200929m 882m520 R580.90:01.81 supervisord...CPU用户使用率为 34.5%,系统使用率为 6.5%,空闲时间占 57.6%,系统使用流畅 。可以看出,当前的系统是比较空闲的 。
然后,我执行某些操作 。再通过 top 命令查看当前的系统性能情况:
$ topTasks: 2020 total,16 running, 2004 sleeping,0 stopped,0 zombieCpu(s): 64.5%us, 13.6%sy,0.0%ni, 20.5%id,0.2%wa,0.0%hi,1.1%si,0.0%stMem:98979248k total, 98003524k used,975724k free,1478128k buffersSwap:0k total,0k used,0k free, 62228740k cachedPID USERPRNIVIRTRESSHR S %CPU %MEMTIME+COMMAND13159 user200 9128m 6.2g13m S2496.5 160538:08 mongod15108 root200929m 882m620 R730.90:02.24 supervisord15121 root200929m 882m620 R660.90:02.03 supervisord15122 root200929m 882m620 R660.90:02.03 supervisord...可以发现,系统使用率已经增至了原来的一倍 。CPU使用率除了服务 mongod 最高以外,有几个 supervisord 启动的服务也出现了CPU使用率增高的情况 。通过 pidstat 命令分析这些进程的系统资源占用情况:
$ pidstat -p 15108Linux 3.2.0-23-generic (cs)06/26/2021_x86_64_(24 CPU)05:03:14 PMPID%usr %system%guest%CPUCPUCommand发现该进程并没有输出任何的资源使用信息 。是 pidstat 指令出故障了?可以通过 ps 指令来交叉确认一下:
$ ps aux | grep 151082003142110.00.08748948 pts/2S+17:070:00 grep --color=auto 15108确实没有输出 。现在发现问题了,原来是进程已经不存在了,所以 pidstat 没有任何输出 。继续分析其他几个高 CPU使用率的进程,发现亦如此 。既然进程没有了,那么性能问题应该已经没有了吧 。通过 top 命令确认下:
$ topTasks: 2019 total,18 running, 2001 sleeping,0 stopped,0 zombieCpu(s): 60.5%us, 13.4%sy,0.0%ni, 24.7%id,0.4%wa,0.0%hi,1.1%si,0.0%stMem:98979248k total, 98118260k used,860988k free,1478272k buffersSwap:0k total,0k used,0k free, 62353676k cachedPID USERPRNIVIRTRESSHR S %CPU %MEMTIME+COMMAND13159 user200 9129m 6.2g13m S2606.5 160559:54 mongod27114 root200929m 882m580 R630.90:01.94 supervisord27145 root200929m 882m600 R600.90:01.87 supervisord...好像问题依旧存在,系统CPU使用率依旧很高 。仔细查看 top 的输出,发现 supervisord 进程的 pid 每次都有变化,现在已经变成了 27114 。进程的 PID 号在变化,说明了什么?有两点:
  • 进程在不断的重启,比如因为段错误、配置错误等,进程退出后可能又被监控系统重启了 。
  • 这些进程都是短时进程 。这些进程一般只运行很短时间结束,很难通过 top 发现 。
supervisor 是一个进程管理程序,能够监控进程状态,异常退出时能自动重启 。目前看来,极有可能是第一种情况 。通过 supervisor 来查看服务状态:


推荐阅读