成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

單機百萬 TCP 連接測試源碼

網絡 通信技術
在看完服務器、客戶端的兩篇單機達成百萬 TCP 連接的文章以后,有很多同學反饋也想實際動手做做實驗,感受一下。為了方便大家,我今天就把我實驗時使用的源代碼整理了出來。

[[382120]]

本文轉載自微信公眾號「開發內功修煉」,作者張彥飛allen。轉載本文請聯系開發內功修煉公眾號。  

在看完服務器、客戶端的兩篇單機達成百萬 TCP 連接的文章以后,有很多同學反饋也想實際動手做做實驗,感受一下。為了方便大家,我今天就把我實驗時使用的源代碼整理了出來。

測試百萬連接我用到的方法有兩種:

  • 第一種是服務器端只開啟一個進程,然后使用很多個客戶端 ip 來連接
  • 第二種是服務器開啟多個進程,這樣客戶端就可以只使用一個 ip 即可

咱們今天先來看第一種方法,另一種下次再發。源碼地址如下,需要手工復制~

源碼地址: https://github.com/yanfeizhang/coder-kung-fu/tree/main/tests/network/test01

鑒于整個實驗做起來還是有點小復雜,所以還是單獨寫一篇文章,配合源代碼一起,讓大家動手起來更輕松。

一、服務器準備

1.1 最大可打開文件句柄調整

細節不說了,直接給出最佳調整辦法。如果踩了坑,或者想了解更詳細的內容,請參見下文

《刨根問底兒,看我如何處理 Too many open files 錯誤!》

先加大系統級最大句柄數 fs.file-max 為大于 100 萬,注意要多打一點余量,干脆直接設置成 110 萬。另外同時要修改的還有系統進程級參數 fs.nr_open, 也一起改成 110 萬。

  1. #vi /etc/sysctl.conf 
  2. fs.file-max=1100000  
  3. fs.nr_open=1100000   

sysctl -p 使得設置生效。并使用 sysctl -a 驗證是否真正生效

  1. #sysctl -p 
  2. #sysctl -a 
  3. fs.file-max = 1100000 
  4. fs.nr_open = 1100000 

接著再加大用戶進程的最大可打開文件數量限制(nofile),這個是在 /etc/security/limits.conf 中配置。這兩個是用戶進程級的,可以按不同的用戶來區分配置。這里為了簡單,就直接配置成所有用戶 * 了。

  1. # vi /etc/security/limits.conf 
  2. *  soft  nofile  1010000   
  3. *  hard  nofile  1010000 

注意 hard nofile 一定要比 fs.nr_open 要小,否則可能導致用戶無法登陸。

配置完后,開個新控制臺即可。使用 ulimit 命令校驗生效

  1. #ulimit -n 
  2. 1010000 

1.2 啟動 server 開始監聽

啟動 server

  1. php server.php 0.0.0.0 8090 

使用 netstat 命令確保 server 監聽成功。

  1. netstat -nlt | grep 8090 
  2. tcp  0   0.0.0.0:8090  0.0.0.0:*  LISTEN 

二、客戶端準備

2.1 調整可用端口范圍

默認情況下,Linux 只開啟了 3 萬多個可用端口。但我們今天的實驗里,一個進程要達到 5 萬的并發。所以,端口范圍的內核參數也是需要修改的。

  1. #vi /etc/sysctl.conf 
  2. net.ipv4.ip_local_port_range = 5000 65000 

執行 sysctl -p 使之生效。

2.2 加大最大可打開文件數

和服務端對應,客戶端的 fs.file-max 也需要加大到 110 萬。不過進程級的參數 fs.nr_open 設置到 60000 就夠了。

  1. #vi /etc/sysctl.conf 
  2. fs.file-max=1100000  
  3. fs.nr_open=60000   

sysctl -p 使得設置生效。并使用 sysctl -a 查看是否真正生效

  1. #sysctl -p 
  2. #sysctl -a 
  3. fs.file-max = 1100000 
  4. fs.nr_open = 60000 

接著再加大用戶進程的最大可打開文件數量限制(nofile),和服務器中的配置方法一樣。不過由于客戶端我們是要開 20 個進程來測的,所以每個進程最大開到 5 萬個文件數就夠了。同樣預留一點余地,所以設置成 55000。

  1. # vi /etc/security/limits.conf 
  2. *  soft  nofile  55000   
  3. *  hard  nofile  55000 

配置完后,開個新控制臺即可。使用 ulimit 命令校驗生效

  1. #ulimit -n 
  2. 55000 

2.3 挑選客戶端可用的新 ip

因為我們這次是要用單臺客戶端來連接同一個 server 的同一個端口。而單客戶端 ip 所能達到的最高連接數是受端口數量限制。最多只有 65535 - 1024 = 64k 個。

解決辦法之一就是使用 20 臺客戶端,每個客戶端發起 5 萬個連接同時來連接這一個server。通過這樣讓服務器能達到 100 萬條 TCP 并發。 但是這個方法實際操作起來太困難了,所以不可行。

另外一個辦法就是采用為一臺機器,在這個機器上配置多個 ip 的方式來搞。在 linux 上可以使用 ifconfig 命令為一臺機器配置多個 ip。例如你的 linux 上的網卡設備為 eth0,現在想配置一個別名為 eth0:1,ip 為 CIP1,掩碼為 255.255.248.0 。則配置 ip 的命令如下:

  1. ifconfig eth0:1 CIP1 netmask 255.255.248.0 up 

