Linux内核调优与性能优化:运维老兵的压箱底绝活
·
Linux内核调优与性能优化:运维老兵的压箱底绝活
作为一名运维老兵,我职业生涯的大部分时间都在和Linux系统打交道。从最初接触的CentOS 5到如今的Ubuntu 22.04、RHEL 9,Linux内核的调优一直是运维工作中最神秘也最吸引我的领域。今天想把这些年积累的内核调优经验分享出来,希望对大家有所帮助。
一、内核参数体系概述
Linux内核参数可以通过sysctl命令动态调整,也可以通过/etc/sysctl.conf持久化配置。理解这些参数的含义,是进行性能调优的基础。
1.1 查看和修改内核参数
# 查看当前所有内核参数
sysctl -a
# 查看特定参数
sysctl net.ipv4.tcp_fin_timeout
# 临时修改参数
sysctl -w net.ipv4.tcp_fin_timeout=30
# 持久化配置
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
sysctl -p
1.2 关键参数分类
Linux内核参数繁多,我按照功能将常用参数分为以下几类:
- 网络参数
- 内存参数
- 文件系统参数
- 进程参数
- 虚拟内存参数
二、网络参数调优
2.1 TCP连接优化
TCP连接是网络服务的核心,优化TCP参数可以显著提升网络性能:
# /etc/sysctl.conf
# TCP连接优化
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
# TCP端口范围优化(高并发场景)
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 8192
# TCP缓冲区优化
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 65535
net.core.somaxconn = 65535
# TCP时间戳(关闭以减少CPU开销)
net.ipv4.tcp_timestamps = 0
# TCP选择确认(关闭以减少CPU开销)
net.ipv4.tcp_sack = 0
# TCP窗口缩放
net.ipv4.tcp_window_scaling = 1
2.2 连接复用与快速打开
# 启用TCP连接复用
net.ipv4.tcp_tw_reuse = 1
# 启用TCP快速打开
net.ipv4.tcp_fastopen = 3
# 启用SYNCookie防护(SYN Flood攻击)
net.ipv4.tcp_syncookies = 1
2.3 网络设备优化
# 调整网卡缓冲区
net.core.netdev_max_backlog = 5000
net.core.netdev_budget = 600
# 调整socket缓冲区
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
三、内存参数调优
3.1 内存管理基础参数
# 虚拟内存优化
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 50
vm.overcommit_memory = 1
vm.overcommit_ratio = 50
vm.max_map_count = 655360
3.2 Swappiness详解
swappiness参数控制系统使用swap的倾向,取值范围0-100:
- 0:尽量不使用swap,直到物理内存耗尽
- 10:在内存使用率达到90%时开始使用swap
- 60(默认值):较为激进的swap策略
- 100:积极使用swap
对于数据库等内存敏感型应用,建议将swappiness设置为10或更低:
# 对于内存密集型服务
sysctl -w vm.swappiness=10
3.3 OOM Killer配置
# 调整OOM评分
echo -1000 > /proc/self/oom_score_adj
四、文件系统参数调优
4.1 文件描述符限制
高并发服务需要调整文件描述符限制:
# /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
* soft nproc 655360
* hard nproc 655360
# /etc/sysctl.conf
fs.file-max = 2097152
fs.nr_open = 2097152
fs.inotify.max_user_watches = 524288
4.2 文件系统缓存
# 增加dentry缓存
fs.inotify.max_user_watches = 524288
# 调整文件句柄
fs.file-max = 2097152
4.3 选择合适的文件系统
对于不同场景,选择合适的文件系统也很重要:
| 文件系统 | 适用场景 | 特点 |
|---|---|---|
| ext4 | 通用场景 | 稳定、兼容性好 |
| XFS | 大文件、高并发 | 高性能、日志优化 |
| btrfs | 需要快照功能 | 支持压缩、去重 |
| tmpfs | 临时文件 | 内存文件系统 |
五、进程与IPC参数
5.1 进程相关参数
# 调整PID数量
kernel.pid_max = 655360
# 调整线程数
kernel.threads-max = 655360
# 调整信号队列
kernel.sem = 250 655360 250 1024
5.2 共享内存优化
# 共享内存大小
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
六、性能监控工具
6.1 sysctl参数查看
# 查看当前生效的所有参数
sysctl -a | grep -E "^(net|vm|fs|kernel)" | head -50
# 查看已修改的参数
sysctl -a | grep " = " | awk -F' = ' '{print $1"="$2}' > /tmp/current_sysctl.txt
6.2 性能监控命令
# CPU和内存使用
top -H
vmstat 1
mpstat -P ALL 1
# 磁盘IO
iostat -xz 1
iotop -o
# 网络监控
sar -n DEV 1
netstat -s
ss -s
# 进程分析
pidstat -p <PID> 1
strace -p <PID>
perf top
6.3 内核态时间分析
# 查看CPU在各个状态的耗时
perf stat -a -e cycles,instructions,cache-misses sleep 10
# 查看热点函数
perf top -a
七、生产环境调优案例
7.1 Nginx高并发调优
# /etc/sysctl.conf
# 网络参数
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 2000
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
net.core.netdev_max_backlog = 8192
# 文件描述符
fs.file-max = 2097152
# 内存
vm.swappiness = 5
# /etc/security/limits.conf
nginx soft nofile 655360
nginx hard nofile 655360
7.2 MySQL数据库调优
# /etc/sysctl.conf
# 共享内存
kernel.shmmax = 137438953472
kernel.shmall = 4294967296
# 文件系统
fs.file-max = 2097152
# 网络
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
7.3 Kubernetes Node调优
# kubelet-config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
serverTLSBootstrap: true
streamingConnectionIdleTimeout: 4h
runtimeRequestTimeout: 2m
kubeletCgroups: /system.slice
八、调优最佳实践
8.1 调优原则
- 循序渐进:每次只修改一个参数,观察效果
- 做好记录:记录每次修改的参数和效果
- 基准测试:修改前先建立性能基准
- 灰度发布:先在非生产环境验证
- 监控告警:关注关键指标的变化
8.2 调优检查清单
- 文件描述符限制是否足够?
- 网络缓冲区是否优化?
- Swap策略是否合理?
- 内核日志是否正常?
- 关键参数是否持久化?
- 监控告警是否配置?
8.3 常见问题处理
问题:服务器出现"too many open files"错误
# 排查
lsof -p <pid> | wc -l
cat /proc/<pid>/limits
# 解决
# 1. 临时提高限制
ulimit -n 655360
# 2. 持久化配置
echo "* soft nofile 655360" >> /etc/security/limits.conf
echo "* hard nofile 655360" >> /etc/security/limits.conf
问题:服务器出现频繁OOM
# 查看OOM killer日志
dmesg | grep -i "out of memory"
grep -i "killed process" /var/log/messages
# 调整OOM偏好
echo -1000 > /proc/<pid>/oom_score_adj
结语
Linux内核调优是一个需要长期积累的领域,没有放之四海而皆准的最佳配置。不同的业务场景、不同的硬件配置,都需要针对性地进行调优。
作为运维工程师,我们要做的就是理解系统的运行原理,掌握调优的方法论,在实践中不断积累经验。就像登山一样,只有脚踏实地,一步一步向上攀登,才能到达技术的高峰。
本文作者:侯万里(万里侯),深耕Linux系统的运维老兵
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)