天天看點

借助Docker單機秒開數十萬TCP連接配接

熟悉網絡程式設計的都清楚系統隻有65535個端口可用,1024以下的端口為系統保留,是以除去系統保留端口後可用的隻有65411個端口,而一個TCP連接配接由TCP四元組(源IP、源端口、TCP、目标IP、目标端口)唯一确定,是以單機一個網卡時用戶端最多隻能打開65411個TCP連接配接,而有時我們的TCP服務需要數十萬、上百萬甚至更多TCP連接配接的壓力測試,這時怎麼辦呢,通常有幾個辦法可以解決:挂多網卡、加機器;

  1、挂多網卡要是真買網卡這也是個麻煩的事情或許你機器還不支援,還有就是添加虛拟網卡,這倒是不用什麼成本,寫寫腳本或許能解決但也要費不少神;

  2、加機器這個成本就比較高了,一台機器開6wTCP連接配接,壓60w就需要開十台這個太麻煩了;

  有沒有比較簡單可行的解決方案隻要機器性能滿足就能秒開數十萬TCP連接配接呢,這裡給出的方案是借助這幾年技術圈比較火的Docker,其實這裡和上面一點中加虛拟網卡是一樣的,隻是建立網卡這一步Docker幫我們做了,而且還能秒級啟動用戶端程式;

流程

  原理很簡單,發起TCP連接配接的用戶端程式丢到Docker容器中,由于Docker容器使用了Linux的網絡名稱空間(Network Namespace),容器會自己幫我們建立虛拟網卡,我們不必關系這塊,隻要配好用戶端相關配置啟動容器即可;

  由于我們是要發起超過6w多個TCP請求連接配接,而手機啟動多個Docker容器也是件麻煩的事情,這裡又借助了Docker的一個服務編排的工具Docker Compose這樣就可以一鍵發起數十萬TCP請求連接配接,是要你機器性能滿足開多少個連接配接都沒多大問題;

  如果服務的TCP通信壓力比較大那借助Docker Swarm或Kubernetes使用Docker叢集發起TCP連接配接壓測更好;

示例

  在Docker主控端中部署服務端,其實服務端不一定要部署在Docker主控端中,然後把用戶端放在Docker鏡像中,啟動容器運作該用戶端即可;

  1、啟動服務端:

借助Docker單機秒開數十萬TCP連接配接

  2、生成鏡像且鏡像中包含了該用戶端程式:

  Dockerfile檔案内容:

FROM alpine:3.6
 # 設定locale
 ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 ENV TZ=Asia/Shanghai

 RUN mkdir /app_home
 RUN echo 'net.ipv4.ip_local_port_range = 8001 65000' >> /etc/sysctl.conf

 WORKDIR /app_home

 COPY client /app_home

 RUN chmod +x /app_home/client

 ENV CLIENT=/app_home
 ENV PATH $CLIENT:$PATH
           

  生成了:solinx.co/market/demo-client:0.1鏡像:

借助Docker單機秒開數十萬TCP連接配接

  3、編寫docker-compose.yaml檔案:

version: '2'
 services:
  demo-client:
     image: "solinx.co/market/demo-client:0.1"
     environment:
       TEST: test
     command:
       sh -c "sysctl -p && client -serverAddr=172.16.187.228:28009 -total=35000"
    restart: always
 privileged: true
           

  啟動容器:docker-compose up -d --scale demo-client=2

借助Docker單機秒開數十萬TCP連接配接

  目前配置為每個容器中的用戶端發起35000個TCP連接配接,是以服務端連接配接總數為70000;

借助Docker單機秒開數十萬TCP連接配接

  當修改scale=3,再次執行:docker-compose up -d --scale demo-client=3,容器将擴容為三個,是以為105000個連接配接發起TCP連接配接;

借助Docker單機秒開數十萬TCP連接配接

  檢視目前容器數:

借助Docker單機秒開數十萬TCP連接配接

  可以說分分鐘就發起N多TCP請求,完整的代碼示例在github上,需要的自行擷取;https://github.com/linxin26/TcpConnectionTest

文章首發位址:Solinx

http://www.solinx.co/archives/1119