负载排查和分析四

news/2025/9/22 13:28:56/文章来源:https://www.cnblogs.com/tiantao36/p/19105038

负载排查和分析四

明白,我给你提供完整整合后的最终文档版本,把软/硬中断触发机制、背景、流程、表格全部补充进去,保持原有网络优化、Perf 分析、脚本和流程图不变。


Linux 网络优化与性能分析完全指南(最终完整版)


1️⃣ 中断与软中断基础

1.1 中断(IRQ)概念

  • 定义:CPU 在执行任务时,外设或内核事件请求 CPU 立即响应。

  • 作用:保证系统及时响应硬件或内核事件。


1.2 硬中断(Hard IRQ)

背景

硬中断由硬件设备发起,目的是让 CPU 立即响应外设事件,典型场景包括:

  • 网络接口卡(NIC)收到数据包 → 网络收包中断

  • 磁盘 I/O 完成 → 磁盘控制器中断

  • 定时器到期 → 系统定时器中断

触发流程

硬件事件发生│▼
中断控制器接收请求 (APIC/IO-APIC)│▼
CPU 当前执行上下文被打断│▼
中断向量表定位中断服务程序 (ISR)│▼
ISR 执行快速处理 (top half)│▼
触发软中断/调度延迟任务 (bottom half)

查看

cat /proc/interrupts

内核触发示例(模拟硬中断)

// 内核模块中触发硬中断
generic_handle_irq(irq_number);
  • 用户态:❌ 不能直接触发硬中断

  • 内核态:✅ 可模拟触发(仅 ISR,不产生真实硬件事件)


1.3 软中断(Soft IRQ)

背景

硬中断完成后,为了 减轻 ISR 压力、分散 CPU 处理任务,内核将部分工作延迟到软中断执行。典型应用:

  • 网络数据包接收处理(NET_RX_SOFTIRQ)

  • 定时器、调度任务

  • block I/O 完成处理

触发流程

硬中断 ISR 执行完成│▼
ISR 调用 raise_softirq(softirq_type)│▼
软中断挂起,等待 ksoftirqd 调度│▼
ksoftirqd 内核线程执行延迟任务 (bottom half)

查看

cat /proc/softirqs

内核触发示例

// 内核中触发网络软中断
raise_softirq(NET_RX_SOFTIRQ);
  • 用户态:❌ 不可直接触发

  • 内核态:✅ 可以触发,用于驱动调试或延迟任务测试


1.4 硬/软中断关联与触发对比

  • 触发顺序
    硬件事件 → 硬中断触发 CPU → 完成快速处理 → 触发软中断 → ksoftirqd 执行延迟任务

  • 优化方向

    • 硬中断:IRQ 绑核

    • 软中断:RPS/RFS 分发到多核

项目硬中断(Hard IRQ)软中断(Soft IRQ)
来源 硬件事件 硬中断完成后由内核触发
用户态触发
内核态触发 generic_handle_irq() raise_softirq()
执行上下文 CPU 当前上下文 ksoftirqd 内核线程
优先级
典型用途 网络收包、磁盘 I/O、定时器 网络包处理、调度延迟任务、I/O 完成处理
调试/模拟用途 内核驱动测试 内核延迟任务调试、RPS/RFS 调优

2️⃣ 网络优化基础

2.1 网卡 Offload

  • 作用:减轻 CPU 负载,让网卡处理部分网络协议。

  • 参数:TSO/GSO/GRO

  • 查看

ethtool -k eth0
  • 开启

ethtool -K eth0 tso on gso on gro on

2.2 IRQ 绑核

  • 作用:将硬中断绑定到指定 CPU,提高多核性能。

  • 设置

echo 2-15 > /proc/irq/<IRQ>/smp_affinity_list

2.3 RPS / RFS(软中断分发)

  • 作用:将软中断分发到多核,提高网络吞吐量。

  • 查看

cat /sys/class/net/eth0/queues/rx-*/rps_cpus
cat /sys/class/net/eth0/queues/rx-*/rps_flow_cnt

2.4 TCP/UDP Buffer

  • 作用:增大内核缓冲区,提升高并发性能。

  • 参数

net.core.rmem_max
net.core.wmem_max
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem

