常見的端口轉發程序有socat、Brook、nginx、rinetd、iptables等,大部分已經在博客做過介紹,有興趣的同學可參考我之前的文章。
網上關于端口轉發軟件的評測非常少,最近正好將socat與Brook都打包為了Docker鏡像,今天先用他兩來比一比,測一測,看看到底誰的效率更好一些。(非權威測試,結果僅供參考)
測試環境
已經在目標服務器163.172.35.xxx
安裝好了WebServer(Nginx),同時在中繼服務器137.175.30.xxx
上分別部署了socat和brook進行端口轉發到目標的80
端口上,信息如下。
- 目標服務器:163.172.35.xxx:80
- 中繼服務器:137.175.30.xxx:32771(socat)
- 中繼服務器:137.175.30.xxx:32770(brook)
初始環境(第一輪)
socat與Brook均是通過Docker方式部署,部署完畢后,沒有任何連接的情況下,內存占用情況如下。
socat占用內存不到800Kb
Brook占用1.8Mb內存
hey進行HTTP壓力測試(第二輪)
接下來通過工具分別對兩個不同的轉發端口進行HTTP并發壓力測試,測試命令為:
./hey -n 10000 -c 1000 -m GET http://xxx/
上面命令是對中繼服務器發起10000個請求,客戶端并發連接數為1000
socat壓測結果:最高內存占用154Mb
,最高CPU使用率32%
,耗時67s
,平均耗時1.5347s
,錯誤次數238
次
Summary:
Total: 67.5975 secs
Slowest: 19.9194 secs
Fastest: 0.3516 secs
Average: 1.5347 secs
Requests/sec: 147.9345
Response time histogram:
0.352 [1] |
2.308 [8318] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
4.265 [738] |■■■■
6.222 [227] |■
8.179 [166] |■
10.136 [100] |
12.092 [48] |
14.049 [53] |
16.006 [31] |
17.963 [39] |
19.919 [41] |
Latency distribution:
10% in 0.3608 secs
25% in 0.3721 secs
50% in 0.7243 secs
75% in 1.4874 secs
90% in 3.3814 secs
95% in 6.0845 secs
99% in 14.1610 secs
Details (average, fastest, slowest):
DNS+dialup: 0.0225 secs, 0.3516 secs, 19.9194 secs
DNS-lookup: 0.0000 secs, 0.0000 secs, 0.0000 secs
req write: 0.0001 secs, 0.0000 secs, 0.0309 secs
resp wait: 1.4584 secs, 0.3515 secs, 19.9191 secs
resp read: 0.0002 secs, 0.0001 secs, 0.0270 secs
Status code distribution:
[200] 9762 responses
Error distribution:
[238] Get "http://137.175.30.xxx:32771/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
brook壓測結果:最高內存占用25Mb
,最高CPU使用率64%
,總耗時44s
,平均耗時1.0304s
,錯誤次數67
次
Summary:
Total: 44.2130 secs
Slowest: 19.4560 secs
Fastest: 0.3522 secs
Average: 1.0304 secs
Requests/sec: 226.1777
Response time histogram:
0.352 [1] |
2.263 [9106] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
4.173 [528] |■■
6.083 [158] |■
7.994 [69] |
9.904 [22] |
11.814 [17] |
13.725 [7] |
15.635 [11] |
17.546 [9] |
19.456 [5] |
Latency distribution:
10% in 0.3605 secs
25% in 0.3687 secs
50% in 0.5565 secs
75% in 1.0805 secs
90% in 2.0481 secs
95% in 2.8718 secs
99% in 7.2565 secs
Details (average, fastest, slowest):
DNS+dialup: 0.0192 secs, 0.3522 secs, 19.4560 secs
DNS-lookup: 0.0000 secs, 0.0000 secs, 0.0000 secs
req write: 0.0001 secs, 0.0000 secs, 0.0117 secs
resp wait: 0.9539 secs, 0.3519 secs, 19.4558 secs
resp read: 0.0002 secs, 0.0001 secs, 0.0316 secs
Status code distribution:
[200] 9933 responses
Error distribution:
[67] Get "http://137.175.30.xxx:32770/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
以上結果xiaoz反復壓測了幾次,數據方向基本一致。
axel多線程下載測試(第三輪)
測試命令
time axel -n 32 "http://137.175.30.xxx:32771/test"
測試文件為200M,使用axel
開啟32線程進行下載。
socat測試結果:耗時48m44s
,最高內存占用5.8Mb
左右。
real 48m44.111s
user 0m1.934s
sys 0m10.616s
Brook測試結果:耗時36m3.646s
,最高內存占用2.9Mb
左右。
real 36m3.646s
user 0m1.730s
sys 0m8.930s
數據匯總
軟件名稱/測試項 | socat | brook |
---|---|---|
初始內存 | 800Kb | 1.8Mb |
hey壓測(耗時) | 67s | 44s |
hey壓測(max(cpu)) | 32% | 64% |
hey壓測(錯誤次數) | 238 | 67 |
hey壓測(max(mem)) | 154Mb | 25Mb |
axel 32線程下載(耗時) | 48m44s | 36m3s |
axel 32線程下載(max(mem)) | 5.8Mb | 2.9Mb |
- 初始內存socat占用比brook更低
- 高并發情況下socat內存占用比brook更高
- 高并發情況下brook CPU占用比socat更高
- 多線程下載,brook效率好于socat
總結
以上結果僅針對HTTP轉發進行壓測,由于環境、網絡等多方面因素影響,也沒仔細研究socat參數,不保障數據100%準確性,有興趣的同學可以自行測試,針對以上測試數據,xiaoz給出的建議如下。
- 如果是個人少量使用,并且機器配置較低的情況下建議socat
- 如果并發較大,要求更高的效率,建議選擇brook
后續將對其它端口轉發軟件做對比測試,敬請關注。