1. 程式人生 > >nginx 服務器並發優化

nginx 服務器並發優化

rlimit ipv soc tengine recycle ipv4 打開 server 數量

apache 提供的 ab 可以對服務器進行壓力測試,

安裝 ab: apt-get install apache2-utils

安裝完後,ab 在目錄 /usr/bin/ 下的。

執行: ab -c 並發數 -n 請求數 請求的URL 如:

ab -c 2000 -n 50000 http://192.168.137.47/ 表示對 http://192.168.137.47/ 進行50000次請求,並發數為 2000

我運行的機器不是在 192.168.137.47 上,運行時報了一個錯誤: socket: Too many open files

運行: ulimit -n 出現結果 1024,說明最大允許打開的文件描述符的數量為 1024,我們上面並發數為 2000,比1024大,運行下面的命令,設置一個較大的值:

ulimit -n 20000

先運行小一點的壓力測試參數,看看正確返回時, ab 給出的測試報告。如: ab -c 200 -n 5000 http://192.168.137.47/

Server Software: Tengine/2.2.2 # 我用的是 Tengine (https://tengine.taobao.org/ 淘寶對 nginx 的擴展)
Server Hostname: 192.168.137.47
Server Port: 80

Document Path: /
Document Length: 179 bytes



Concurrency Level: 200 # 命令中 -c 的值
Time taken for tests: 16.161 seconds # 總共花費的時間
Complete requests: 5000 # 命令中 -n 的值
Failed requests: 0 #失敗的請求數
Total transferred: 2110000 bytes # 總共傳輸的數據量
HTML transferred: 895000 bytes # 總共的 HTML 內容的傳輸量
Requests per second: 309.38 [#/sec] (mean) # 吞吐率(平均值)

Time per request: 646.447 [ms] (mean) # 平均一次請求所花費的時間,即用戶的等待時間
Time per request: 3.232 [ms] (mean, across all concurrent requests) # 服務器平均一次請求處理時間,吞吐率的倒數
Transfer rate: 127.50 [Kbytes/sec] received # 平均每秒網絡上的流量,可以幫助排除是否存在網絡流量過大導致響應時間延長的問題

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 20 111.8 1 1002
Processing: 4 595 596.6 455 3669
Waiting: 1 593 595.9 452 3608
Total: 4 616 604.5 483 3670

Percentage of the requests served within a certain time (ms)
50% 483 # 50% 的用戶等待時間不超過 483 ms
66% 778 # 66% 的用戶等待時間不超過 778 ms
75% 1021
80% 1119
90% 1484
95% 1804
98% 2137
99% 2337
100% 3670 (longest request)

當加大參數時,如 ab -c 2000 -n 50000 http://192.168.137.47/

這時出現了: apr_socket_recv: Connection reset by peer (104) 這個錯誤,網上有人說是 ab 安裝的問題,其實是服務器配置的問題,在高並發的情況下,服務器撐不住了。因為我用的是虛擬機,一臺真實電腦上,開了4臺虛擬機(兩臺 tomcat 運行 web 服務,一臺 nginx 服務器作負載均衡,一臺運行壓力測試的命令)。需要對 nginx 服務器進行優化:

高並發優化思路:

技術分享圖片

1. 增大 nginx 配置文件中的 worker_connections 數量

2. echo 50000 > /proc/sys/net/core/somaxconn # 最大連接數

3. echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle # 加快 tcp 連接的回收

4. echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse # 空的 tcp 允許回收

5. echo 0 > /proc/sys/net/ipv4/tcp_syncookies # 不做洪水抵禦

6. 增大 nginx 配置文件中的 worker_rlimit_nofile 的值,比如: 10000

7. ulimit -n 20000

再次運行 ab -c 2000 -n 50000 http://192.168.137.47/, 發現能正常返回報告了,因為是單臺機器上裝的虛擬機,當並發達到一定數量時,不管怎麽調,最後總會出錯。

nginx 服務器並發優化