Linux: Linux性能调优
- TAGS: Linux
 
/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