1. 确认ulimit限制类型及当前值
首先需明确导致启动失败的ulimit限制类型(常见为打开文件数nofile、进程数nproc或锁定内存memlock),并通过以下命令查看当前用户的限制:
ulimit -a # 查看所有资源限制
ulimit -n # 查看打开文件数限制(最常见导致启动失败的原因)
ulimit -u # 查看进程数限制
ulimit -l # 查看锁定内存限制(如RDMA、数据库等场景需要)
若输出值远小于应用需求(如nofile为1024,而应用需要65536),则需调整对应限制。
2. 临时修改ulimit(仅当前会话有效)
若需快速验证是否为ulimit导致的问题,可通过以下命令临时调整(重启或退出终端后失效):
ulimit -n 65536 # 将打开文件数限制调整为65536(生产环境推荐值)
ulimit -u 4096 # 将进程数限制调整为4096(根据应用需求调整)
调整后尝试重启应用,若能正常启动,则说明问题由ulimit限制引起,需进行永久修改。
3. 永久修改ulimit(针对登录用户/系统级)
3.1 修改/etc/security/limits.conf(系统级用户限制)
编辑该文件(需root权限),在末尾添加以下内容(以*表示所有用户,可替换为特定用户如ubuntu):
* soft nofile 65536 # 软限制:用户可自行调整的最高值(不超过hard限制)
* hard nofile 65536 # 硬限制:系统允许的最高值(用户无法突破)
* soft nproc 4096 # 进程数软限制(可选,根据应用需求调整)
* hard nproc 4096 # 进程数硬限制(可选,根据应用需求调整)
若需调整锁定内存限制(如达梦数据库、RDMA应用),添加:
* soft memlock unlimited
* hard memlock unlimited
保存后退出。
3.2 确保PAM模块加载pam_limits.so
编辑PAM会话配置文件(common-session和common-session-noninteractive),确保包含以下行(无#注释):
sudo nano /etc/pam.d/common-session
sudo nano /etc/pam.d/common-session-noninteractive
添加(若不存在):
session required pam_limits.so
保存后退出,需完整注销用户或重启系统使配置生效。
4. 针对systemd服务单独配置(关键步骤)
若启动失败的应用由systemd管理(如Nginx、Docker、Java服务等),需额外修改systemd的全局默认限制,否则应用仍使用旧限制:
4.1 修改systemd系统级配置
编辑/etc/systemd/system.conf(系统级默认)和/etc/systemd/user.conf(用户级默认),找到并修改以下行(去掉#注释):
sudo nano /etc/systemd/system.conf
sudo nano /etc/systemd/user.conf
修改为:
DefaultLimitNOFILE=65536:65536 # 打开文件数限制(软:硬)
DefaultLimitNPROC=4096:4096 # 进程数限制(可选,根据需求调整)
DefaultLimitMEMLOCK=infinity # 锁定内存限制(如需,设为无限制)
4.2 重新加载systemd并重启服务
sudo systemctl daemon-reload # 重新加载systemd配置
sudo systemctl restart # 替换为失败的服务名(如nginx、docker)
例如,重启Nginx:
sudo systemctl restart nginx
5. 验证修改是否生效
5.1 验证用户级限制
重新登录后,执行以下命令:
ulimit -n # 应输出65536(或其他设置的值)
ulimit -u # 应输出对应的进程数限制
5.2 验证systemd服务限制
sudo systemctl show | grep LimitNOFILE # 检查打开文件数限制
sudo systemctl show | grep LimitNPROC # 检查进程数限制
输出应与/etc/systemd/system.conf中的设置一致。
常见问题排查
- 问题1:修改后仍不生效
检查是否遗漏了systemd配置(步骤4),或未完整注销/重启系统(步骤3.2)。 - 问题2:应用仍报“Too many open files”
确认nofile的hard限制是否足够高(建议与soft一致),并检查应用自身是否有额外的限制(如Nginx的worker_connections需大于nofile)。 - 问题3:无法设置
unlimited
部分系统对memlock等限制有内核约束,可将值设为较大数值(如1048576)替代unlimited。
以上就是关于“如何解决Ubuntu ulimit导致的启动失败”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm