《Linux性能优化实战》读书笔记

887 阅读7分钟

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 以后内置的性能分析工具。它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。