Linux 内核参数调优指南

一、概述

Linux 内核参数直接影响系统性能、网络吞吐、文件处理能力等关键指标。合理的内核调优可以显著提升服务器性能,尤其在高并发、大流量场景下效果明显。

本文档介绍常用内核参数的含义、推荐值及调优方法。

二、查看当前内核参数

2.1 查看所有参数

1
2
3
4
5
6
# 列出所有内核参数
sysctl -a

# 查看特定参数
sysctl net.ipv4.tcp_max_syn_backlog
sysctl vm.swappiness

2.2 查看参数配置文件

1
2
3
4
5
# 主配置文件
cat /etc/sysctl.conf

# 配置目录(优先级更高)
ls /etc/sysctl.d/

三、网络相关参数调优

3.1 TCP 连接优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 最大 SYN 队列长度(防御 SYN Flood)
net.ipv4.tcp_max_syn_backlog = 8192

# 已建立连接队列长度
net.core.somaxconn = 65535

# 允许重新使用 TIME_WAIT socket
net.ipv4.tcp_tw_reuse = 1

# TIME_WAIT socket 回收时间(秒)
net.ipv4.tcp_fin_timeout = 30

# 本地端口范围
net.ipv4.ip_local_port_range = 1024 65535

# 最大文件描述符数
net.core.netdev_max_backlog = 65535

3.2 TCP 缓冲区优化

1
2
3
4
5
6
7
8
9
10
# 默认 TCP 接收/发送缓冲区大小(字节)
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864

# 最大 TCP 接收/发送缓冲区大小
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864

# 自动调整缓冲区
net.ipv4.tcp_moderate_rcvbuf = 1

3.3 网络性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
# 开启 TCP 快速打开
net.ipv4.tcp_fastopen = 3

# 开启 BBR 拥塞控制算法
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# 禁用 ICMP 重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# 开启 IP 转发(路由器/网关需要)
net.ipv4.ip_forward = 0

四、内存相关参数调优

4.1 Swap 使用策略

1
2
3
4
5
6
7
# Swap 使用倾向(0-100,越低越少用 swap)
vm.swappiness = 10

# 建议:
# - 数据库服务器:vm.swappiness = 1
# - 普通应用服务器:vm.swappiness = 10
# - 内存紧张环境:vm.swappiness = 60

4.2 内存分配策略

1
2
3
4
5
6
7
8
9
# 内存过量使用策略
# 0 = 严格检查,1 = 宽松检查,2 = 不检查
vm.overcommit_memory = 1

# 过量使用比例
vm.overcommit_ratio = 50

# 内存回收压力(0-100)
vm.vfs_cache_pressure = 50

4.3 大页内存(HugePages)

1
2
3
4
5
6
7
8
# 启用透明大页
# always: 始终启用
# madvise: 仅在 madvise 区域启用
# never: 禁用
vm.transparent_hugepage = always

# 大页数量(根据内存大小调整)
vm.nr_hugepages = 1024

五、文件系统相关参数

5.1 文件描述符限制

1
2
3
4
5
6
# 系统级最大文件打开数
fs.file-max = 2097152

# 用户级限制(在 /etc/security/limits.conf 中配置)
# * soft nofile 65535
# * hard nofile 65535

5.2 inode 缓存

1
2
3
4
5
6
# inode 缓存回收压力
vm.vfs_cache_pressure = 50

# 目录项缓存回收
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10

5.3 文件监控

1
2
3
# inotify 监控限制
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512

六、进程相关参数

6.1 进程数限制

1
2
3
4
5
6
# 系统最大进程数
kernel.pid_max = 4194304

# 核心转储模式
# 0 = 关闭,1 = 标准转储,2 = 忽略 setuid
kernel.core_pattern = /var/core/core.%e.%p.%t

6.2 内核日志

1
2
3
4
5
# 控制台日志级别
kernel.printk = 4 4 1 7

# 日志缓冲区大小
kernel.dmesg_buf_size = 16M

七、调优配置实战

7.1 高并发 Web 服务器配置

创建 /etc/sysctl.d/99-webserver.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 网络连接优化
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535

# TCP 缓冲区优化
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864

# 开启 BBR
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# 文件描述符
fs.file-max = 2097152

# 内存优化
vm.swappiness = 10
vm.vfs_cache_pressure = 50

7.2 数据库服务器配置

创建 /etc/sysctl.d/99-database.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 减少 Swap 使用
vm.swappiness = 1

# 内存过量使用策略
vm.overcommit_memory = 2
vm.overcommit_ratio = 80

# 文件系统
fs.file-max = 2097152
vm.dirty_ratio = 40
vm.dirty_background_ratio = 10

# 网络优化
net.ipv4.tcp_max_syn_backlog = 4096
net.core.somaxconn = 32768

7.3 容器宿主机配置

创建 /etc/sysctl.d/99-container.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 网络桥接
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

# 连接追踪
net.netfilter.nf_conntrack_max = 1048576

# inotify 监控
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512

# 内存
vm.swappiness = 10
vm.overcommit_memory = 1

八、应用配置

8.1 临时生效(重启失效)

1
2
3
4
5
# 单个参数
sysctl -w net.ipv4.tcp_tw_reuse=1

# 从文件加载
sysctl -p /etc/sysctl.d/99-webserver.conf

8.2 永久生效

1
2
3
4
5
6
7
# 编辑配置文件
vim /etc/sysctl.conf
# 或
vim /etc/sysctl.d/99-custom.conf

# 添加参数后执行
sysctl -p

8.3 验证配置

1
2
3
4
5
6
# 检查参数是否生效
sysctl net.ipv4.tcp_tw_reuse
sysctl vm.swappiness

# 检查所有自定义配置
sysctl -a | grep -E "^(net\.|vm\.|fs\.|kernel\.)"

九、注意事项

9.1 调优前准备

  1. 备份原配置

    1
    sysctl -a > /tmp/sysctl_backup_$(date +%Y%m%d).conf
  2. 记录当前性能基线

    1
    2
    3
    4
    5
    6
    # 网络性能
    iperf3 -s & iperf3 -c server_ip

    # 磁盘 IO
    fio --name=randread --ioengine=libaio --iodepth=1 --rw=randread \
    --bs=4k --direct=0 --size=1G --numjobs=4 --runtime=60

9.2 调优原则

  • 渐进式调整:每次只调整少量参数,观察效果
  • 场景适配:根据实际业务场景选择配置
  • 监控验证:调优后持续监控性能指标
  • 回滚准备:保留原配置以便快速回滚

9.3 常见问题

问题 可能原因 解决方案
连接拒绝 somaxconn 太小 增大 net.core.somaxconn
TIME_WAIT 过多 tcp_tw_reuse 未开启 设置 net.ipv4.tcp_tw_reuse=1
OOM Killer 频繁 swappiness 太高 降低 vm.swappiness
磁盘 IO 瓶颈 dirty_ratio 太大 调整 vm.dirty_ratio

十、总结

内核参数调优是系统性能优化的重要环节,但需要遵循以下原则:

  1. 理解参数含义:不要盲目照搬配置
  2. 测试环境验证:生产环境变更前必须测试
  3. 持续监控:调优后观察系统表现
  4. 文档记录:记录变更内容和效果

合理的内核调优可以让系统性能提升 20%-50%,但过度调优可能适得其反。建议根据实际业务场景,选择合适的参数组合。