聶永的博客

          記錄工作/學習的點點滴滴。

          Fastsocket學習筆記之示范應用篇

          前言

          上篇介紹了如何構建安裝fastsocket內核模塊,下面將基于fastsocket/demo/README.md文件翻譯整理而成。

          嗯,下面進入翻譯篇。

          介紹

          示范為一個簡單TCP Server服務器程序,用于基準測試和剖析Liunx內核網絡堆棧性能表現,當然也是為了演示Fastsocket可擴展和其性能改進。

          示范應用基于epoll模型和非阻塞性IO,處理網絡連接,但只有在多核的模式下才能夠工作得很好:程序的每一個進程被綁定到CPU的不同核,起始于CPU core 0,各自獨立處理客戶端連接請求。

          示范程序具有兩種工作模式:

          • 服務器模式:任何請求都會直接返回HTTP 200 OK
          • 代理模式:服務器接收到客戶端請求,轉發給后端服務器,同時轉發后端響應給客戶端。

          這是一個簡單傻瓜形式的Tcp Server,僅僅用于測試使用,使用時要求客戶端和服務器端只能夠攜帶一個packet包大小的數據,否則程序會處理不了。

          構建

          以下面方式進行構建:

          cd demo && make

          用法

          最簡單方式以默認配置無參數形式運行:

          ./server

          參數如下:

          • -w worker_num: 定義進程數.
            • 默認值為當前可用CPU核心數個進程.
          • -c start_core: 指定進程綁定CPU核的開始索引值
            • 默認值為 0.
          • -o log_file: 定義日志文件名稱
            • 默認值為 ./demo.log
          • -a listen_address: 指定監聽地址,[ip:port]字符串組合形式,支持添加多個地址
            • 默認值為 0.0.0.0:80
          • -x backend_address: 啟動代理模式,需要填寫[ip:port]組合形式地址,支持多個代理地址
            • 默認不開啟
          • -v: 啟用詳細統計數據輸出
            • 默認為禁用
          • -d: 啟動Debug調試模式,調試信息被寫入日志文件中
            • 默認禁用
          • -k: 啟用HTTP keepalive機制,當前只能夠工作在服務器模式下
            • 默認被禁用

          實例

          在運行之前,需要注意兩點:

          • 為了跑滿CPU,需要確保客戶端和后端服務器都不應該成為瓶頸,兩種可行方案:
            • 提供足夠多機器用以充當客戶端和后端服務器角色
            • 或在一臺機器上充當客戶端和后端服務器,使用fastsocket(推薦方案,較為節省服務器)
          • 正確配置網卡,若不知道如何做,可以參考源碼中script目錄

          服務器模式示范

          服務器模式至少需要兩臺主機:

          • 主機A作為客戶端產生HTTP請求
          • 主機B為Web服務器

          設定每臺主機CPU 12核,網絡大概設置如下:

           +--------------------+     +--------------------+
           |       Host A       |     |      Host B        |
           |                    |     |                    |
           |    10.0.0.1/24     |-----|    10.0.0.2/24     |
           |                    |     |                    |
           +--------------------+     +--------------------+
          

          下面是運行兩臺主機的步驟:

          主機B

          • Web服務器模式單獨運行,開啟12個工作進程,和CPU核心數一致:

            ./server -w 12 -a 10.0.0.2:80

          • 或者測試借助于Fastsocket所帶來的性能

            LD_PRELOAD=../library/libfsocket.so ./server -w 12 -a 10.0.0.2:80

          主機A

          • 運行Apache ab程序作為請求者
            ab -n 1000000 -c 100 http://10.0.0.2:80/
          • 單個Apache ab程序不能夠體現服務器負載能力,多個ab實例同時并發運行可能會好很多,開12個實例和CPU核心數一致: N=12; for i in $(seq 1 $N); do ab -n 1000000 -c 100 http://10.0.0.2:80/ > /dev/null 2>&1; done

          代理模式示范

          代理模式下,需要三臺機器:

          • 主機A作為客戶端產生HTTP請求
          • 主機B作為代理角色
          • 主機C則需要后端服務器

          設定每臺機器CPU內核數12,網絡結構如下:

           +--------------------+     +--------------------+     +--------------------+
           |       Host A       |     |       Host B       |     |       Host C       |
           |                    |     |                    |     |                    |
           |    10.0.0.1/24     |     |    10.0.0.2/24     |     |     10.0.0.3/24    |
           +---------+----------+     +---------+----------+     +----------+---------+
                     |                          |                           |
           +---------+--------------------------+---------------------------+---------+
           |                                 switch                                   |
           +--------------------------------------------------------------------------+
          

          下面為具體的運行步驟:

          主機B

          • 為代理服務器啟動12個進程
            ./server -w 12 -a 10.0.0.2:80 -x 10.0.0.3:80
          • 或者以Fastsocket方式啟動 LD_PRELOAD=../library/libsocket.so ./server -w 12 -a 10.0.0.2:80 -x 10.0.0.3:80

          主機C

          • 理論上任何WEB服務器都可以充當后端服務器,這里充分利用示范程序好了:
            ./server -w 12 -a 10.0.0.3:80

          主機A

          • 作為客戶端請求生成器,同樣啟動12個Apache ab實例:
            N=12; for i in $(seq 1 $N); do ab -n 1000000 -c 100 http://10.0.0.2:80/ > /dev/null 2>&1; done

          動手實踐

          以上翻譯完畢,下面將是根據上面內容進行動手測試描述吧。

          安裝Apache ab命令

          檢查一下包含Apache ab命令的軟件包:

          yum provides /usr/bin/ab

          可以看到類似于如下字樣:

          httpd-tools-2.2.15-39.el6.centos.x86_64 : Tools for use with the Apache HTTP Server

          安裝它就可以了

          yum install httpd-tools

          虛擬機測試

          Windows 7專業版跑VMware Workstation 10.04虛擬機,兩個Centos 6.5系統,配置一致,2G內存,8個CPU邏輯處理器核心。

          客戶端安裝Apache ab命令測試,跑8個實例: for i in $(seq 1 8); do ab -n 10000 -c 100 http://192.168.192.16:80/ > /dev/null 2>&1; done

          服務器端,分別記錄:
          /opt/fast/server -w 8 LD_PRELOAD=../library/libfsocket.so ./server -w 8

          服務器模式對比

          兩組數據對比:

          運行方式 處理消耗時間(秒) 處理總數 平均每秒處理數 最大值
          單獨運行 34s 80270 2361 2674
          加載fasocket 28s 80399 2871 2964

          代理模式數據

          測試方式如上,三臺服務器(測試端+代理端+服務器端)配置一樣。第一次代理單獨啟動,第二次代理預加載fastsocket方式。

          運行方式 處理消耗時間(秒) 處理總數 平均每秒處理數 最大值
          第一次測試后端 44s 80189 1822 2150
          第一次測試代理 44s 80189 1822 2152
          第二次測試后端 42s 80051 1906 2188
          第二次測試代理 42s 80051 1906 2167

          備注:虛擬機上數據,不代表真實服務器上數據,僅供參考。

          雖然基于虛擬機,測試環境受限,但一樣可以看到基于fastsocket服務器模型,處理性能有所提升:總體處理時間,每秒平均處理數,以及處理上限等。

          關于LD_PRELOAD注意事項

          動態鏈接預先加載LD_PRELOAD雖是利器,但不是萬能藥,LD_PRELOAD遇到下面情況會失效:

          • 靜態鏈接使用gcc -static參數把libc.so.6靜態鏈入執行程序中
          • 設置執行文件的SUID權限,可能也會導致LD_PRELOAD失效(如:chmod 4755 daemon)

          情況很復雜,小心為上。

          小結

          學習并測試了fastsocket的源碼示范部分,前后對比可以看到fastsocket帶來了處理性能的提升。

          posted on 2015-01-29 17:16 nieyong 閱讀(4430) 評論(1)  編輯  收藏 所屬分類: Socket

          評論

          # re: Fastsocket學習筆記之示范應用篇 2015-01-29 21:38 京山游俠

          測試最能說明問題,看來性能提升不錯。  回復  更多評論   

          公告

          所有文章皆為原創,若轉載請標明出處,謝謝~

          新浪微博,歡迎關注:

          導航

          <2015年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 威远县| 磴口县| 田林县| 延庆县| 兴海县| 江津市| 郎溪县| 观塘区| 青阳县| 乌兰县| 铁岭市| 合作市| 大丰市| 洛南县| 苗栗市| 双峰县| 兴宁市| 前郭尔| 苏尼特右旗| 大渡口区| 墨玉县| 乌审旗| 凉城县| 甘肃省| 奇台县| 张掖市| 元阳县| 正安县| 含山县| 伊金霍洛旗| 扎赉特旗| 通州区| 田林县| 瓦房店市| 施甸县| 龙口市| 得荣县| 龙山县| 天峨县| 铜山县| 新田县|