自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

單機(jī)百萬(wàn) TCP 連接測(cè)試源碼

網(wǎng)絡(luò) 通信技術(shù)
在看完服務(wù)器、客戶(hù)端的兩篇單機(jī)達(dá)成百萬(wàn) TCP 連接的文章以后,有很多同學(xué)反饋也想實(shí)際動(dòng)手做做實(shí)驗(yàn),感受一下。為了方便大家,我今天就把我實(shí)驗(yàn)時(shí)使用的源代碼整理了出來(lái)。

[[382120]]

本文轉(zhuǎn)載自微信公眾號(hào)「開(kāi)發(fā)內(nèi)功修煉」,作者張彥飛allen。轉(zhuǎn)載本文請(qǐng)聯(lián)系開(kāi)發(fā)內(nèi)功修煉公眾號(hào)。  

在看完服務(wù)器、客戶(hù)端的兩篇單機(jī)達(dá)成百萬(wàn) TCP 連接的文章以后,有很多同學(xué)反饋也想實(shí)際動(dòng)手做做實(shí)驗(yàn),感受一下。為了方便大家,我今天就把我實(shí)驗(yàn)時(shí)使用的源代碼整理了出來(lái)。

測(cè)試百萬(wàn)連接我用到的方法有兩種:

  • 第一種是服務(wù)器端只開(kāi)啟一個(gè)進(jìn)程,然后使用很多個(gè)客戶(hù)端 ip 來(lái)連接
  • 第二種是服務(wù)器開(kāi)啟多個(gè)進(jìn)程,這樣客戶(hù)端就可以只使用一個(gè) ip 即可

咱們今天先來(lái)看第一種方法,另一種下次再發(fā)。源碼地址如下,需要手工復(fù)制~

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

鑒于整個(gè)實(shí)驗(yàn)做起來(lái)還是有點(diǎn)小復(fù)雜,所以還是單獨(dú)寫(xiě)一篇文章,配合源代碼一起,讓大家動(dòng)手起來(lái)更輕松。

一、服務(wù)器準(zhǔn)備

1.1 最大可打開(kāi)文件句柄調(diào)整

細(xì)節(jié)不說(shuō)了,直接給出最佳調(diào)整辦法。如果踩了坑,或者想了解更詳細(xì)的內(nèi)容,請(qǐng)參見(jiàn)下文

《刨根問(wèn)底兒,看我如何處理 Too many open files 錯(cuò)誤!》

先加大系統(tǒng)級(jí)最大句柄數(shù) fs.file-max 為大于 100 萬(wàn),注意要多打一點(diǎn)余量,干脆直接設(shè)置成 110 萬(wàn)。另外同時(shí)要修改的還有系統(tǒng)進(jìn)程級(jí)參數(shù) fs.nr_open, 也一起改成 110 萬(wàn)。

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

sysctl -p 使得設(shè)置生效。并使用 sysctl -a 驗(yàn)證是否真正生效

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

接著再加大用戶(hù)進(jìn)程的最大可打開(kāi)文件數(shù)量限制(nofile),這個(gè)是在 /etc/security/limits.conf 中配置。這兩個(gè)是用戶(hù)進(jìn)程級(jí)的,可以按不同的用戶(hù)來(lái)區(qū)分配置。這里為了簡(jiǎn)單,就直接配置成所有用戶(hù) * 了。

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

注意 hard nofile 一定要比 fs.nr_open 要小,否則可能導(dǎo)致用戶(hù)無(wú)法登陸。

配置完后,開(kāi)個(gè)新控制臺(tái)即可。使用 ulimit 命令校驗(yàn)生效

  1. #ulimit -n 
  2. 1010000 

1.2 啟動(dòng) server 開(kāi)始監(jiān)聽(tīng)

啟動(dòng) server

  1. php server.php 0.0.0.0 8090 

使用 netstat 命令確保 server 監(jiān)聽(tīng)成功。

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

二、客戶(hù)端準(zhǔn)備

2.1 調(diào)整可用端口范圍