3️⃣ 网络优化脚本

#!/bin/bash
# network_optimize.sh
NIC="eth0"
CPULIST="2-15"
RMEM_MAX=16777216
WMEM_MAX=16777216
TCP_RMEM="4096 87380 16777216"
TCP_WMEM="4096 87380 16777216"
RPS_CPUS="ffff"
RPS_FLOW_ENTRIES=32768echo "=== 网络优化: $NIC ==="# 查询默认值
ethtool -k $NIC
for irq in $(grep "$NIC" /proc/interrupts | awk -F: '{print $1}'); doecho "$irq: $(cat /proc/irq/$irq/smp_affinity_list)"
done
sysctl net.core.rmem_max net.core.wmem_max net.ipv4.tcp_rmem net.ipv4.tcp_wmem
for q in /sys/class/net/$NIC/queues/rx-*; doecho "$q: RPS=$(cat $q/rps_cpus) FLOW=$(cat $q/rps_flow_cnt)"
done# 设置优化参数
ethtool -K $NIC tso on gso on gro on
for irq in $(grep "$NIC" /proc/interrupts | awk -F: '{print $1}'); doecho $CPULIST > /proc/irq/$irq/smp_affinity_list
done
sysctl -w net.core.rmem_max=$RMEM_MAX
sysctl -w net.core.wmem_max=$WMEM_MAX
sysctl -w net.ipv4.tcp_rmem="$TCP_RMEM"
sysctl -w net.ipv4.tcp_wmem="$TCP_WMEM"
for q in /sys/class/net/$NIC/queues/rx-*; doecho $RPS_CPUS > $q/rps_cpusecho $RPS_FLOW_ENTRIES > $q/rps_flow_cnt
done# 打印状态
ethtool -k $NIC

4️⃣ 完全动态软中断统计脚本

#!/bin/bash
awk '
BEGIN { delete counts; delete names; num=0 }
NR==1 { ncpus=NF-1; next }
{ type=$1; gsub(/:/,"",type); if (!(type in counts)) { num++; names[num]=type } for(i=2;i<=NF;i++) counts[type]+=$i }
END { total=0; for(t in counts) total+=counts[t]printf "%-12s %12s %8s\n","类型","总数","占比(%)"PROCINFO["sorted_in"]="@val_num_desc"for(t in counts) printf "%-12s %12d %8.2f\n",t,counts[t],counts[t]*100/totalprintf "总计 %12d 100.00\n", total
}' /proc/softirqs

5️⃣ 完全动态硬中断统计脚本

#!/bin/bash
awk '
BEGIN { printf "%-20s %-30s %-12s %-10s\n","控制器","设备","中断数","占比(%)"; print "---------------------------------------------" }
NR==1 { ncpus=NF-1; next }
/:/ && $1 ~ /^[0-9]+:/ {irq=substr($1,1,length($1)-1)sum=0; for(i=2;i<=1+ncpus;i++) sum+=$iif(sum==0) nextctrl=$(NF-1); dev=$NFtotal+=sum; counts[ctrl "|" dev]+=sum; ctrl_totals[ctrl]+=sum
}
END {PROCINFO["sorted_in"]="@val_num_desc"for(k in counts) { split(k,p,"|"); printf "%-20s %-30s %-12d %-9.2f\n", p[1],p[2],counts[k],counts[k]*100/total }print "========================================"for(c in ctrl_totals) printf "%-20s %-12d %-9.2f\n", c, ctrl_totals[c], ctrl_totals[c]*100/totalprintf "%-20s %-12d %-10s\n","总中断",total,"100.00%"
}' /proc/interrupts

6️⃣ Perf 性能分析流程

Step1: 基础统计

