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