804 字
4 分钟
Linux内核优化脚本
2025-06-05
2025-06-13

概述#

本文介绍一个Linux内核优化脚本,主要解决高并发环境下的文件描述符限制和网络性能问题,特别针对容器化环境进行了优化。

优化脚本#

optimize-system-limits.sh
#!/usr/bin/env bash
# 目标:在保证 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的限制设置

验证优化效果#

Terminal window
# 查看当前文件描述符限制
ulimit -n
# 查看系统级限制
cat /proc/sys/fs/file-max
# 查看网络参数
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog
Linux内核优化脚本
https://twenhub.com/posts/linuxnei-he-you-hua-jiao-ben/
作者
Twenhub
发布于
2025-06-05
许可协议
CC BY-NC-SA 4.0