perf stat -a -d sleep 5
指标含义工具分析方法可能原因
cycles CPU 时钟周期 perf stat 与 instructions 比较 CPU pipeline stall
instructions 执行指令数 perf stat CPI=cycles/instructions CPU pipeline stall
cache-references 缓存访问次数 perf stat 比较 cache-miss 高 miss → CPU stall/NUMA
cache-misses 缓存未命中次数 perf stat cache miss rate CPU stall / NUMA 远程访问
branch-instructions 分支指令数 perf stat branch-misses rate 分支预测失误 → pipeline stall
branch-misses 分支错误次数 perf stat branch-miss 分析 高 → pipeline stall
context-switches 上下文切换次数 perf stat/sched 高但 syscall 正常 调度/锁争用
cpu-migrations 进程迁移次数 perf stat perf sched/top NUMA、负载均衡
page-faults 页面错误次数 perf stat/vmstat 高 → 内存不足或 NUMA 远程访问 内存压力
minor-faults 非阻塞页错误 perf stat/vmstat 频繁 → 内存压力 内存不足
major-faults 阻塞页错误 perf stat/iostat 频繁 → I/O 或内存压力 磁盘/网络 I/O 瓶颈
cycles.stalled CPU 停顿周期 perf stat cycles stalled 分析 pipeline stall / cache miss
instructions.retired 指令完成数 perf stat CPI/IPC 分析 CPU pipeline/IPC 效率
syscalls 系统调用次数 perf trace 高频 syscall 追踪 I/O/网络/文件系统瓶颈

Step2: 系统调用跟踪

perf trace -a

Step3: 调度/锁分析

perf sched record -a -g sleep 10
perf sched latency

Step4: 热点分析

perf top -a

Step5: 深入分析

perf record -a -g sleep 10
perf report

Step6: 分支思路总结

现象分析方法可能原因
syscalls 高 perf trace -a I/O/网络/文件系统瓶颈
context-switch 高 perf sched record/latency 调度/锁争用
page-fault 高 /proc/softirqs + perf top 内存不足或 NUMA 远程访问
CPI 高但 syscall/ctx/fault 正常 perf top -a CPU stall、cache miss、NUMA

7️⃣ 网络优化 + 性能诊断闭环流程图

+---------------------+
|     网络收包         |
|  (NIC Hard IRQ)     |
+---------+-----------+|v
+---------------------+
|  硬中断绑核 / RPS    |
|  irq_affinity / RPS  |
+---------+-----------+|v
+---------------------+
|   ksoftirqd / SoftIRQ |
|   (网络、调度任务)   |
+---------+-----------+|v
+---------------------+
|      TCP/UDP Buffer  |
|  rmem/wmem/tcp_*     |
+---------+-----------+|v
+---------------------+
| 用户态应用 / syscall |
| perf stat/top 分析  |
+---------+-----------+|v
+---------------------+
| 调度 / 锁分析        |
| perf sched/latency  |
+---------+-----------+|v
+---------------------+
| 深入热点分析         |
| perf record/report   |
+---------------------+

补充说明

  1. 用户态不能直接触发硬中断/软中断,内核模块可用于调试、性能验证。

  2. 硬中断:立即响应外设 → ISR 执行快速处理 → 可触发软中断。

  3. 软中断:硬中断完成后延迟处理 → ksoftirqd 调度 → 可配合 RPS/RFS 分发多核。

  4. 优化方向

    • IRQ 绑核:优化硬中断

    • RPS/RFS:优化软中断

    • TCP/UDP buffer:优化应用数据处理


这份文档已经覆盖:

  • 网络优化基础与脚本

  • 硬/软中断机制、触发流程、触发权限、统计脚本

  • Perf 性能分析完整流程与指标

  • 问题现象 → 分析工具 → 方法 → 可能原因

  • 原流程图保留

  • 软/硬中断触发背景和流程补充完整


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信个人号开发API/文档/教程

微信个人号开发API/文档/教程 大家一般需求点无非是以下几个需求: 1.开发个人微信营销系统 2.开发自定义的微信机器人, 3.开发微信智能聊天客服系统 4.定制行业内的群数据分析 功能需求很简单,业务代码贼好撸,但是如…

微指令控制器基本原理

微指令控制器的基本原理 微命令和微操作一一对应。一个微命令对于一根输出控制线 相容性微命令:可以并行完成的微命令 互斥型微命令:不可以并行完成的微命令 微命令格式 水平型微命令 一条微命令可定义多个可并行的微…

一个拒绝过度设计的 .NET 快速开发框架:开箱即用,专注干活

