救命!大模型学习路线直接抄作业, 小白程序员速收藏
2026/4/17 17:44:18
使用top、free查看资源,发现 CPU 仅 10%,内存剩余也充足。并没有发生内存溢出(OOM)或 CPU 跑满的情况。
检查/var/log/syslog和dmesg,发现了关键报错:
Jan 28 00:00:02 ip-xxx logrotate[129511]: error: unable to open ...: Too many open files in system同时,Nginx 的 error.log 中出现大量:
connect() failed (111: Unknown error) while connecting to upstream注意:这里的Too many open files in system是指整个系统的文件打开数达到了上限,而不是某个进程达到了上限。
执行sysctl fs.file-max查看系统级限制:
$cat/proc/sys/fs/file-nr512005120惊人发现:系统全局允许打开的最大文件句柄数(fs.file-max)竟然被设置成了5120。
对于一台运行了 MySQL、Nginx、Go应用以及各种监控组件(如阿里云盾)的服务器来说,5120 简直是“杯水车薪”。仅 MySQL 和阿里云盾通常就能消耗掉 4000+ 个句柄。
为什么之前没事,发了 JS 反爬版就挂了?这就涉及到了“连接放大效应”。
TIME_WAIT状态的 socket。“我之前配置过 65536,为什么不生效?”
这是一个非常经典的 Linux 运维误区。Linux 有两层文件描述符限制:
进程级/用户级限制 (ulimit -n//etc/security/limits.conf):
系统级总限制 (fs.file-max//etc/sysctl.conf):
结论:当金库(系统总上限)没钱时,你的卡限额(进程限制)再高也取不出钱来。
修改系统内核参数,大幅提升总上限。对于 4G 内存的服务器,100万是安全的。
# 1. 修改配置文件echo"fs.file-max = 1000000"|sudotee-a /etc/sysctl.conf# 2. 立即生效sudosysctl -p# 3. 验证cat/proc/sys/fs/file-nrfs.file-max。不要只看ulimit -n。