構建高效能web之路------web伺服器長連線
web伺服器都提供長連線的方式,所謂長連線就是客戶端一次請求完後,不關閉連線,保持一段時間的連線,下次此客戶端再次請求時,不用建立新連線,複用所保持的連線即可。從理論上,長連線可以免去大量建立和關閉連線的資源消耗,但同時也有大量連線被佔用的代價。因此可以初步判斷長連線比短連線能帶來更高的TPS,更低的CPU消耗,更少的IO,更高的記憶體佔用,下面通過實戰來驗證。
伺服器環境和測試工具可以見工具和環境準備篇
本次web伺服器選用apache prefork模式,apache長短連線的選擇可以配置httpd.conf裡的KeepAlive選項,如:
KeepAlive On:長連線
KeepAlive Off:短連線
另外如果選擇長連線還需配置KeepAliveTimeout和MaxKeepAliveRequests,其中KeepAliveTimeout為每個長連線服務端保持時長,預設配置為15秒,MaxKeepAliveRequests為每個長連線服務請求最大數,預設配置為100次,本次試驗保持預設配置。
使用ab來壓apache,如:
短連線環境下: /usr/alibaba/install/httpd-2.0.63-prefork/bin/ab -c 100 -n 1000000 http://localhost/
長連線環境下: /usr/alibaba/install/httpd-2.0.63-prefork/bin/ab -c 100 -n 1000000 -k http://localhost/
同時都已100個併發請求apache預設首頁1000000次
然後通過ab測試結果、nmon收集資源消耗和strace跟蹤實際呼叫三個維度來考察短連線和長連線的區別。
1)ab測試結果
短連線:
Concurrency Level: 100 Time taken for tests: 190.754776 seconds Complete requests: 1000000 Failed requests: 0 Write errors: 0 Total transferred: 1891115351 bytes HTML transferred: 1456088816 bytes Requests per second: 5242.33 [#/sec] (mean) Time per request: 19.075 [ms] (mean) Time per request: 0.191 [ms] (mean, across all concurrent requests) Transfer rate: 9681.50 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 8 3.7 8 44 Processing: 1 10 3.8 9 79 Waiting: 0 7 3.0 7 61 Total: 4 18 5.7 17 101
長連線:
Concurrency Level: 100 Time taken for tests: 59.509558 seconds Complete requests: 1000000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 990148 Total transferred: 1927566346 bytes HTML transferred: 1456007280 bytes Requests per second: 16804.02 [#/sec] (mean) Time per request: 5.951 [ms] (mean) Time per request: 0.060 [ms] (mean, across all concurrent requests) Transfer rate: 31631.71 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 12 Processing: 0 5 22.5 1 1406 Waiting: 0 5 22.4 1 1405 Total: 0 5 22.5 1 1409
從中不然發現,在其他引數和環境相同的情況下,長連線比短連線的TPS高很多,16804.02/sec vs 5242.33/sec,另外也不難發現長連線在connection上花的時間幾乎為0
2)nmon 的測試結果
cpu消耗:
短連線
長連線
以上資料表明長連線比短連線消耗CPU較少
IO佔用:
短連線
長連線
以上資料表明長連線比短連線IO佔用更少
記憶體空閒:
短連線
長連線
以上資料表明長連線比短連線佔用更多記憶體
3)strace結果
apache的prefork模式是每個請求由單獨的子程式來響應,因此通過對其中的一個子程式跟蹤來比較呼叫系統資源的次數
短連線:
% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 44.24 0.187941 19 9997 accept 40.22 0.170887 10 17738 poll 2.58 0.010976 0 67716 17737 read 2.49 0.010583 0 59964 9994 lstat 2.19 0.009319 0 49970 9994 stat 1.74 0.007388 0 39976 setsockopt 1.42 0.006045 1 9997 shutdown 1.25 0.005312 0 29988 close 1.06 0.004499 0 19989 open 0.71 0.003003 0 19994 fcntl 0.57 0.002426 0 9994 write 0.45 0.001911 0 9994 writev 0.38 0.001598 0 9994 sendfile 0.35 0.001503 0 9997 getsockname 0.34 0.001439 0 9997 gettimeofday 0.00 0.000002 1 2 fstat 0.00 0.000001 1 1 lseek 0.00 0.000001 1 1 mmap 0.00 0.000001 1 1 munmap ------ ----------- ----------- --------- --------- ---------------- 100.00 0.424835 375310 37725 total
長連線:
% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 37.05 0.032997 3 9919 write 21.90 0.019503 2 9940 poll 10.38 0.009248 0 39676 setsockopt 7.86 0.007000 0 49595 9919 stat 7.46 0.006642 0 59514 9919 lstat 5.35 0.004764 0 49720 9941 read 3.54 0.003156 0 19839 open 2.27 0.002018 0 9919 sendfile 1.95 0.001735 0 19941 close 1.28 0.001143 0 9919 writev 0.92 0.000816 0 9921 gettimeofday 0.02 0.000014 0 200 fcntl 0.01 0.000007 0 100 accept 0.01 0.000007 0 100 getsockname 0.01 0.000006 0 100 1 shutdown 0.00 0.000002 1 2 fstat 0.00 0.000001 1 1 lseek 0.00 0.000001 1 1 mmap 0.00 0.000001 1 1 munmap ------ ----------- ----------- --------- --------- ---------------- 100.00 0.089061 288408 29780 total
以上資料表明,長連線accept和shutdown次數僅為100次,而短連線為9997次,近100倍的差距,從這裡就不難發現為什麼長連線的TPS那麼高了,省了這麼多次系統呼叫,不快才怪啊。
本次試驗得出驗證來開始的理論分析:長連線比短連線能帶來更高的TPS,更低的CPU消耗,更少的IO,更高的記憶體佔用,更少的系統呼叫
相關文章
- TinyWeb–C++構建高效能Web伺服器WebC++伺服器
- 構建高效能WEB之HTTP首部優化WebHTTP優化
- 無法連線到web伺服器iisWeb伺服器
- 高效能 Web 伺服器 LwanWeb伺服器
- LNMP構建高可用WEB伺服器安裝篇LNMPWeb伺服器
- Maven Web專案構建MavenWeb
- 構建Web API服務WebAPI
- node開發web程式---04構建node web程式Web
- Azure web 連線到Azure databaseWebDatabase
- PHP 之內建 Web 伺服器PHPWeb伺服器
- php 內建的 web 伺服器PHPWeb伺服器
- PHP 5.4 內建web伺服器PHPWeb伺服器
- 構建單頁Web應用Web
- lit Web元件:構建快速、輕量級的 Web 元件Web元件
- 長沙Web前端培訓分享:Web前端學習路線Web前端
- 開源高效能 web 快取伺服器 nusterWeb快取伺服器
- web服務中連線池用法Web
- 用IntentService 與ResultReceiver連線web serviceIntentWeb
- Java Web開發相關連線JavaWeb
- 使用 Lambda Web Adapter 在 Lambda 上 構建 web 應用WebAPT
- web長連結技術個人總結Web
- apache虛擬web主機構建ApacheWeb
- 構建Java Web開發環境JavaWeb開發環境
- Google 是如何構建 Web 框架的GoWeb框架
- 使用Golang快速構建WEB應用GolangWeb
- 用Tomcat構建WEB站點TomcatWeb
- 使用 CasperJS 構建 Web 爬蟲JSWeb爬蟲
- 如何構建一個WEB同構應用Web
- 高效能 Web 快取伺服器 nuster 1.7.9.5 釋出Web快取伺服器
- 高效能 Web 快取伺服器 nuster 1.7.9.6 釋出Web快取伺服器
- java web專案中使用Socket通訊多執行緒、長連線JavaWeb執行緒
- Nginx上游伺服器長連線配置Nginx伺服器
- web前端學習之路Web前端
- 五、Spring Web應用程式構建SpringWeb
- WebSocket+Netty構建web聊天程式WebNetty
- 用 GIN 構建一個 WEB 服務Web
- 使用 Cloudflare 構建 Web3 應用CloudWeb
- Centos 7 構建虛擬Web主機CentOSWeb