系统相关
首页 > 系统相关> > 内存不足导致 nginx 崩溃的原因分析

内存不足导致 nginx 崩溃的原因分析

作者:互联网

 

最近在 Centos7 上搭建 nginx 作为 web 服务器使用,但是使用过程中,nginx 总是莫名其妙的崩掉,使用命令 dmesg 检查错误信息如下:

[6655217.659132] Out of memory: Kill process 11494 (lsof) score 10 or sacrifice child[6655217.659567] Killed process 11494 (lsof) total-vm:161160kB, anon-rss:42368kB, file-rss:0kB, shmem-rss:0kB

使用命令 cat /var/log/nginx/error.log 来查看 nginx 的错误日志包含如下信息:

2017/10/26 22:59:45 [crit] 13093#0: accept4() failed (23: Too many open files in system)2017/10/26 22:59:45 [crit] 13092#0: accept4() failed (23: Too many open files in system)

经过高人指点,是系统配置设置没法满足当前的使用量,准确点说是系统的 open files (打开文件数目)配置的太低了。

使用命令 ulimit -a 看一下当前置:

core file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 15089max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 15089virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

可以看到 open files 值,只有 1024,下面我们就详细说一下如何在 Centos 系统级别提高打开文件数目(open files)的限制。

 

详细步骤:

1、使用命令 sudo bash 切换到 root 账户;

2.、使用 vi/vim 编辑 /etc/sysctl.conf 增加一行 fs.file-max = 100000,下面是修改后的结果:

[root@test /]# cat /etc/sysctl.conf# System default settings live in /usr/lib/sysctl.d/00-system.conf.# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file## For more information, see sysctl.conf(5) and sysctl.d(5).net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv4.tcp_challenge_ack_limit = 999999999kernel.kptr_restrict = 1fs.file-max = 100000

3、 使用 vi/vim 编辑 /etc/security/limits.conf,并在末尾增加如下语句,用来增加所有用户的软硬句柄和文件打开数目限制:

* soft nofile 100000* hard nofile 300000

下面是修改后的结果:

[root@test /]# cat /etc/security/limits.conf# 省略的内容# End of file* soft nofile 100000* hard nofile 300000

4、 执行命令 sysctl -p 让修改生效;

 

5、通过命令 whereis nginx 查看 nginx 配置文件所在位置:

[root@test /]# whereis nginxnginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz

6、 使用 vi/vim 编辑 /etc/nginx/nginx.conf 来在 nginx 级别上提高打开的文件句柄限制:

[root@test /]# cat /etc/nginx/nginx.conf# 省略的内容user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;worker_rlimit_nofile 300000;# 省略的内容

7、使用 reboot 命令重启系统后,我们分别使用 ulimit -Hn、ulimit -Sn 和 ulimit -a 来查看修改后的效果:

[root@test /]# ulimit -Hn300000[root@test /]# ulimit -Sn100000[root@test /]# ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 15089max locked memory       (kbytes, -l) 64max memory size         (kbytes, -m) unlimitedopen files                      (-n) 100000pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 8192cpu time               (seconds, -t) unlimitedmax user processes              (-u) 15089virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

8、上述示例的设置值均是对公共服务器的配置,具体数据请根据系统实际需要进行设定;

9、如果上述方法仍然没有解决问题,可以考虑:

1.使用服务的方式启动 nginx 试试;

2.加配置内存。

标签:etc,kbytes,内存不足,nginx,conf,崩溃,root,size
来源: https://blog.51cto.com/sylan215/2919734