原創 記憶體不足導致 nginx 崩潰的原因分析

2021-09-24 15:10:58 字數 4523 閱讀 7118

最近在 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) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 15089

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

posix message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 15089

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

可以看到 open files 值,只有 1024,下面我們就詳細說一下如何在 centos 系統級別提高開啟檔案數目(open files)的限制。

詳細步驟:

使用命令sudo bash切換到 root 賬戶;

使用 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/.conf file

## for more information, see sysctl.conf(5) and sysctl.d(5).

net.ipv6.conf.all.disable_ipv6 = 1

net.ipv6.conf.default.disable_ipv6 = 1

net.ipv4.tcp_challenge_ack_limit = 999999999

kernel.kptr_restrict = 1

fs.file-max = 100000

使用 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

執行命令sysctl -p讓修改生效;

通過命令whereis nginx檢視 nginx 配置檔案所在位置:

[root@test /]# whereis nginx

nginx: /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

[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;

# 省略的內容

使用reboot命令重啟系統後,我們分別使用ulimit -hnulimit -snulimit -a來檢視修改後的效果:

[root@test /]# ulimit -hn

300000

[root@test /]# ulimit -sn

100000

[root@test /]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 15089

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 100000

pipe size (512 bytes, -p) 8

posix message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 15089

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

上述示例的設定值均是對公共伺服器的配置,具體資料請根據系統實際需要進行設定;

如果上述方法仍然沒有解決問題,可以考慮:

1.使用服務的方式啟動 nginx 試試;

2.加配置記憶體。

參考文章:

Vs2010 崩潰(虛擬記憶體不足)

當 visual studio 崩潰並且虛擬記憶體不足時,會顯示此訊息。但是,這並不意味著系統中的虛擬記憶體不足,而是 visual studio 將用盡位址空間。此錯誤通常出現在具有 32 位作業系統的計算機上,這些作業系統會將 visual studio 的位址空間限制為 2gb。在 64 位系...

Winform 記憶體不足

winform 記憶體不足 winform,我給picturebox 賦值 picbox one.backgroundimage image.fromfile 解決方案 picbox one.backgroundimage 每賦值一次,都要把上一次的拉出來釋放掉 c codeif picbox on...

linux 記憶體不足

在linux下增加臨時swap空間 sudo dd if dev zero of home swap bs 64m count 16注釋 of home swap,放置swap的空間。count的大小就是增加的 swap 空間的大小,64m 就是塊大小,這裡是 64mb,所以總共空間就是bs cou...