Linux系统性能问题排查思路(面试必备)

主要方便排查系统问题,了解性能优化的思路和方法,掌握常用的 linux 性能工具。

CPU

常用的分析 CPU 使用情况的工具包括 top 、 ps 和 pidstat ,特点为:

top显示系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况。

ps显示每个进程的运行和资源使用情况。

pidstat 分析每个进程 CPU 使用情况。

排查 CPU 使用率问题时,需要区分用户 CPU 、系统 CPU 、等待I/O CPU、软中断和硬中断等,用户 CPU过高一般是进程性能问题,系统 CPU 过高一般是系统调用的性能问题, IO 等待的 CPU 过高一般是网络/磁盘 IO 问题,中断占用 CPU 过高可能是中断服务程序问题。

平均负载

uptime 或者 top 可以查看系统平均负载,平均负载指当前平均活跃进程数。

$ uptime

9:12 up 22:16, 2 users, load averages: 1.38 1.47 1.57

负载分析流程

首先使用 top 查看平均负载,然后查看服务器有几个 CPU :

grep ‘model name’ /proc/cpuinfo | wc -l

一般可以在 zabbix 监控上配置平均负载高于 CPU 数量80%时告警。

看平均负载是否超过 CPU 核数。

看上下文切换是否过多。

看 CPU 缓存命中率。

看进程状态,如 running 状态、 sleep 状态。

CPU 使用率与负载的区别

CPU 使用率,是单位时间内 CPU 使用情况的统计,跟平均负载并不一定完全对应。比如:

CPU 密集型进程,使用大量 CPU 会导致平均负载升高,或者大量等待 CPU 的进程调度也会导致平均负载升高,此时这两者是一致的;

I/O密集型进程,等待I/O也会导致平均负载升高,但 CPU 使用率不一定很高;

iowait 分析点

Top 中 iowait 很高,但是用户 cpu 和系统 cpu 占用率很低,详情中每个进程的 cpu 占用率也很低,这种一般是存在 IO 密集型进程,使用pidstat -d看看进程磁盘 IO 读写情况,sar -n查看网络 IO 读写情况,磁盘 IO 高说明可能存在绕过缓存直接读文件,网络 IO 高说明可能出现网卡接收发送队列阻塞,或者 SYN 攻击之类。

CPU使用率分析流程

用top/uptime,查看系统的平均负载;在平均负载升高后,用 mpstat 和pidstat ,观察每个每个进程的CPU使用情况和 iowait ,进而找出导致平均负载升高的进程。

用vmstat,查看系统的上下文切换次数和中断次数;然后通过pidstat ,观察进程的自愿上下文切换和非自愿上下文切换情况;通过pidstat ,观察线程的上下文切换情况,找到上下文切换次数增多的进程。

用top,查看系统和进程的 CPU 使用情况,再用perf top,实时观察占用CPU资源最多的函数。 top 除了看平均负载变化情况、僵尸进程数量、 iowait 情况、 CPU 占用率,还可以查看是否有进程长期处于不可中断状态(表示 IO 负载过高)。

top 观察 tasks 有多少个 running 状态任务,然后查看任务列表里具体处于 R 状态和 S 状态的任务。如果某个进程 PID 一直在变,说明可能某个应用程序一直在重启。这种短时进程需要使用 pstree 找到父进程,然后查看父进程是否正确处理,比如注册 SIGCHLD 信号和调用 waitpid 接口。对于短时进程,如果top/pidstat抓取不到 CPU 占用率过高的现场,可以通过 perf record和perf report进行采集。

短时进程存在的原因,可能是某个应用程序因为什么原因不停重启,或者某个应用不停在创建新进程并销毁,这种情况需要查看其父进程的行为。 pstree 可以获取进程父子关系。一般进程不停重启的原因可能是端口被占用,或者读写某个文件/目录缺乏权限。另外 ptree 展开进程树,可以发现僵尸进程。

strace -p pid可以查看指定进程的系统调用,如果 strace 失败,可能是进程状态异常,也可能是某些行为是父进程/子进程造成的,可以使用-f来追踪。

pidstat 使用-w参数可以查看进程切换情况,结合/proc/interrupts文件可以查看具体硬中断情况。

使用 shell 命令排查问题时,echo $?可以打印上一条命令的返回值是否为 0 ,从而确认命令是否执行成功。

内存

free 查看系统内存情况, top 、 ps 查看进程内存使用情况。

vmstat 可以观察内存变化情况,包括 free 、 buffer 、 cache ,另外 sar 也可以观察内存变化情况。

观察top, cpu 使用率低,而 iowait 高,说明可能进程 IO 密集型,这时候使用iostat看一看磁盘 IO ,pidstat -d和 iotop 观察进程 IO 情况,使用 strace 观察系统调用情况, lsof 观察进程打开的端口、文件等:lsof -p PID;

另外,缓冲和延迟写也可能导致捕捉不到write系统调用,但可能存在大量的数据在缓冲区中等待写入。

numa 对内存回收也有影响,默认多个 node 共享剩余内存分配。

通用内存问题分析思路:

先用free和 top 命令,查看系统整体的内存使用情况;

再用vmstat和 pidstat ,查看一段时间的趋势,从而判断出内存问题的类型。

最后进行针对性分析,比如内存分配分析、缓存/缓冲区分析、具体进程的内存使用分析 pmap 等。

OOM监控问题

如果监控大盘显示内存水位低却发生了 OOM ,大概率是监控频率太低,因为如果内存在短时间内暴涨,秒级尖刺体现到分钟级监控上很可能被平均值抹平。

软中断

/proc/softirqs文件可以查看具体软中断情况,使用 watch 可以实时查看软中断数据包处理情况:watch -d cat /proc/softirqs

sar -n可以用来查看指定的网卡网络数据包收发情况,不仅可以观察网络收发的吞吐量BPS(每秒收发的字节数),还可以查看网络收发的PPS(每秒收发的网络帧数)。

根据 rxpck 和 rxkB 的对比可以判断是否有大量小包,比如可以确认是否有网络攻击。 tcpdump 查看哪些端口在进行监听,

8