默認(rèn)情況下,Linux 只開(kāi)啟了 3 萬(wàn)多個(gè)可用端口。但我們今天的實(shí)驗(yàn)里,一個(gè)進(jìn)程要達(dá)到 5 萬(wàn)的并發(fā)。所以,端口范圍的內(nèi)核參數(shù)也是需要修改的。

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

執(zhí)行 sysctl -p 使之生效。

2.2 加大最大可打開(kāi)文件數(shù)

和服務(wù)端對(duì)應(yīng),客戶(hù)端的 fs.file-max 也需要加大到 110 萬(wàn)。不過(guò)進(jìn)程級(jí)的參數(shù) fs.nr_open 設(shè)置到 60000 就夠了。

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

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

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

接著再加大用戶(hù)進(jìn)程的最大可打開(kāi)文件數(shù)量限制(nofile),和服務(wù)器中的配置方法一樣。不過(guò)由于客戶(hù)端我們是要開(kāi) 20 個(gè)進(jìn)程來(lái)測(cè)的,所以每個(gè)進(jìn)程最大開(kāi)到 5 萬(wàn)個(gè)文件數(shù)就夠了。同樣預(yù)留一點(diǎn)余地,所以設(shè)置成 55000。

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

配置完后,開(kāi)個(gè)新控制臺(tái)即可。使用 ulimit 命令校驗(yàn)生效

  1. #ulimit -n 
  2. 55000 

2.3 挑選客戶(hù)端可用的新 ip

因?yàn)槲覀冞@次是要用單臺(tái)客戶(hù)端來(lái)連接同一個(gè) server 的同一個(gè)端口。而單客戶(hù)端 ip 所能達(dá)到的最高連接數(shù)是受端口數(shù)量限制。最多只有 65535 - 1024 = 64k 個(gè)。

解決辦法之一就是使用 20 臺(tái)客戶(hù)端,每個(gè)客戶(hù)端發(fā)起 5 萬(wàn)個(gè)連接同時(shí)來(lái)連接這一個(gè)server。通過(guò)這樣讓服務(wù)器能達(dá)到 100 萬(wàn)條 TCP 并發(fā)。 但是這個(gè)方法實(shí)際操作起來(lái)太困難了,所以不可行。

另外一個(gè)辦法就是采用為一臺(tái)機(jī)器,在這個(gè)機(jī)器上配置多個(gè) ip 的方式來(lái)搞。在 linux 上可以使用 ifconfig 命令為一臺(tái)機(jī)器配置多個(gè) ip。例如你的 linux 上的網(wǎng)卡設(shè)備為 eth0,現(xiàn)在想配置一個(gè)別名為 eth0:1,ip 為 CIP1,掩碼為 255.255.248.0 。則配置 ip 的命令如下:

  1. ifconfig eth0:1 CIP1 netmask 255.255.248.0 up 

所以接下來(lái)的事情就是在你的網(wǎng)絡(luò)環(huán)境中尋找 20 個(gè)可用的 ip。假設(shè)可用的ip分別是 CIP1,CIP2,......,CIP20。

注意:配置的 ip 必須不能和局域網(wǎng)的其它機(jī)器沖突,否則會(huì)影響這些機(jī)器的正常網(wǎng)絡(luò)包的收發(fā)。

2.4 為客戶(hù)端配置新的 ip

確定了 ip 以后,則開(kāi)始動(dòng)手修改測(cè)試源碼 clientd.php 中的 $ips 數(shù)組,子網(wǎng)掩碼。

為了確保局域網(wǎng)內(nèi)沒(méi)有這些 ip,需要先執(zhí)行代碼中提供的一個(gè)小工具來(lái)驗(yàn)證一下

  1. php clientd.php ping 

當(dāng)所有的 ip 的 ping 結(jié)果均為 false 時(shí),方可進(jìn)行下一步實(shí)驗(yàn)。

配置所有 ip 并啟動(dòng)網(wǎng)卡。

  1. php clientd.php ifup 

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

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

