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