千萬並發連接實戰


c10k,c100k,c1000k等問題大家都已經司空見慣,那么10m(千萬)並發連接呢?今天就來一起挑戰一下。

准備機器

  10m連接,大家的個人電腦肯定無法滿足要求,如果不是在大公司任職,弄個實際的物理機對大家是個奢望。那么怎么辦?我也面臨同樣問題。
  現在的雲計算這么發達,還可以按小時計費,一小時的費用也就幾元,那就試試雲計算產品吧。小編先是在阿里雲上測試,但阿里雲的按需付費主機配置不高,費了不少時間,最終只跑到了3m個連接。阿里雲的不行,是主機的配置問題還是程序的問題呢?為了得到最終的結論,我嘗試了其他的雲產品,最終ucloud的雲主機給了我興奮的答案。

  首先創建ucloud主機
ucloud主機(一共需要兩台,一台作為服務器,一台作為客戶端):
. 選擇主機管理的創建主機
. 系統選擇ubuntu14.4 64bit (小編的測試程序是c++11,需要高版本的g++)
. 機型標准版
. 網絡增強一定要選擇開啟 (千萬連接是網絡IO密集型,網絡當然要強大型)
. cpu 16核 內存64G 數據盤0
. 下一步中的網絡類型選擇基礎網絡即可,創建主機之后,需要購買彈性ip,並且綁定到主機
. 價格:小編實驗時,上述的配置,一台僅需7.2元一小時,兩台不到15元

  做實驗的時候,大家記得要眼疾手快哦,一小時十幾元,獲得了自己想要的結果就趕緊釋放主機哈

調整系統參數

  10m並發連接對系統是個挑戰,需要調整相關的參數

sysctl -w fs.file-max=10485760 #系統允許的文件描述符數量10m
sysctl -w net.ipv4.tcp_rmem=1024 #每個tcp連接的讀取緩沖區1k,一個連接1k,10m只需要10G
sysctl -w net.ipv4.tcp_wmem=1024 #每個tcp連接的寫入緩沖區1k
sysctl -w net.ipv4.ip_local_port_range='1024 65535'
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1
echo '* soft nofile 1048576' >> /etc/security/limits.conf #用戶單進程的最大文件數,用戶登錄時生效
echo '* hard nofile 1048576' >> /etc/security/limits.conf #用戶單進程的最大文件數,用戶登錄時生效
ulimit -n 1048576 #用戶單進程的最大文件數 當前會話生效

部署程序

  下面可以開始部署我們的測試程序了

apt-get update
apt-get install -y screen git make g++ nload iptraf

git clone https://github.com/yedf/handy
cd handy
git checkout 3c2ca59524bd
make -j4 cd examples

運行測試程序

  選取一台主機S作為服務器,運行命令
python 1kw-svr.py 1000 1000 10
  該腳本會以job方式啟動十個進程,每個進程監聽100個端口,一共監聽了1000-2000的1000個端口,每個服務器簡單的echo收到的數據
  選取另一台主機C作為客戶端,在screen里運行命令(需要填寫S的內網ip)
python 1kw-cli.py ip-S 1000 2000 10000000 1000 300
  該腳本會以job啟動1000個進程,每個進程會產生1w(10000000/1000)個連接,連接S的1000-2000端口。最后的300表示每300秒往服務器發送一個數據包
  每個進程都會幾秒輸出一條信息,1000個進程會造成刷屏,表面刷屏數據導致的外網網絡流量可能影響ssh,一般觀察一小段時間后,小編就detach screen了
  10m連接的創建需要花費不少時間的,如果瘋狂的創建連接,導致的結果是很多連接都不成功,於是腳本每啟動一個進程,睡眠0.5s,讓連接的創建速度保持在2w/s,因此大約需要10分鍾的時間才能把所有連接都創建成功。

觀察結果

  然后,10m連接的建立就不需要更多的步驟啦,使用命令
watch ss -s
  我們就可以開始觀察連接的創建進度啦,看着連接漸漸的往上走,超過10w,100w是不是很有成就感。

更多內容

  還可以通過iptraf,nload等工具來查看系統的網絡情況

  系統在上面千萬連接運行中,並沒有多少的負載,當然啦,一部分負載跑到底層的hypervisor去了

  小編實驗的機器上內存占用大約40G,平均一個連接前后一共用了4k,不多不多

  網絡發包數量是3w/s,收包數量是6w/s,這是為什么呢?熟悉tcp協議的同學可能已經知道了,C發送數據,S回應數據並帶了ACK,C需要對S發送的數據ACK

  大家還可以跑兩個發送大量數據的程序,例如
./1kw-cli ip-S 1000 2000 10000 0 1024
  這個程序會打開10000個連接,不斷的與S進行數據收發,數據大小為1024Byte
  小編這里啟動了兩個這樣的程序,網卡流量立刻就超過了500MBit/s

  寫到這里,順便給出我測是的ucloud主機的性能參數吧:
  網卡流量最多可以到1.2GBit/s,並非所有時間都到了這么高,並不穩定,一般在800M-1.2G之間波動
  tcp收包發包的最高qps是12w/s,多了就上不去了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM