主要方便排查系统问题,了解性能优化的思路和方法,掌握常用的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查看哪些端口在进行监听,