新机器装完系统直接跑服务,等于把默认值当成生产配置用。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 连通性检测 · 日志分析