ip 配置完成后,就可以進(jìn)行下一步實(shí)驗(yàn)了。

三、開(kāi)始連接實(shí)驗(yàn)

修改 clientd.php 中的服務(wù)器 ip 和端口。然后開(kāi)始連接

  1. php clientd.php start 

同時(shí),另啟一個(gè)控制臺(tái)。使用 watch 命令來(lái)實(shí)時(shí)觀測(cè) ESTABLISH 狀態(tài)連接的數(shù)量。

當(dāng)然,實(shí)驗(yàn)過(guò)程中不會(huì)一帆風(fēng)順,可能會(huì)有各種意外情況發(fā)生。遇到問(wèn)題別慌,根據(jù)錯(cuò)誤提示看下是哪里不對(duì)。然后調(diào)整一下,重新做就是了。

重做的時(shí)候需要重啟客戶(hù)端和服務(wù)器。對(duì)于客戶(hù)端,殺掉所有的客戶(hù)端進(jìn)程的方式是

  1. php clientd.php stop 

對(duì)于服務(wù)器來(lái)說(shuō),就更簡(jiǎn)單了,直接 ctrl + c 終止服務(wù)器進(jìn)程,再重新啟動(dòng)就行了。如果發(fā)現(xiàn)端口被占用,那是因?yàn)椴僮飨到y(tǒng)還沒(méi)有回收,等一會(huì)兒再啟動(dòng) server 就行。

當(dāng)你發(fā)現(xiàn)連接數(shù)量超過(guò) 100 萬(wàn)的時(shí)候,你的實(shí)驗(yàn)就成功了。

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

這個(gè)時(shí)候別忘了查看一下你的服務(wù)端、客戶(hù)端的內(nèi)存開(kāi)銷(xiāo)。

先用 cat proc/meminfo 查看,重點(diǎn)看 slab 內(nèi)存開(kāi)銷(xiāo)。

  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 查看一下內(nèi)核都是分配了哪些內(nèi)核對(duì)象,它們每個(gè)的大小各自是多少。

當(dāng)你這個(gè)實(shí)驗(yàn)真正做成功的時(shí)候,相信你能有很大的收獲!

四、結(jié)束實(shí)驗(yàn)

實(shí)驗(yàn)結(jié)束的時(shí)候,服務(wù)器進(jìn)程直接 ctrl + c 取消運(yùn)行就可以??蛻?hù)端代碼可能需要手工關(guān)閉一下

  1. php clientd.php stop 

最后記得取消為實(shí)驗(yàn)臨時(shí)配置的新 ip

  1. php clientd.php ifdown 

再重復(fù)一下本文所用的測(cè)試源碼地址

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

 

責(zé)任編輯:武曉燕 來(lái)源: 開(kāi)發(fā)內(nèi)功修煉
相關(guān)推薦

2016-12-12 13:44:42

iOe

2024-12-04 13:52:30

2022-09-09 08:41:43

Netty服務(wù)端驅(qū)動(dòng)

2021-05-24 10:55:05

Netty單機(jī)并發(fā)

2017-01-09 16:06:19

2010-12-31 13:44:33

pingnet view

2020-10-14 14:31:37

LinuxTCP連接

2021-02-03 14:30:30

Linux并發(fā)內(nèi)核

2010-06-17 15:36:35

Linux測(cè)試工具

2024-10-12 17:57:12

2011-01-24 13:58:24

TCPIP協(xié)議棧

2021-03-13 14:08:00

Hadoop 源碼HDFS

2012-11-23 10:00:55

SQL性能測(cè)試

2015-04-23 18:46:38

TCPTCP協(xié)議

2015-10-09 13:15:03

TCP網(wǎng)絡(luò)協(xié)議

2019-09-16 09:29:01

TCP全連接隊(duì)列半連接隊(duì)列

2010-06-13 15:37:24

TCP協(xié)議

2010-07-07 10:45:22

TCP UDP協(xié)議

2022-01-24 16:55:09

LinuxTCP工具

2014-09-29 09:29:20

TCP
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)