熟悉網絡編程的都清楚系統只有65535個端口可用,1024如下的端口爲系統保留,因此除去系統保留端口後可用的只有65411個端口,而一個TCP鏈接由TCP四元組(源IP、源端口、TCP、目標IP、目標端口)惟一肯定,因此單機一個網卡時客戶端最多隻能打開65411個TCP鏈接,而有時咱們的TCP服務須要數十萬、上百萬甚至更多TCP鏈接的壓力測試,這時怎麼辦呢,一般有幾個辦法能夠解決:掛多網卡、加機器;
一、掛多網卡要是真買網卡這也是個麻煩的事情或許你機器還不支持,還有就是添加虛擬網卡,這卻是不用什麼成本,寫寫腳本或許能解決但也要費很多神;
二、加機器這個成本就比較高了,一臺機器開6wTCP鏈接,壓60w就須要開十臺這個太麻煩了;
有沒有比較簡單可行的解決方案只要機器性能知足就能秒開數十萬TCP鏈接呢,這裏給出的方案是藉助這幾年技術圈比較火的Docker,其實這裏和上面一點中加虛擬網卡是同樣的,只是建立網卡這一步Docker幫咱們作了,並且還能秒級啓動客戶端程序;git
原理很簡單,發起TCP鏈接的客戶端程序丟到Docker容器中,因爲Docker容器使用了Linux的網絡名稱空間(Network Namespace),容器會本身幫咱們建立虛擬網卡,咱們沒必要關係這塊,只要配好客戶端相關配置啓動容器便可;
因爲咱們是要發起超過6w多個TCP請求鏈接,而手機啓動多個Docker容器也是件麻煩的事情,這裏又藉助了Docker的一個服務編排的工具Docker Compose這樣就能夠一鍵發起數十萬TCP請求鏈接,是要你機器性能知足開多少個鏈接都沒多大問題;
若是服務的TCP通訊壓力比較大那借助Docker Swarm或Kubernetes使用Docker集羣發起TCP鏈接壓測更好;github
在Docker宿主機中部署服務端,其實服務端不必定要部署在Docker宿主機中,而後把客戶端放在Docker鏡像中,啓動容器運行該客戶端便可;docker
一、啓動服務端:編程
二、生成鏡像且鏡像中包含了該客戶端程序:
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鏡像:app
三、編寫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性能
當前配置爲每一個容器中的客戶端發起35000個TCP鏈接,因此服務端鏈接總數爲70000;測試
當修改scale=3,再次執行:docker-compose up -d --scale demo-client=3,容器將擴容爲三個,因此爲105000個鏈接發起TCP鏈接;spa
查看當前容器數:
能夠說分分鐘就發起N多TCP請求,完整的代碼示例在github上,須要的自行獲取;https://github.com/linxin26/TcpConnectionTest