Linux Performance
Linux Performance
性能优化相关 from nipengfei https://time.geekbang.org/column/article/69859
CPU
什么是平均负载load
场景1 cpu计算密集型
|
|
|
|
uptime的1m load会发现升高
通过mpstat查看多核cpu情况
|
|
发现存在一个cpu为100%的情况,但是iowait是0%,说明是cpu使用导致的load升高
通过pidstat -u 5 1
|
|
可以很明显找到是stress导致的cpu飙高
场景2 io密集型
|
|
此时使用watch -d uptime发现uptime升高到2.几了
|
|
观察mpstat
|
|
发现cpu没有明显升高,但是iowait存在比较高的情况,load升高是因为io升高导致
使用pidstat查看下
|
|
发现还是stress导致的
场景3 大量进程的情况
stress模拟8个cpu使用的情况
|
|
可以发现load 1m 飙高到接近8,load 5m小于1m表示负载是最近开始飙高,
使用mpstat -P ALL 5查看
|
|
发现大部分cpu都在工作,
使用pidstat -u 5 1查看
|
|
发现%wait很高,表示cpu队列一直在等待,存在慢的进程
cpu上下文切换
程序在运行的时候必须依赖的环境称为CPU上下文。
上下文切换把上一个任务的CPU上下文保存起来,加载新任务的上下文到寄存器和程序计数器中。
上下文切换分为进程上下文切换,线程上下文切换和中断上下文切换。
进程上下文切换
linux按照特权等级,把进程的运行空间分为内核空间和用户空间。对应的ring级别分为ring 0和ring 3。
进程可以在内核空间和用户空间运行,在用户空间时候称为进程处于用户态,而陷入内核空间的时候,
称为进程的内核态。
从用户态到内核态,需要通过系统调用来完成。比如查看文件的时候调用open()打开文件,然后调用read()
读取文件内容,调用write()把内容写到标准输出,最后调用close()关闭文件。
由于在调用前,需要保存用户上下文,调用的时候,切换到对应的内核态指令的位置,调用结束后又会保存内核态的
上下文,再次切换会用户态,所以一次系统调用发生了两次CPU上下文切换。
什么时候会触发上下文切换? 发生进程调度进出的时候
什么时候会发生进程调度?
- 进程结束运行的时候
- 进程的时间片用完
- 系统资源不足
- 进程主动sleep
- 有高优先级进程
- 硬件中断
线程上下文切换
线程是调度的基本单位,进程则是资源拥有的基本单位。linux调度的是线程,而不是进程,进程
提供了包含全局变量,虚拟内存等资源。关于进程和线程:
- 进程只有一个线程的时候,进程等于线程。
- 当进程拥有多个线程的时候,这些线程会共享相同的虚拟内存和全局变量。这些资源在上下文切换
时候无需修改。
- 线程也有自己的私有数据,保存着栈和寄存器中,上下文切换时候需要保存。
线程的上下文切换分为两种:
- 前后线程同属一个进程,此时只需要切换进程的私有数据,全局变量和虚拟内存保持不动。
- 前后线程属于两个进程,切换时候和进程切换上下文一样。
中断上下文切换
比如键盘输入,为了快速响应硬盘事件,中断由于有更高的优先级,会打断进程的运行,转而让cpu处理中断。
中断上下文并不涉及用户态,中断上下文只包括内核态的中断服务必须的状态,包括CPU寄存器、内核堆栈、
硬件中断参数等。
中断一般分为软中断和硬中断。硬中断是硬件发来的让cpu优先处理其请求,比如硬盘按下,
打印机打印,鼠标移动等。软中断比如cpu除以0触发等等,是软件相关的中断。
软中断本质上是利用硬件中断的方式模拟中断通过异步的方式更好地利用cpu。
中断分为上半部和下半部。
上半部优先处理硬件相关时间敏感的工作,下半部通过内核线程处理剩下的工作。
可以查看cat /proc/softirqs发现有11种中断类型。
linux里面把每个cpu的软中断线程标记为ksoftirqd/0等
一般软中断过高可能和网卡流量高有关系。
上下文切换相关命令排查
vmstat查看
man一下vmstat,发现vmstat是对系统比较直观的参数展示,
|
|
|
|
|
|
cswch表示voluntary context switches 自愿上下文切换 无法获取资源,等待资源导致的上下文切换
nvcswch表示non voluntary context switches 非资源上下文切换 时间片使用完等原因,被系统强制调度
使用sysbench模拟多线程调度
|
|
使用vmstat观察cs参数提高
|
|
使用pidstat -u -tw检查线程上下文
|
|
发现sysbench进行上下文切换数量很多
而通过观察/proc/stats也会发现RES部分会明显升高,
|
|
RES指Rescheduling interrupts,指cpu重新调度的中断。
一般来说:
- 自愿上下文切换增多,表示系统依赖其他资源较多,比如内存等存在瓶颈
- 非资源上下文切换增多,说明进程被强制调度,存在CPU争用的情况
- 中断次数变多说明CPU被中断占用,通过/proc/interrupts进行分析
CPU使用率
linux的时间是通过节拍决定
|
|
表示内核程序1s内会触发250次时间节拍中断,用户空间程序的节拍频率的称为USER_HZ,默认是100HZ,即1/100s,对应10ms一次节拍
cpu使用率有几个很重要的参数:
|
|
CPU使用率 = 1 - 空闲时间/总CPU时间
平均CPU使用率 = 1 - (空闲时间2-空闲时间1)/(总CPU时间1-总CPU时间2)
使用perf分析热点函数等
|
|
这里举了一个例子不再详述
CPU使用率100%,如何排查
- 通过ps, pidstat, top等确定高CPU使用率的程序或者命令
- 通过观察监控系统,日志系统确定是最近发生的还是一直有的
比如是否有发布,是否有缩容,实际有流量激增
- 确定具体的应用,观察应用的日志,排查是否是具体的请求等等
- 通过perf或者程序的追踪程序观察热点函数
如果找不到呢?
多观察一下,并且可以通过 perf top
或者 execsnoop
查看,可能是存在短时应用,这些程序在频繁重启等
软中断
中断是系统用来响应硬件设备请求的一种机制,它会打断程序的调度和执行,然后调用对应的中断处理程序来响应设备的请求。
linux将中断分为上半部和下半部。
- 上半部用来快速处理中断,在中断禁止模式下运行,主要处理和硬件相关的或者时间敏感的工作,对应硬件中断
- 下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行,对应软中断,通常名字为Ksoftirqd/CPU编号
硬件中断的统计次数在 /proc/interrupts
, 常见的有时钟中断,磁盘相关的中断,温度事件,显卡等
软件中断的统计次数在 /proc/softirqs
, 常见的有网卡收发相关,定时器相关,任务调度,RCU锁相关
|
|