概述

本文介绍一个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_rmemTCP接收缓冲区配置4096 87380 16777216
net.ipv4.tcp_wmemTCP发送缓冲区配置4096 65536 16777216
net.ipv4.tcp_max_syn_backlogSYN队列最大长度16384
net.ipv4.tcp_syncookies启用SYN cookies防护1
net.ipv4.tcp_timestampsTCP时间戳(关闭提升性能)0
net.ipv4.tcp_fastopen启用TCP Fast Open3

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=262144
  • LimitNPROC=262144

使用方法

  1. 保存脚本为 optimize-system-limits.sh
  2. 添加执行权限:chmod +x optimize-system-limits.sh
  3. 以root权限运行:sudo ./optimize-system-limits.sh
  4. 重启系统使所有配置生效

注意事项

  • 脚本使用独立配置文件,避免覆盖系统默认配置
  • 建议在测试环境先验证效果
  • 部分参数需要重启系统才能完全生效
  • 容器化环境需要特别注意containerd的限制设置

验证优化效果

# 查看当前文件描述符限制
ulimit -n

# 查看系统级限制
cat /proc/sys/fs/file-max

# 查看网络参数
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog