Ubuntu 服务器调优:上线前必须改的 12 个系统参数

新机器装完系统直接跑服务,等于把默认值当成生产配置用。Ubuntu 默认的 ulimit 是 1024、somaxconn 是 4096、swappiness 是 60——这些值面向的是桌面环境,跑 Web 服务时几乎每个都会成为瓶颈。这篇按「改了马上有效」排序,列 12 项。

一、文件描述符(最该先改的一项)

默认值 1024 意味着一个进程同时打开的文件和连接加起来不能超过 1024,Nginx、MySQL、Java 三者都会撞上,报错都是 Too many open files。

ulimit -n                      # 看当前值
ulimit -Hn                     # 看硬上限

改法一:limits.conf(对登录会话生效)

/etc/security/limits.conf 末尾加:

*        soft    nofile    65535
*        hard    nofile    65535
root     soft    nofile    65535
root     hard    nofile    65535

改法二:systemd 服务(关键,否则改一不生效)

systemd 拉起的服务根本不读 limits.conf,必须在 unit 里写:

[Service]
LimitNOFILE=65535
LimitNPROC=65535

改完 systemctl daemon-reload && systemctl restart 服务,用这条验证真实生效值:

cat /proc/$(pgrep -f nginx | head -1)/limits | grep "open files"

二、TCP 内核参数

写进 /etc/sysctl.d/99-tuning.conf,sysctl -p /etc/sysctl.d/99-tuning.conf 生效:

# 连接队列:并发握手多时 4096 会丢包
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 端口复用:高并发短连接下 TIME_WAIT 堆积的救星
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15

# 可用端口范围,默认只有 2.8 万个
net.ipv4.ip_local_port_range = 1024 65535

# 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 防 SYN 洪水与连接追踪上限
net.ipv4.tcp_syncookies = 1
net.netfilter.nf_conntrack_max = 262144

几个容易踩的点:

  • tcp_tw_recycle 在 Linux 4.12+ 已移除,网上老教程还让开它,写了会报错;tw_reuse 才是安全的那个。
  • NAT 网关后的机器不要盲目加 conntrack_max,每个连接约 300 字节,26 万条约 80MB 内存。
  • somaxconn 要和应用层对齐:Nginx 的 listen ... backlog=65535、Java 的 ServerSocket backlog 都受它约束。

三、swap 与 swappiness

swapon --show
cat /proc/sys/vm/swappiness        # Ubuntu 默认 60

数据库服务器建议 vm.swappiness = 1(尽量不用 swap,避免抖动);普通应用服务器用 10;云主机没有 swap 时,2GB 内存机器强烈建议加 2GB swap 兜底,防止 OOM Killer 直接杀进程:

fallocate -l 2G /swapfile && chmod 600 /swapfile
mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab

另外把 vm.overcommit_memory = 1 配上,能减少 Redis 这类服务在 fork 时的失败。

四、其他值得做的 8 件事

项 命令 / 配置 为什么
时间同步 timedatectl set-timezone Asia/Shanghai + systemctl enable --now chrony 日志时间错乱会让排查变成噩梦
journald 限大小 /etc/systemd/journald.conf:SystemMaxUse=500M 日志默认不限,能吃满根分区
关无用服务 systemctl disable --now snapd.service 等 省内存、减少攻击面
硬盘调度 SSD 用 none(NVMe 本身就是 none),云盘别改 老教程的 deadline 对 NVMe 无意义
开启 BBR net.ipv4.tcp_congestion_control = bbr 高延迟链路上吞吐提升明显(估算 20%–40%)
文件句柄监控 lsof -n | wc -l 定期看 泄漏早期就能发现
内核日志 dmesg -T 查 OOM/硬件错误 进程被杀又不明原因时唯一线索
安全基线 禁 root 密码登录、改 SSH 端口、装 fail2ban 公网机器平均几分钟就被扫

五、怎么验证调优有效

别凭感觉。改之前先留一份基线:

ss -s                                  # 当前连接统计
cat /proc/net/sockstat                 # 套接字与内存占用
vmstat 1 5                             # CPU/内存/上下文切换
iostat -x 1 3                          # 磁盘 IO 与 await

然后用 HTTP 健康检查 或 wrk/ab 压一遍,对比 QPS 与错误率。出问题时把日志丢进 日志分析工具,能直接定位是连接数、超时还是后端挂了。

六、一句话原则

先测量,再调优。 12 项里真正对你有用的可能只有 3 项,靠监控数据挑出来,别照单全抄——改错参数(比如给数据库关掉 swap)比不调优更危险。


相关工具:Linux 命令速查 · SSH 连通性检测 · 日志分析

还有 65 个免费在线工具

纯前端实现,不用注册,数据不上传服务器。

浏览全部工具