前言 .NET 生态快速发展的背景下,越来越多开发希望找到一个既能快速上手,又不过度设计的后端框架。尤其是在中小型项目中,复杂的架构、层层封装的服务逻辑往往让开发效率大打折扣。 今天推荐一个轻量级、高效实用的…

lookup-mehtod和replace-method标签的作用

lookup-mehtod和replace-method标签的作用下面通过一个基于Spring框架的简单示例来解释 lookup - method和 replace - method的作用。 1. 项目准备 首先创建一个Maven项目,添加Spring相关的依赖: <dependencies&g…

个人微信号二次开发API调用、微信API接口

个人微信号二次开发API调用、微信API接口微信API接口、微信二次开发API调用微信协议接口调用-加微信好友及通过好友请求发送小程序 请求URL: http://域名地址/sendApplets 请求方式: POST 请求头Headers: Content-T…

React 学习笔记4 Diffing/脚手架 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025.9.21+7 [未完]

2025.9.21 Week 笔记2025.9.22

VisualStudio-Python-工具指南-全-

VisualStudio Python 工具指南(全)原文:zh.annas-archive.org/md5/396df14cf233d147d6dfcb4a589a8b75 译者:飞龙 协议:CC BY-NC-SA 4.0前言 和许多其他开发者一样,Python 开发者总是需要找到方法来管理不同工具之…

深入解析:Spring Boot注解

深入解析:Spring Boot注解2025-09-22 13:14 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

Gevent和Subprocess问题

Gevent和Subprocess问题Gevent和Subprocess问题 1、复现 在main文件中调用gevent、并做了monkey pathch, 然后再调用subprocess.Popen(),出现一直卡住的问题Python 标准库里的很多 IO(网络 socket、ssl、time.sleep…

WPF ListBox loaded 76.6M items with imagesource

Install-Package Microsoft.Extensions.DependencyInjection; Install-Package CommunityToolkit.mvvm; public async Task InitDataAsync() {watch.Start();string imgDir = @"../../../Images";if (!Direc…

Ansible自动化运维实战 - 详解

Ansible自动化运维实战 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

建筑行业能源管理破局:MyEMS 打造商业楼宇 “能耗可视化 + 智能调控” 方案

在建筑行业的可持续发展浪潮中,商业楼宇正面临着巨大的能源管理压力。高昂的运营成本、日趋严格的碳排政策以及业主与租户对舒适环境日益增长的需求,共同构成了行业必须面对的挑战。传统的能源管理方式往往依赖于人工…

【数据结构】双向链表 - 指南

【数据结构】双向链表 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

告别“能源糊涂账”:MyEMS如何帮企业把能耗数据“算明白、用到位”

对于许多企业而言,能源成本是运营中一笔不小的开支,但却常常是一笔“糊涂账”。电费账单只有一个总数,只知道“花了多少钱”,却不知道“钱花在了哪里”、“谁在用”、“什么时候用的”、“有没有浪费”。这种粗放式…

完整教程:ElasticSearch倒排索引原理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Windows 离线环境下使用 VS Code 连接容器 Python 环境完整指南(亲测可用)

前言 在离线服务器环境中进行 Python 开发时,如何利用 VS Code 的强大功能进行调试和开发是一个常见需求。本文将详细介绍如何在 Windows 离线环境下,通过 WSL 和 Docker 容器实现 VS Code 连接 Python 环境的完整方…

Macos 安装kali报错

执行某个安装步骤失败。您可以尝试从菜单中重新运行这个失败的项目, 或跳过它并选择其他项目。失败的步骤是:选择并安装软件 选择语言的时候选择英文就能安装了。不清楚是什么原因

负载排查和分析二

负载排查和分析二明白了,我来帮你做两件事:改进中断部分:完善硬中断、软中断触发机制和它们之间的关联关系,增加图示和说明。优化整个文档美观性:用清晰的表格、层次分明的标题、缩进流程图、代码块高亮,保证可读…

负载排查和分析三

负载排查和分析三明白了,你希望 Step1: 基础统计 能够做到真正的 闭环诊断,即不仅有指标解释,还要告诉用户:可能现象(系统表现或问题)分析工具/命令(如何收集更多数据或验证)分析方法(指标和现象的对应关系、…