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 调优原则

  1. 循序渐进:每次只修改一个参数,观察效果
  2. 做好记录:记录每次修改的参数和效果
  3. 基准测试:修改前先建立性能基准
  4. 灰度发布:先在非生产环境验证
  5. 监控告警:关注关键指标的变化

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系统的运维老兵

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