01 | 如何学习Linux性能优化?
1、Linux 性能工具图谱
2、思维导图
02 | 基础篇:到底应该怎么理解“平均负载”?
1、查看平均负载
top 或者 uptime 命令
$ uptime 02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88
依次则是过去 1 分钟、5 分钟、15 分钟的平均负载
2、平均负载
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数。例如,当平均负载为 2 时,在有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用
其中,可运行状态是指正在使用 CPU 或者正在等待 CPU 的进程,也就是ps 命令处于 R 状态(Running 或 Runnable)的进程;不可中断状态是指正处于内核态不可打断流程中的进程,,也就是ps 命令中的 D 状态的进程
当平均负载高于 CPU 数量 70% 的时候就应该分析排查负载高的问题了
3、平均负载和CPU利用率
平均负载不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程
CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应
case:
1)CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
2)I/O 密集型进程,等待 I/O 会导致平均负载升高,但 CPU 使用率不一定很高;
3)大量进程堆积,等待 CPU调度会导致平均负载升高,此时的 CPU 使用率也会比较高
4、实践:stress 和 sysstat
1)stress 是一个 Linux 系统压力测试工具,用作异常进程模拟平均负载升高的场景。
sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。这个包的两个命令 mpstat 和 pidstat:
mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标
pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标
2)case排查
CPU密集型进程case:
mpstat,观察是否有某个cpu的%usr会很高,%iowait很低
pidstat,观察哪个进程%cpu很高,%wait很低,极有可能就是这个进程导致cpu飚高
IO密集型进程case:
mpstat,观察是否有某个cpu的%iowait很高,同时%usr也较高
pidstat,观察哪个进程%wait较高,同时%CPU也较高,极有可能就是这个进程导致cpu飚高
大量进程case:
pidstat,观察%wait较高的进程是否有很多
03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)
1、CPU上下文
CPU 上下文:包括CPU 寄存器和程序计数器
**CPU 上下文切换:**先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的CPU上下文,运行新任务
根据任务的不同,CPU 的上下文切换就可以分为几个不同的场景:进程上下文切换、线程上下文切换以及(硬件)中断上下文切换
**为什么大量进程切换导致CPU负载增高?**过多的上下文切换,会把 CPU 时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶
2、进程上下文
系统调用:一次系统调用的过程发生了两次 CPU 上下文切换(系统调用过程中一直是同一个进程在运行)
进程上下文:虚拟内存、栈、全局变量等用户空间的资源和**内核堆栈、CPU寄存器、程序计数器(CPU上下文)**等内核空间的资源
进程上下文切换:从一个进程切换到另一个进程运行;保存当前进程的上下文,加载下一进程的上下文(比CPU上下文切换多用户空间资源的切换)
进程切换的触发条件:CPU轮转、进程所需系统资源不足(比如内存不足)、睡眠函数 sleep 主动挂起、硬件中断、进程优先级抢占等
3、线程上下文
当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源;另外,线程也有自己的私有数据,比如栈和寄存器等
切换的属于同一个进程两个线程:虚拟内存、全局变量不切换,只需要**切换线程的私有数据栈、和内核堆栈、CPU寄存器、程序计数器(CPU上下文)**等不共享的数据
所以,线程切换损耗比进程小很多
4、中断上下文
中断上下文切换:不涉及到进程的用户态,不需要保存和恢复进程的虚拟内存、全局变量等用户态资源。只包括内核态中断服务程序执行所必需的状态,包括 CPU 寄存器、内核堆栈、硬件中断参数等。
04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
1、系统上下文切换查看
vmstat 工具
cs(context switch)是每秒上下文切换的次数
in(interrupt)则是每秒中断的次数
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数
b(Blocked)则是处于不可中断睡眠状态的进程数
2、进程上下文切换查看
要想查看每个进程的详细情况,就需要使用 pidstat加上 -w 选项,有两列内容是我们的重点关注对象
一个是 cswch ,表示每秒自愿上下文切换的次数。是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足;
另一个则是 nvcswch ,表示每秒非自愿上下文切换的次数。是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU
自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型
3、排查过程总结
首先通过uptime查看系统负载
然后使用mpstat结合pidstat来初步判断到底是cpu计算量大还是进程争抢过大或者是io过多
接着使用vmstat分析切换次数,以及切换类型,来进一步判断到底是io过多导致还是进程争抢激烈导致
05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
1、CPU 使用率
/proc/stat 提供的就是系统的 CPU 和任务统计信息
CPU 使用率相关的重要指标:
user(通常缩写为 us),代表用户态 CPU 时间
nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低
system(通常缩写为 sys),代表内核态 CPU 时间
idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间
iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比
2、查看
top 显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况。ps 则只显示了每个进程的资源使用情况
top 并没有细分进程的用户态 CPU 和内核态 CPU。那要怎么查看每个进程的详细情况呢? pidstat
3、perf
perf 是 Linux 2.6.31 以后内置的性能分析工具。它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。