所以接下來的事情就是在你的網絡環境中尋找 20 個可用的 ip。假設可用的ip分別是 CIP1,CIP2,......,CIP20。

注意:配置的 ip 必須不能和局域網的其它機器沖突,否則會影響這些機器的正常網絡包的收發。

2.4 為客戶端配置新的 ip

確定了 ip 以后,則開始動手修改測試源碼 clientd.php 中的 $ips 數組,子網掩碼。

為了確保局域網內沒有這些 ip,需要先執行代碼中提供的一個小工具來驗證一下

  1. php clientd.php ping 

當所有的 ip 的 ping 結果均為 false 時,方可進行下一步實驗。

配置所有 ip 并啟動網卡。

  1. php clientd.php ifup 

使用 ifconfig 命令查看 ip 是否配置成功。

  1. #ifconfig 
  2. eth0 
  3. eth0:0 
  4. eth0:1 
  5. ... 
  6. eth:19 

ip 配置完成后,就可以進行下一步實驗了。

三、開始連接實驗

修改 clientd.php 中的服務器 ip 和端口。然后開始連接

  1. php clientd.php start 

同時,另啟一個控制臺。使用 watch 命令來實時觀測 ESTABLISH 狀態連接的數量。

當然,實驗過程中不會一帆風順,可能會有各種意外情況發生。遇到問題別慌,根據錯誤提示看下是哪里不對。然后調整一下,重新做就是了。

重做的時候需要重啟客戶端和服務器。對于客戶端,殺掉所有的客戶端進程的方式是

  1. php clientd.php stop 

對于服務器來說,就更簡單了,直接 ctrl + c 終止服務器進程,再重新啟動就行了。如果發現端口被占用,那是因為操作系統還沒有回收,等一會兒再啟動 server 就行。

當你發現連接數量超過 100 萬的時候,你的實驗就成功了。

  1. watch "ss -ant | grep ESTABLISH" 
  2. 1000013 

這個時候別忘了查看一下你的服務端、客戶端的內存開銷。

先用 cat proc/meminfo 查看,重點看 slab 內存開銷。

  1. $ cat /proc/meminfo 
  2. MemTotal:        3922956 kB 
  3. MemFree:           96652 kB 
  4. MemAvailable:       6448 kB 
  5. Buffers:           44396 kB 
  6. ...... 
  7. Slab:          3241244KB kB 

再用 slabtop 查看一下內核都是分配了哪些內核對象,它們每個的大小各自是多少。

當你這個實驗真正做成功的時候,相信你能有很大的收獲!

四、結束實驗

實驗結束的時候,服務器進程直接 ctrl + c 取消運行就可以??蛻舳舜a可能需要手工關閉一下

  1. php clientd.php stop 

最后記得取消為實驗臨時配置的新 ip

  1. php clientd.php ifdown 

再重復一下本文所用的測試源碼地址

地址: https://github.com/yanfeizhang/coder-kung-fu/tree/main/tests/network/test01

 

責任編輯:武曉燕 來源: 開發內功修煉
相關推薦

2017-01-09 16:06:19

2022-09-09 08:41:43

Netty服務端驅動

2016-12-12 13:44:42

iOe

2021-05-24 10:55:05

Netty單機并發

2024-12-04 13:52:30

2025-05-26 02:20:00

并發協程虛擬內存

2025-06-05 01:22:00

線程虛擬內存系統

2010-12-31 13:44:33

pingnet view

2021-02-03 14:30:30

Linux并發內核

2020-10-14 14:31:37

LinuxTCP連接

2024-10-12 17:57:12

2010-06-17 15:36:35

Linux測試工具

2021-03-13 14:08:00

Hadoop 源碼HDFS

2011-01-24 13:58:24

TCPIP協議棧

2012-11-23 10:00:55

SQL性能測試

2015-04-23 18:46:38

TCPTCP協議

2015-10-09 13:15:03

TCP網絡協議

2019-09-16 09:29:01

TCP全連接隊列半連接隊列

2010-06-13 15:37:24

TCP協議

2010-07-07 10:45:22

TCP UDP協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天色av| 欧美日韩一区在线 | 精品国产乱码久久久久久牛牛 | 国产亚洲一区二区精品 | 夜操| 91精品国产综合久久香蕉麻豆 | 免费视频一区二区 | 久久精品一区二区三区四区 | 欧美日韩国产一区二区三区 | 精品一区av | 色伊人久久| 99精品欧美| 日韩国产在线观看 | 亚洲激情在线视频 | 日本激情一区二区 | 在线视频日韩 | 天天干天天操 | 精品一区国产 | 日韩一级在线 | 日韩中文字幕 | 亚洲一区国产精品 | 久久久涩| 久久久一区二区三区 | 国产中文字幕在线观看 | aaaaaa大片免费看最大的 | 久久国产一区 | 色狠狠一区 | 欧美黑人又粗大 | 日本手机看片 | 国产精品视频一二三区 | 国产免费xxx | 欧一区二区 | 正在播放国产精品 | 日韩在线视频播放 | 91精品国产乱码久久蜜臀 | 免费av毛片| a毛片视频网站 | 国内精品久久久久 | 亚洲综合99 | 亚洲一区二区精品视频 | 九九久久久 |