前言
上篇介紹了如何構(gòu)建安裝fastsocket內(nèi)核模塊,下面將基于fastsocket/demo/README.md
文件翻譯整理而成。
嗯,下面進入翻譯篇。
介紹
示范為一個簡單TCP Server服務(wù)器程序,用于基準(zhǔn)測試和剖析Liunx內(nèi)核網(wǎng)絡(luò)堆棧性能表現(xiàn),當(dāng)然也是為了演示Fastsocket可擴展和其性能改進。
示范應(yīng)用基于epoll模型和非阻塞性IO,處理網(wǎng)絡(luò)連接,但只有在多核的模式下才能夠工作得很好:程序的每一個進程被綁定到CPU的不同核,起始于CPU core 0,各自獨立處理客戶端連接請求。
示范程序具有兩種工作模式:
- 服務(wù)器模式:任何請求都會直接返回HTTP 200 OK
- 代理模式:服務(wù)器接收到客戶端請求,轉(zhuǎn)發(fā)給后端服務(wù)器,同時轉(zhuǎn)發(fā)后端響應(yīng)給客戶端。
這是一個簡單傻瓜形式的Tcp Server,僅僅用于測試使用,使用時要求客戶端和服務(wù)器端只能夠攜帶一個packet包大小的數(shù)據(jù),否則程序會處理不了。
構(gòu)建
以下面方式進行構(gòu)建:
cd demo && make
用法
最簡單方式以默認配置無參數(shù)形式運行:
./server
參數(shù)如下:
- -w worker_num: 定義進程數(shù).
- 默認值為當(dāng)前可用CPU核心數(shù)個進程.
- -c start_core: 指定進程綁定CPU核的開始索引值
- -o log_file: 定義日志文件名稱
- -a listen_address: 指定監(jiān)聽地址,[ip:port]字符串組合形式,支持添加多個地址
- -x backend_address: 啟動代理模式,需要填寫[ip:port]組合形式地址,支持多個代理地址
- -v: 啟用詳細統(tǒng)計數(shù)據(jù)輸出
- -d: 啟動Debug調(diào)試模式,調(diào)試信息被寫入日志文件中
- -k: 啟用HTTP keepalive機制,當(dāng)前只能夠工作在服務(wù)器模式下
實例
在運行之前,需要注意兩點:
- 為了跑滿CPU,需要確保客戶端和后端服務(wù)器都不應(yīng)該成為瓶頸,兩種可行方案:
- 提供足夠多機器用以充當(dāng)客戶端和后端服務(wù)器角色
- 或在一臺機器上充當(dāng)客戶端和后端服務(wù)器,使用fastsocket(推薦方案,較為節(jié)省服務(wù)器)
- 正確配置網(wǎng)卡,若不知道如何做,可以參考源碼中
script
目錄
服務(wù)器模式示范
服務(wù)器模式至少需要兩臺主機:
- 主機A作為客戶端產(chǎn)生HTTP請求
- 主機B為Web服務(wù)器
設(shè)定每臺主機CPU 12核,網(wǎng)絡(luò)大概設(shè)置如下:
+--------------------+ +--------------------+
... ----- ...
+--------------------+ +--------------------+
下面是運行兩臺主機的步驟:
主機B:
-
Web服務(wù)器模式單獨運行,開啟12個工作進程,和CPU核心數(shù)一致:
./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程序不能夠體現(xiàn)服務(wù)器負載能力,多個ab實例同時并發(fā)運行可能會好很多,開12個實例和CPU核心數(shù)一致:
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作為客戶端產(chǎn)生HTTP請求
- 主機B作為代理角色
- 主機C則需要后端服務(wù)器
設(shè)定每臺機器CPU內(nèi)核數(shù)12,網(wǎng)絡(luò)結(jié)構(gòu)如下:
+--------------------+ +--------------------+ +--------------------+
... ... ...
+---------+----------+ +---------+----------+ +----------+---------+
+---------+--------------------------+---------------------------+---------+
+--------------------------------------------------------------------------+
下面為具體的運行步驟:
主機B:
- 為代理服務(wù)器啟動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服務(wù)器都可以充當(dāng)后端服務(wù)器,這里充分利用示范程序好了:
./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
動手實踐
以上翻譯完畢,下面將是根據(jù)上面內(nèi)容進行動手測試描述吧。
安裝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專業(yè)版跑VMware Workstation 10.04虛擬機,兩個Centos 6.5系統(tǒng),配置一致,2G內(nèi)存,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
服務(wù)器端,分別記錄:
/opt/fast/server -w 8
LD_PRELOAD=../library/libfsocket.so ./server -w 8
服務(wù)器模式對比
兩組數(shù)據(jù)對比:
運行方式 |
處理消耗時間(秒) |
處理總數(shù) |
平均每秒處理數(shù) |
最大值 |
單獨運行 |
34s |
80270 |
2361 |
2674 |
加載fasocket |
28s |
80399 |
2871 |
2964 |
代理模式數(shù)據(jù)
測試方式如上,三臺服務(wù)器(測試端+代理端+服務(wù)器端)配置一樣。第一次代理單獨啟動,第二次代理預(yù)加載fastsocket方式。
運行方式 |
處理消耗時間(秒) |
處理總數(shù) |
平均每秒處理數(shù) |
最大值 |
第一次測試后端 |
44s |
80189 |
1822 |
2150 |
第一次測試代理 |
44s |
80189 |
1822 |
2152 |
第二次測試后端 |
42s |
80051 |
1906 |
2188 |
第二次測試代理 |
42s |
80051 |
1906 |
2167 |
備注:虛擬機上數(shù)據(jù),不代表真實服務(wù)器上數(shù)據(jù),僅供參考。
雖然基于虛擬機,測試環(huán)境受限,但一樣可以看到基于fastsocket服務(wù)器模型,處理性能有所提升:總體處理時間,每秒平均處理數(shù),以及處理上限等。
關(guān)于LD_PRELOAD注意事項
動態(tài)鏈接預(yù)先加載LD_PRELOAD雖是利器,但不是萬能藥,LD_PRELOAD遇到下面情況會失效:
- 靜態(tài)鏈接使用gcc -static參數(shù)把libc.so.6靜態(tài)鏈入執(zhí)行程序中
- 設(shè)置執(zhí)行文件的SUID權(quán)限,可能也會導(dǎo)致LD_PRELOAD失效(如:chmod 4755 daemon)
情況很復(fù)雜,小心為上。
小結(jié)
學(xué)習(xí)并測試了fastsocket的源碼示范部分,前后對比可以看到fastsocket帶來了處理性能的提升。