/images/avatar.png

半生戎码

Linux性能优化-内存

内存性能指标

系统内存使用情况

  • 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存。
  • 共享内存是通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实也是一种特殊的缓存。
  • 可用内存是新进程可以使用的最大内存,它包括剩余内存和可回收缓存。
  • 缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度。另一部分,则是 Slab 分配器中的可回收内存。
  • 缓冲区是对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据。这样,内核就可以把分散的写集中起来,统一优化磁盘写入。

进程内存使用情况

  • 虚拟内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等。这里要注意,已经申请的内存,即使还没有分配物理内存,也算作虚拟内存。
  • 常驻内存是进程实际使用的物理内存,不过,它不包括 Swap 和共享内存。
  • 共享内存,既包括与其他进程共同使用的真实的共享内存,还包括了加载的动态链接库以及程序的代码段等。
  • Swap 内存,是指通过 Swap 换出到磁盘的内存。

缺页异常

  • 可以直接从物理内存中分配时,被称为次缺页异常。
  • 需要磁盘 I/O 介入(比如 Swap)时,被称为主缺页异常。

Swap 的使用情况

  • 已用空间和剩余空间很好理解,就是字面上的意思,已经使用和没有使用的内存空间。
  • 换入和换出速度,则表示每秒钟换入和换出内存的大小。

内存性能工具

为了迅速定位内存问题,我通常会先运行几个覆盖面比较大的性能工具,比如 free、top、vmstat、pidstat 等。

Linux性能优化-CPU

各种延时

CPU 性能指标

  1. CPU 使用率
    1. 用户 CPU 使用率, 包括用户态(user)和低优先级用户态(nice). 该指标过高说明应用程序比较繁忙.
    2. 系统 CPU 使用率, CPU 在内核态运行的时间百分比(不含中断). 该指标高说明内核比较繁忙.
    3. 等待 I/O 的 CPU 使用率, iowait, 该指标高说明系统与硬件设备 I/O 交互时间比较长.
    4. 软/硬中断 CPU 使用率, 该指标高说明系统中发生大量中断.
    5. steal CPU / guest CPU, 表示虚拟机占用的 CPU 百分比.
  2. 平均负载
    1. 理想情况下平均负载等于逻辑 CPU 个数,表示每个 CPU 都被充分利用. 若大于则说明系统负载较重.
  3. 进程上下文切换
    1. 包括无法获取资源的自愿切换和系统强制调度时的非自愿切换.
    2. 上下文切换本身是保证 Linux 正常运行的一项核心功能.
    3. 过多的切换则会将原本运行进程的 CPU 时间消耗在寄存器,内核占及虚拟内存等数据保存和恢复上
  4. CPU 缓存命中率
    1. CPU 缓存的复用情况,命中率越高性能越好. 其中 L1/L2 常用在单核,L3 则用在多核中

性能工具

  1. 平均负载案例
    1. 先用 uptime 查看系统平均负载
    2. 判断负载在升高后再用 mpstat 和 pidstat 分别查看每个 CPU 和每个进程 CPU 使用情况.找出导致平均负载较高的进程.
  2. 上下文切换案例
    1. 先用 vmstat 查看系统上下文切换和中断次数
    2. 再用 pidstat 观察进程的自愿和非自愿上下文切换情况
    3. 最后通过 pidstat 观察线程的上下文切换情况
  3. 进程 CPU 使用率高案例
    1. 先用 top 查看系统和进程的 CPU 使用情况,定位到进程
    2. 再用 perf top 观察进程调用链,定位到具体函数
  4. 系统 CPU 使用率高案例
    1. 先用 top 查看系统和进程的 CPU 使用情况,top/pidstat 都无法找到 CPU 使用率高的进程
    2. 重新审视 top 输出
    3. 从 CPU 使用率不高,但是处于 Running 状态的进程入手
    4. perf record/report 发现短时进程导致 (execsnoop 工具)
  5. 不可中断和僵尸进程案例
    1. 先用 top 观察 iowait 升高,发现大量不可中断和僵尸进程
    2. strace 无法跟踪进程系统调用
    3. perf 分析调用链发现根源来自磁盘直接 I/O
  6. 软中断案例
    1. top 观察系统软中断 CPU 使用率高
    2. 查看/proc/softirqs 找到变化速率较快的几种软中断
    3. sar 命令发现是网络小包问题
    4. tcpdump 找出网络帧的类型和来源,确定 SYN FLOOD 攻击导致

根据不同的性能指标来找合适的工具: