加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

11/11 12:20
1062
阅读需 9 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

相关推荐

电子产业图谱

机械转行IT狗,目前在阿里巴巴淘宝事业群。日常记录Linux应用开发、嵌入式操作系统、无线网络协议栈。刚深入使用Java,跟大家一起入门交流。