内核调试与调优指南
一、常用sysctl内核参数调优
sysctl是一个用于在运行时配置Linux内核参数的工具,这些参数存储在/proc/sys/目录下。
1. 网络参数调优
bash
# 增大TCP缓冲区
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
# 启用TCP快速打开
sysctl -w net.ipv4.tcp_fastopen=3
# 增大连接队列长度
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
# 减少TIME_WAIT数量
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_fin_timeout=30
# 启用SYN Cookies
sysctl -w net.ipv4.tcp_syncookies=1
# 启用BBR拥塞控制算法
sysctl -w net.ipv4.tcp_congestion_control=bbr2. 内存参数调优
bash
# 增大页缓存
sysctl -w vm.swappiness=10
sysctl -w vm.vfs_cache_pressure=50
# 启用透明大页(默认启用)
sysctl -w vm.transparent_hugepage=always
# 禁用透明大页(某些场景建议关闭)
sysctl -w vm.transparent_hugepage=never
# 增大OOM Killer阈值
sysctl -w vm.overcommit_memory=13. 内核参数持久化
将sysctl参数添加到/etc/sysctl.conf文件中,系统启动时会自动加载:
bash
echo "net.core.rmem_max=16777216" >> /etc/sysctl.conf
echo "net.core.wmem_max=16777216" >> /etc/sysctl.conf
sysctl -p二、内核崩溃调试与panic分析
内核崩溃(panic)是指内核遇到无法恢复的错误时,会停止运行并打印调试信息。
1. 配置内核崩溃转储
bash
# 启用内核崩溃转储
sysctl -w kernel.panic=10
sysctl -w kernel.core_pattern=/var/crash/core.%e.%p.%t
# 持久化配置
echo "kernel.panic=10" >> /etc/sysctl.conf
echo "kernel.core_pattern=/var/crash/core.%e.%p.%t" >> /etc/sysctl.conf2. 分析内核崩溃转储文件
使用gdb和crash工具来分析内核崩溃转储文件:
bash
# 安装crash工具
sudo apt install crash
# 分析内核崩溃转储文件
sudo crash /usr/lib/debug/boot/vmlinux-$(uname -r) /var/crash/core.*3. 常见内核panic原因
- 空指针引用
- 内存访问越界
- 内核死锁
- 中断处理错误
- 驱动程序错误
三、硬件性能计数器(PMU)
PMU 的硬件架构、事件选择机制、PEBS/IBS 精确采样、per-core vs uncore PMU 等内容已独立成篇,详见 pmu。perf 工具的使用见 perf。
四、参考资料
- Linux内核官方文档:https://www.kernel.org/doc/html/latest/admin-guide/sysctl/
- 《Linux内核调试与优化》 陈莉君
- https://man7.org/linux/man-pages/man8/sysctl.8.html
- https://www.intel.com/content/www/us/en/developer/articles/technical/intel-64-and-ia-32-architectures-software-developer-manual-325462.html
五、一句话总结
内核 panic 靠 kdump 切捕获内核保存 vmcore,再用 crash/带符号 vmlinux 看栈和 RIP 定位到具体模块或驱动;先配好转储,崩溃才有现场可查。