深色模式
内核参数 sysctl
摘要:高并发服务报 "Too many open files"?本文调大内核级文件句柄上限,立即生效并做到重启保留。前提:有 root/sudo。
适用环境
bash
sysctl --version
sysctl fs.file-max # 当前系统级最大句柄数
ulimit -n # 当前会话用户级限制(另见 ulimit 篇)1
2
3
2
3
一、临时修改(立即生效,重启丢失)
bash
sysctl -w fs.file-max=1000000
sysctl fs.file-max # 确认已变
# -w 写入运行中的内核,不落盘1
2
3
2
3
二、永久生效(写配置文件)
bash
cat > /etc/sysctl.d/99-filemax.conf <<'EOF'
fs.file-max = 1000000
net.core.somaxconn = 4096
EOF
sysctl --system # 加载所有 /etc/sysctl.d/*.conf
sysctl fs.file-max # 确认生效1
2
3
4
5
6
2
3
4
5
6
三、查看与搜索参数
bash
sysctl -a | grep file-max # 列出所有含 file-max 的参数
sysctl net.ipv4.ip_forward # 读取单个参数1
2
2
验证
- [ ]
sysctl fs.file-max显示新值 - [ ] 重启后
sysctl --system加载的配置仍有效 - [ ] 应用不再报 "Too many open files"
常见坑
- 只改内核不够:
fs.file-max是系统级上限,用户/进程级还要配合/etc/security/limits.conf(见 ulimit 篇)。 - 文件名顺序:
/etc/sysctl.d/按数字前缀顺序加载,后加载的覆盖前边。 - 参数名写错:
sysctl -w若拼错会报 "unknown key",先sysctl -a | grep确认。 - 网络参数需重连生效:部分网络参数改后已建立的连接不受影响。