Linux: Linux性能调优

参考:RedHat7性能调优指南

/proc

man proc  #yum install -y man-pages

/proc/interrupts 中断

]# cat /proc/interrupts 
           CPU0       CPU1      # 下面的数字表示该 CPU 处理对应中断的次数
  0:        173          0   IO-APIC-edge      timer
  1:         10          0   IO-APIC-edge      i8042
  4:        845          0   IO-APIC-edge      serial
  6:          3          0   IO-APIC-edge      floppy
  8:          0          0   IO-APIC-edge      rtc0
  9:          0          0   IO-APIC-fasteoi   acpi
 11:          0          0   IO-APIC-fasteoi   virtio4
 12:        145          0   IO-APIC-edge      i8042
 24:          0          0   PCI-MSI-edge      virtio1-config
 25:    6796881          0   PCI-MSI-edge      virtio1-req.0
 26:          1          0   PCI-MSI-edge      virtio3-config
 27:   26332543          0   PCI-MSI-edge      virtio3-input.0
 28:          1          1   PCI-MSI-edge      virtio3-output.0
 29:   26803569          0   PCI-MSI-edge      virtio3-input.1
 30:          1          1   PCI-MSI-edge      virtio3-output.1
 31:          0          0   PCI-MSI-edge      virtio0-config
 32:         18          0   PCI-MSI-edge      virtio0-virtqueues
 33:          0          0   PCI-MSI-edge      virtio2-config
 34:    8613132          0   PCI-MSI-edge      virtio2-req.0
NMI:          0          0   Non-maskable interrupts
LOC: 2380300390 2354775288   Local timer interrupts
SPU:          0          0   Spurious interrupts
PMI:          0          0   Performance monitoring interrupts
IWI:   53584258   51869630   IRQ work interrupts
RTR:          0          0   APIC ICR read retries
RES:  412948474  438744482   Rescheduling interrupts         #重调度中断.表示唤醒空闲状态的 CPU 来调度新的任务运行
CAL:        472       1831   Function call interrupts
TLB:   27161827   27183592   TLB shootdowns
TRM:          0          0   Thermal event interrupts
THR:          0          0   Threshold APIC interrupts
DFR:          0          0   Deferred Error APIC interrupts
MCE:          0          0   Machine check exceptions
MCP:      21612      21612   Machine check polls
ERR:          0
MIS:          0
PIN:          0          0   Posted-interrupt notification event
NPI:          0          0   Nested posted-interrupt event
PIW:          0          0   Posted-interrupt wakeup event

标准中断行(例如,来自硬件设备)

格式为: IRQ号: CPU0计数 CPU1计数 … 中断控制器类型 触发方式 设备名称

  • IRQ 号: 中断请求线编号。一些 IRQ 是标准的:
    • 0: 系统计时器(timer)
    • 1: i8042 键盘控制器(通常是键盘)
    • 4: 串口 1 (COM1)
    • 8: 实时时钟 (RTC)
    • 9: ACPI(高级配置与电源接口)
    • 12: i8042 鼠标控制器(通常是 PS/2 鼠标)
    • 14 / 15: 主/从 IDE 通道(或现代的 SATA 控制器)
  • CPUx 计数: 每个 CPU 核心处理该中断的次数。观察这些数字可以帮助判断中断负载是否均衡。例如,网卡(enp0s31f6)的中断被多个CPU 处理,这是现代网卡多队列(RSS)的特性,有助于提升网络性能。
  • 中断控制器: 处理该中断的硬件芯片。
    • IO-APIC: 高级可编程中断控制器,是现代 x86 系统的标准。
    • PCI-MSI / PCI-MSI-X: 基于消息的中断,性能更好,是现代 PCI/PCIe 设备(如网卡、显卡)的首选。
  • 触发方式:
    • edge: 边沿触发(中断在信号变化时触发)。
    • level: 电平触发(中断在信号保持电平时触发)。
    • fasteoi: 一种与 APIC 结合使用的优化处理方式。
  • 设备名称: 注册该中断的设备驱动名称。这是识别中断来源的最直观信息。例如:
    • timer: 系统定时器
    • i8042: 键盘/鼠标控制器
    • ehci_hcd:usb1: USB 2.0 主机控制器
    • uhci_hcd:usb2: USB 1.1 主机控制器
    • enp0s31f6: 以太网卡(这里的名称是 systemd 的命名方式)
    • i915: Intel 集成显卡驱动
    • nvme: NVMe SSD 驱动器
    • ahci: SATA 控制器
  • 特殊中断(非数字 IRQ)
    • 这些是内核内部使用的软件中断或特殊硬件中断,它们没有标准的 IRQ 号。
    • NMI: 不可屏蔽中断。用于处理严重的硬件错误,通常这些数字不应该增长。
    • LOC: 本地定时器中断。这是每个 CPU 核心自己产生的定时器中断,用于处理进程调度等任务。这个值会非常高并且持续增长,这是正常的。
    • RES: 重调度中断。当一个 CPU 核心需要通知另一个核心进行进程调度(负载均衡)时触发。在多核系统中,这个值会增长。
    • CAL: 函数调用中断。用于实现 SMP 系统上的函数调用。
    • TLB: TLB 刷新中断。
    • IWI: IRQ 工作中断。用于在中断上下文中延迟执行一些任务。
    • MCE: 机器检查异常(严重的硬件错误,如 CPU 缓存错误)。

案例

CPU-怎么分析和排查上下文切换问题

步骤

#首先通过uptime查看系统负载
uptime #查看系统负载

#然后使用mpstat结合pidstat来初步判断到底是cpu计算量大还是进程争抢过大或者是io过多
mpstat -P ALL 3 #系统整体情况。每个CPU当前整体状态
                      #%irq  显示一个CPU或多个CPU服务硬件中断花费时间的百分比。
                      #%soft   显示一个CPU或多个CPU服务软件中断花费时间的百分比。
pidstat -w -u 1#每隔1秒输出1组数据,-w 查看每个进程上下文切换。-u参数则表示输出CPU使用指标
                   #关注:cswch/s 每秒自愿上下文切换 和 nvcswch/s 每秒非自愿上下文切换
pidstat -wt 1 #每隔1秒输出一组数据.-wt 参数表示输出线程的上下文切换指标

#分析切换次数、类型
vmstat 1 1 #间隔1秒后输出1组数据
                #关注:cs 上下文切换次数; in 中断次数; r 和 b 即就绪队列的长度 和处于不在中断睡眠状态的进程数
#中断情况,观察重调度中断RES(Rescheduling interrupts)
watch -d 'cat /proc/interrupts | sort -nr -k 2 '

模拟测试工具

  • stress : 模拟进程 、 io
  • sysbench : 模拟线程数
#以10个线程运行5分钟的基准测试,模拟多线程切换的问题
sysbench --threads=10 --max-time=300 threads run

#centos/rocky 设置下max-requests,默认max-requests是1w所以很快就结束了
sysbench --num-threads=10 --max-time=300 --max-requests=10000000 --test=threads run
emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike