nginx 服務器並發優化
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 服務器並發優化