寫在前面

最近,在服務器上搭建了一套壓測環境,不爲別的,就爲壓測下Nginx的性能,到底有沒有傳說中的那麼牛逼!具體環境爲:11臺虛擬機,全部安裝CentOS 6.8 64位操作系統,1臺安裝部署Nginx,其他10臺作爲客戶端同時以壓滿CPU的線程向Nginx發送請求,對Nginx進行壓測。沒想到,出現問題了!!

Nginx報錯

Nginx服務器訪問量非常高,在Nginx的錯誤日誌中不停的輸出如下錯誤信息。

2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)
2020-07-23 02:53:49 [alert] 13576#0: accept() failed (24: Too many open files)

根據錯誤日誌的輸出信息,我們可以看出:是打開的文件句柄數太多了,導致Nginx報錯了!那我們該如何解決這個問題呢?

問題分析

既然我們能夠從Nginx的錯誤日誌中基本能夠確定導致問題的原因,那這到底是不是Nginx本身的問題呢?答案爲:是,也不全是!

爲啥呢?原因很簡單:Nginx無法打開那麼多的文件句柄,一方面是因爲我沒有配置Nginx能夠打開的最大文件數;另一方面是因爲CentOS 6.8操作系統本身對打開的最大文件句柄數有限制,我同樣沒有配置操作系統的最大文件句柄數。所以說,不全是Nginx的鍋!在某種意義上說,我錯怪Nginx了!

在CentOS 6.8服務器中,我們可以在命令行輸入如下命令來查看服務器默認配置的最大文件句柄數。

[root@binghe150 ~]# ulimit -n
1024

可以看到,在CentOS 6.8服務器中,默認的最大文件句柄數爲1024。

此時,當Nginx的連接數超過1024時,Nginx的錯誤日誌中就會輸出如下錯誤信息。

[alert] 13576#0: accept() failed (24: Too many open files)

解決問題

那我們該如何解決這個問題呢?其實,也很簡單,繼續往下看!

使用如下命令可以把打開文件句柄數設置的足夠大。

ulimit -n 655350

同時修改nginx.conf , 添加如下配置項。

worker_rlimit_nofile 655350;

注意:上述配置需要與error_log同級別。

這樣就可以解決Nginx連接過多的問題,Nginx就可以支持高併發(這裏需要配置Nginx)。

另外, ulimit -n 還會影響到MySQL的併發連接數。把它提高,也可以提高MySQL的併發。

注意: 用 ulimit -n 655350 修改只對當前的shell有效,退出後失效。

永久解決問題

若要令修改ulimits的數值永久生效,則必須修改配置文件,可以給ulimit修改命令放入/etc/profile裏面,這個方法實在是不方便。

還有一個方法是修改/etc/security/limits.conf配置文件,如下所示。

vim /etc/security/limits.conf

在文件最後添加如下配置項。

* soft nofile 655360
* hard nofile 655360

保存並退出vim編輯器。

其中:星號代表全局, soft爲軟件,hard爲硬件,nofile爲這裏指可打開的文件句柄數。

最後,需要注意的是:要使 limits.conf 文件配置生效,必須要確保 pam_limits.so 文件被加入到啓動文件中。查看 /etc/pam.d/login 文件中是否存在如下配置。

session required /lib64/security/pam_limits.so

不存在,則需要添加上述配置項。

獲取福利

關注「 冰河技術 」微信公衆號,後臺回覆 “設計模式” 關鍵字領取《深入淺出Java 23種設計模式》PDF文檔。回覆“Java8”關鍵字領取《Java8新特性教程》PDF文檔。

好了,今天就聊到這兒吧!別忘了點個贊,給個在看和轉發,讓更多的人看到,一起學習,一起進步!!

寫在最後

如果你覺得冰河寫的還不錯,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習高併發、分佈式、微服務、大數據、互聯網和雲原生技術,「 冰河技術 」微信公衆號更新了大量技術專題,每一篇技術文章乾貨滿滿!不少讀者已經通過閱讀「 冰河技術 」微信公衆號文章,吊打面試官,成功跳槽到大廠;也有不少讀者實現了技術上的飛躍,成爲公司的技術骨幹!如果你也想像他們一樣提升自己的能力,實現技術能力的飛躍,進大廠,升職加薪,那就關注「 冰河技術 」微信公衆號吧,每天更新超硬核技術乾貨,讓你對如何提升技術能力不再迷茫!

相關文章