概述
本文介绍一个Linux内核优化脚本,主要解决高并发环境下的文件描述符限制和网络性能问题,特别针对容器化环境进行了优化。
优化脚本
#!/usr/bin/env bash
# optimize-system-limits.sh
# 目标:在保证 Docker / containerd 稳定运行的前提下,提升系统并发与网络性能
set -euo pipefail
#############################################
# 1. 内核参数(sysctl)
# 不直接修改 /etc/sysctl.conf,而是写入独立文件
#############################################
cat >/etc/sysctl.d/99-custom-performance.conf <<'EOF'
#############################################
# 文件句柄(1 Mi = 1 048 576),高并发但不过度
#############################################
fs.file-max = 1048576
fs.nr_open = 1048576
#############################################
# TCP/IP 栈与队列
#############################################
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 16384
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fastopen = 3
#############################################
# 内存 / Swap
#############################################
vm.swappiness = 10
EOF
# 立即加载
sysctl --system
#############################################
# 2. 进程资源限制(ulimit)
# 使用 limits.d 新文件,避免覆盖系统默认文件
#############################################
cat >/etc/security/limits.d/99-nofile.conf <<'EOF'
# 每进程最大文件句柄(52 4 288 ≈ 512 Ki),与内核总句柄配合
* soft nofile 524288
* hard nofile 524288
root soft nofile 524288
root hard nofile 524288
EOF
#############################################
# 3. systemd 全局限制
#############################################
mkdir -p /etc/systemd/system.conf.d
cat >/etc/systemd/system.conf.d/99-nofile.conf <<'EOF'
[Manager]
DefaultLimitNOFILE=524288
EOF
#############################################
# 4. containerd / Docker 专用限制
# 保持在 Docker 官方推荐水平,避免过高
#############################################
mkdir -p /etc/systemd/system/containerd.service.d
cat >/etc/systemd/system/containerd.service.d/override.conf <<'EOF'
[Service]
LimitNOFILE=262144
LimitNPROC=262144
EOF
#############################################
# 5. 重新加载 systemd 并让当前会话立即生效
#############################################
systemctl daemon-reload
ulimit -n 524288
echo "✅ 内核与资源限制优化完成,建议重启 Docker / containerd 或整机以确保全部生效。"
参数详解
1. 文件描述符优化
| 参数 | 作用 | 推荐值 |
|---|---|---|
fs.file-max | 系统级最大文件描述符数量 | 1048576 |
fs.nr_open | 单个进程可打开的最大文件描述符 | 1048576 |
2. 网络栈优化
| 参数 | 作用 | 推荐值 |
|---|---|---|
net.core.somaxconn | 监听队列最大长度 | 4096 |
net.core.netdev_max_backlog | 网络设备接收队列长度 | 16384 |
net.core.rmem_max | 套接字接收缓冲区最大值 | 16777216 |
net.core.wmem_max | 套接字发送缓冲区最大值 | 16777216 |
net.ipv4.tcp_rmem | TCP接收缓冲区配置 | 4096 87380 16777216 |
net.ipv4.tcp_wmem | TCP发送缓冲区配置 | 4096 65536 16777216 |
net.ipv4.tcp_max_syn_backlog | SYN队列最大长度 | 16384 |
net.ipv4.tcp_syncookies | 启用SYN cookies防护 | 1 |
net.ipv4.tcp_timestamps | TCP时间戳(关闭提升性能) | 0 |
net.ipv4.tcp_fastopen | 启用TCP Fast Open | 3 |
3. 内存管理优化
| 参数 | 作用 | 推荐值 |
|---|---|---|
vm.swappiness | 控制swap使用倾向(越小越少用swap) | 10 |
4. 用户限制配置
通过 /etc/security/limits.d/99-nofile.conf 设置用户级文件描述符限制:
soft nofile 524288:软限制hard nofile 524288:硬限制
5. systemd服务限制
设置systemd服务的默认文件描述符限制:
DefaultLimitNOFILE=524288
6. 容器化特殊处理
为containerd单独设置适中限制,避免触发205/LIMITS错误:
LimitNOFILE=262144LimitNPROC=262144
使用方法
- 保存脚本为
optimize-system-limits.sh - 添加执行权限:
chmod +x optimize-system-limits.sh - 以root权限运行:
sudo ./optimize-system-limits.sh - 重启系统使所有配置生效
注意事项
- 脚本使用独立配置文件,避免覆盖系统默认配置
- 建议在测试环境先验证效果
- 部分参数需要重启系统才能完全生效
- 容器化环境需要特别注意containerd的限制设置
验证优化效果
# 查看当前文件描述符限制
ulimit -n
# 查看系统级限制
cat /proc/sys/fs/file-max
# 查看网络参数
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog