首先需明确导致启动失败的ulimit限制类型(常见为打开文件数nofile、进程数nproc或锁定内存memlock),并通过以下命令查看当前用户的限制:
ulimit -a # 查看所有资源限制
ulimit -n # 查看打开文件数限制(最常见导致启动失败的原因)
ulimit -u # 查看进程数限制
ulimit -l # 查看锁定内存限制(如RDMA、数据库等场景需要)
若输出值远小于应用需求(如nofile为1024,而应用需要65536),则需调整对应限制。
若需快速验证是否为ulimit导致的问题,可通过以下命令临时调整(重启或退出终端后失效):
ulimit -n 65536 # 将打开文件数限制调整为65536(生产环境推荐值)
ulimit -u 4096 # 将进程数限制调整为4096(根据应用需求调整)
调整后尝试重启应用,若能正常启动,则说明问题由ulimit限制引起,需进行永久修改。
/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
保存后退出。
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
保存后退出,需完整注销用户或重启系统使配置生效。
若启动失败的应用由systemd管理(如Nginx、Docker、Java服务等),需额外修改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 # 锁定内存限制(如需,设为无限制)
sudo systemctl daemon-reload # 重新加载systemd配置
sudo systemctl restart <service_name> # 替换为失败的服务名(如nginx、docker)
例如,重启Nginx:
sudo systemctl restart nginx
重新登录后,执行以下命令:
ulimit -n # 应输出65536(或其他设置的值)
ulimit -u # 应输出对应的进程数限制
sudo systemctl show <service_name> | grep LimitNOFILE # 检查打开文件数限制
sudo systemctl show <service_name> | grep LimitNPROC # 检查进程数限制
输出应与/etc/systemd/system.conf中的设置一致。
nofile的hard限制是否足够高(建议与soft一致),并检查应用自身是否有额外的限制(如Nginx的worker_connections需大于nofile)。unlimitedmemlock等限制有内核约束,可将值设为较大数值(如1048576)替代unlimited。