0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一臺服務(wù)器最大能支持多少條TCP連接

馬哥Linux運(yùn)維 ? 來源:稀土掘金技術(shù)社區(qū) ? 2023-01-30 11:36 ? 次閱讀

一、一臺服務(wù)器最大能打開的文件數(shù)

1、限制參數(shù)

我們知道在Linux中一切皆文件,那么一臺服務(wù)器最大能打開多少個文件呢?Linux上能打開的最大文件數(shù)量受三個參數(shù)影響,分別是:

fs.file-max (系統(tǒng)級別參數(shù)):該參數(shù)描述了整個系統(tǒng)可以打開的最大文件數(shù)量。但是root用戶不會受該參數(shù)限制(比如:現(xiàn)在整個系統(tǒng)打開的文件描述符數(shù)量已達(dá)到fs.file-max ,此時(shí)root用戶仍然可以使用ps、kill等命令或打開其他文件描述符)

soft nofile(進(jìn)程級別參數(shù)):限制單個進(jìn)程上可以打開的最大文件數(shù)。只能在Linux上配置一次,不能針對不同用戶配置不同的值

fs.nr_open(進(jìn)程級別參數(shù)):限制單個進(jìn)程上可以打開的最大文件數(shù)。可以針對不同用戶配置不同的值

這三個參數(shù)之間還有耦合關(guān)系,所以配置值的時(shí)候還需要注意以下三點(diǎn):

如果想加大soft nofile,那么hard nofile參數(shù)值也需要一起調(diào)整。如果因?yàn)閔ard nofile參數(shù)值設(shè)置的低,那么soft nofile參數(shù)的值設(shè)置的再高也沒有用,實(shí)際生效的值會按照二者最低的來。

如果增大了hard nofile,那么fs.nr_open也都需要跟著一起調(diào)整(fs.nr_open參數(shù)值一定要大于hard nofile參數(shù)值)。如果不小心把hard nofile的值設(shè)置的比fs.nr_open還大,那么后果比較嚴(yán)重。會導(dǎo)致該用戶無法登錄,如果設(shè)置的是*,那么所有用戶都無法登錄

如果加大了fs.nr_open,但是是用的echo "xxx" > ../fs/nr_open命令來修改的fs.nr_open的值,那么剛改完可能不會有問題,但是只要機(jī)器一重啟,那么之前通過echo命令設(shè)置的fs.nr_open值便會失效,用戶還是無法登錄。所以非常不建議使用echo的方式修改內(nèi)核參數(shù)?。?!

2、調(diào)整服務(wù)器能打開的最大文件數(shù)示例

假設(shè)想讓進(jìn)程可以打開100萬個文件描述符,這里用修改conf文件的方式給出一個建議。如果日后工作里有類似的需求可以作為參考。

vim /etc/sysctl.conf

fs.file-max=1100000//系統(tǒng)級別設(shè)置成110萬,多留點(diǎn)buffer
fs.nr_open=1100000//進(jìn)程級別也設(shè)置成110萬,因?yàn)橐WC比hardnofile大

使上面的配置生效sysctl -p

vim /etc/security/limits.conf

//用戶進(jìn)程級別都設(shè)置成100完
softnofile1000000
hardnofile1000000

二、一臺服務(wù)器最大能支持多少連接

我們知道TCP連接,從根本上看其實(shí)就是client和server端在內(nèi)存中維護(hù)的一組【socket內(nèi)核對象】(這里也對應(yīng)著TCP四元組:源IP、源端口、目標(biāo)IP、目標(biāo)端口),他們只要能夠找到對方,那么就算是一條連接。那么一臺服務(wù)器最大能建立多少條連接呢?

由于TCP連接本質(zhì)上可以理解為是client-server端的一對socket內(nèi)核對象,那么從理論上將應(yīng)該是【2^32 (ip數(shù)) * 2^16 (端口數(shù))】條連接(約等于兩百多萬億)

但是實(shí)際上由于受其他軟硬件的影響,我們一臺服務(wù)器不可能能建立這么多連接(主要是受CPU和內(nèi)存限制)。

如果只以ESTABLISH狀態(tài)的連接來算(這些連接只是建立,但是不收發(fā)數(shù)據(jù)也不處理相關(guān)的業(yè)務(wù)邏輯)那么一臺服務(wù)器最大能建立多少連接呢?以一臺4GB內(nèi)存的服務(wù)器為例!

這種情況下,那么能建立的連接數(shù)量主要取決于【內(nèi)存的大小】(因?yàn)槿绻牵〦STABLISH狀態(tài)的空閑連接,不會消耗CPU(雖然有TCP?;畎鼈鬏敚@個影響非常小,可以忽略不計(jì))

我們知道一條ESTABLISH狀態(tài)的連接大約消耗【3.3KB內(nèi)存】,那么通過計(jì)算得知一臺4GB內(nèi)存的服務(wù)器,【可以建立100w+的TCP連接】(當(dāng)然這里只是計(jì)算所有的連接都只建立連接但不發(fā)送和處理數(shù)據(jù)的情況,如果真實(shí)場景中有數(shù)據(jù)往來和處理(數(shù)據(jù)接收和發(fā)送都需要申請內(nèi)存,數(shù)據(jù)處理便需要CPU),那便會消耗更高的內(nèi)存以及占用更多的CPU,并發(fā)不可能達(dá)到100w+)

上面討論的都是進(jìn)建立連接的理想情況,在現(xiàn)實(shí)中如果有頻繁的數(shù)據(jù)收發(fā)和處理(比如:壓縮、加密等),那么一臺服務(wù)器能支撐1000連接都算好的了,所以一臺服務(wù)器能支撐多少連接還要結(jié)合具體的場景去分析,不能光靠理論值去算。拋開業(yè)務(wù)邏輯單純的談并發(fā)沒有太大的實(shí)際意義。

服務(wù)器的開銷大頭往往并不是連接本身,而是每條連接上的數(shù)據(jù)收發(fā),以及請求業(yè)務(wù)邏輯處理?。?!

三、一臺客戶端機(jī)器最多能發(fā)起多少條連接

我們知道客戶端每和服務(wù)端建立一個連接便會消耗掉client端一個端口。一臺機(jī)器的端口范圍是【0 ~ 65535】,那么是不是說一臺client機(jī)器最多和一臺服務(wù)端機(jī)器建立65535個連接呢(這65535個端口里還有很多保留端口,可用端口可能只有64000個左右)?

由TCP連接的四元組特性可知,只要四元組里某一個元素不同,那么就認(rèn)為這是不同的TCP連接。所以需要分情況討論:

【情況一】、如果一臺client僅有一個IP,server端也僅有一個IP并且僅啟動一個程序,監(jiān)聽一個端口的情況下,client端和這臺server端最大可建立的連接條數(shù)就是 65535 個。

因?yàn)樵碔P固定,目標(biāo)IP和端口固定,四元組中唯一可變化的就是【源端口】,【源端口】的可用范圍又是【0 ~ 65535】,所以一臺client機(jī)器最大能建立65535個連接

【情況二】、如果一臺client有多個IP(假設(shè)客戶端有 n 個IP),server端僅有一個IP并且僅啟動一個程序,監(jiān)聽一個端口的情況下,一臺client機(jī)器最大能建立的連接條數(shù)是:n * 65535 個

因?yàn)槟繕?biāo)IP和端口固定,有 n 個源IP,四元組中可變化的就是【源端口】+ 【源IP】,【源端口】的可用范圍又是【0 ~ 65535】,所以一個IP最大能建立65535個連接,那么n個IP最大就能建立 n * 65535個連接了

以現(xiàn)在的技術(shù),給一個client分配多個IP是非常容易的事情,只需要去聯(lián)系你們網(wǎng)管就可以做到。

【情況三】、如果一臺client僅有一個IP,server端也僅有一個IP但是server端啟動多個程序,每個程序監(jiān)聽一個端口的情況下(比如server端啟動了m個程序,監(jiān)聽了m個不同端口),一臺client機(jī)器最大能建立的連接數(shù)量為:65535 * m

源IP固定,目標(biāo)IP固定,目標(biāo)端口數(shù)量為m個,可變化的是源端口,而源端口變化范圍是【0 ~ 65535】,所以一臺client機(jī)器最大能建立的TCP連接數(shù)量是 65535 * m個

其余情況類推,但是客戶端的可用端口范圍一般達(dá)不到65535個,受內(nèi)核參數(shù)net.ipv4.ip_local_port_range限制,如果要修改client所能使用的端口范圍,可以修改這個內(nèi)核參數(shù)的值。

所以,不光是一臺server端可以接收100w+個TCP連接,一臺client照樣能發(fā)出100w+個連接

四、其他

三次握手里socket的全連接隊(duì)列長度由參數(shù)net.core.somaxconn來控制,默認(rèn)大小是128,當(dāng)兩臺機(jī)器離的非常近,但是建立連接的并發(fā)又非常高時(shí),可能會導(dǎo)致半連接隊(duì)列或全連接隊(duì)列溢出,進(jìn)而導(dǎo)致server端丟棄握手包。然后造成client超時(shí)重傳握手包(至少1s以后才會重傳),導(dǎo)致三次握手連接建立耗時(shí)過長。我們可以調(diào)整參數(shù)net.core.somaxconn來增加去按連接隊(duì)列的長度,進(jìn)而減小丟包的影響

有時(shí)候我們通過 ctrl + c方式來終止了某個進(jìn)程,但是當(dāng)重啟該進(jìn)程的時(shí)候發(fā)現(xiàn)報(bào)錯端口被占用,這種問題是因?yàn)椤?a target="_blank">操作系統(tǒng)還沒有來得及回收該端口,等一會兒重啟應(yīng)用就好了】

client程序在和server端建立連接時(shí),如果client沒有調(diào)用bind方法傳入指定的端口,那么client在和server端建立連接的時(shí)候便會自己隨機(jī)選擇一個端口來建立連接。一旦我們client程序調(diào)用了bind方法傳入了指定的端口,那么client將會使用我們bind里指定的端口來和server建立連接。所以不建議client調(diào)用bind方法,bind函數(shù)會改變內(nèi)核選擇端口的策略

publicstaticvoidmain(String[]args)throwsIOException{
SocketChannelsc=SocketChannel.open();
//客戶端還可以調(diào)用bind方法
sc.bind(newInetSocketAddress("localhost",9999));
sc.connect(newInetSocketAddress("localhost",8080));
System.out.println("waiting..........");
}

在Linux一切皆文件,當(dāng)然也包括之前TCP連接中說的socket。進(jìn)程打開一個socket的時(shí)候需要創(chuàng)建好幾個內(nèi)核對象,換一句直白的話說就是打開文件對象吃內(nèi)存,所以Linux系統(tǒng)基于安全角度考慮(比如:有用戶進(jìn)程惡意的打開無數(shù)的文件描述符,那不得把系統(tǒng)搞奔潰了),在多個位置都限制了可打開的文件描述符的數(shù)量。

內(nèi)核是通過【hash表】的方式來管理所有已經(jīng)建立好連接的socket,以便于有請求到達(dá)時(shí)快速的通過【TCP四元組】查找到內(nèi)核中對應(yīng)的socket對象

在epoll模型中,通過紅黑樹來管理epoll對象所管理的所有socket,用紅黑樹結(jié)構(gòu)來平衡快速刪除、插入、查找socket的效率

五、相關(guān)實(shí)際問題

網(wǎng)絡(luò)開發(fā)中,很多人對一個基礎(chǔ)問題始終沒有徹底搞明白,那就是一臺機(jī)器最多能支撐多少條TCP連接。不過由于客戶端和服務(wù)端對端口使用方式不同,這個問題拆開來理解要容易一些。

注意,這里說的是客戶端和服務(wù)端都只是角色,并不是指某一臺具體的機(jī)器。例如對于我們自己開發(fā)的應(yīng)用程序來說,當(dāng)他響應(yīng)客戶端請求的時(shí)候,他就是服務(wù)端。當(dāng)他向MySQL請求數(shù)據(jù)的時(shí)候,他又變成了客戶端。

1、"too many open files" 報(bào)錯是怎么回事,該如何解決

你在線上可能遇到過too many open files這個錯誤,那么你理解這個報(bào)錯發(fā)生的原理嗎?如果讓你修復(fù)這個錯誤,應(yīng)該如何處理呢?

因?yàn)槊看蜷_一個文件(包括socket),都需要消耗一定的內(nèi)存資源。為了避免個別進(jìn)程不受控制的打開了過多文件而讓整個服務(wù)器奔潰,Linux對打開的文件描述符數(shù)量有限制。如果你的進(jìn)程觸發(fā)到內(nèi)核的限制,那么"too many open files" 報(bào)錯就產(chǎn)生了

可以通過修改fs.file-max 、soft nofile、fs.nr_open這三個參數(shù)的值來修改進(jìn)程能打開的最大文件描述符數(shù)量

需要注意這三個參數(shù)之間的耦合關(guān)系!

2、一臺服務(wù)端機(jī)器最大究竟能支持多少條連接

因?yàn)檫@里要考慮的是最大數(shù),因此先不考慮連接上的數(shù)據(jù)收發(fā)和處理,僅考慮ESTABLISH狀態(tài)的空連接。那么一臺服務(wù)端機(jī)器上最大可以支持多少條TCP連接?這個連接數(shù)會受哪些因素的影響?

在不考慮連接上數(shù)據(jù)的收發(fā)和處理的情況下,僅考慮ESTABLISH狀態(tài)下的空連接情況下,一臺服務(wù)器上最大可支持的TCP連接數(shù)量基本上可以說是由內(nèi)存大小來決定的。

四元組唯一確定一條連接,但服務(wù)端可以接收來自任意客戶端的請求,所以根據(jù)這個理論計(jì)算出來的數(shù)字太大,沒有實(shí)際意義。另外文件描述符限制其實(shí)也是內(nèi)核為了防止某些應(yīng)用程序不受限制的打開【文件句柄】而添加的限制。這個限制只要修改幾個內(nèi)核參數(shù)就可以加大。

一個socket大約消耗3kb左右的內(nèi)存,這樣真正制約服務(wù)端機(jī)器最大并發(fā)數(shù)的就是內(nèi)存,拿一臺4GB內(nèi)存的服務(wù)器來說,可以支持的TCP連接數(shù)量大約是100w+

3、一條客戶端機(jī)器最大究竟能支持多少條連接

和服務(wù)端不同的是,客戶端每次建立一條連接都需要消耗一個端口。在TCP協(xié)議中,端口是一個2字節(jié)的整數(shù),因此范圍只能是0~65535。那么客戶單最大只能支持65535條連接嗎?有沒有辦法突破這個限制,有的話有哪些辦法?

客戶度每次建立一條連接都需要消耗一個端口。從數(shù)字上來看,似乎最多只能建立65535條連接。但實(shí)際上我們有兩種辦法破除65535這個限制

方式一,為客戶端配置多IP 方式二,分別連接不同的服務(wù)端

所以一臺client發(fā)起百萬條連接是沒有任何問題的

4、做一個長連接推送產(chǎn)品,支持1億用戶需要多少臺機(jī)器

假設(shè)你是系統(tǒng)架構(gòu)師,現(xiàn)在老板給你一個需求,讓你做一個類似友盟upush這樣的產(chǎn)品。要在服務(wù)端機(jī)器上保持一個和客戶端的長連接,絕大部分情況下連接都是空閑的,每天也就頂多推送兩三次左右。總用戶規(guī)模預(yù)計(jì)是1億。那么現(xiàn)在請你來評估一下需要多少臺服務(wù)器可以支撐這1億條長連接。

對于長連接推送模塊這種服務(wù)來說,給客戶端發(fā)送數(shù)據(jù)只是偶爾的,一般一天也就頂多一兩次。絕大部分情況下TCP連接都是空閑的,CPU開銷可以忽略

再基于內(nèi)存來考慮,假設(shè)服務(wù)器內(nèi)存是128G的,那么一臺服務(wù)器可以考慮支持500w條并發(fā)。這樣會消耗掉大約不到20GB內(nèi)存用來保存這500w條連接對應(yīng)的socket。還剩下100GB以上的內(nèi)存來應(yīng)對接收、發(fā)送緩沖區(qū)等其他的開銷足夠了。所以,一億用戶,僅僅需要20臺服務(wù)器就差不多夠用了!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10780

    瀏覽量

    210493
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11181

    瀏覽量

    208506
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8873

    瀏覽量

    84968
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1337

    瀏覽量

    78871
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    200

    瀏覽量

    13933

原文標(biāo)題:一臺服務(wù)器最大能支持多少條TCP連接

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    怎樣把設(shè)計(jì)的library移動到另一臺服務(wù)器上去?

    在完成設(shè)計(jì)之后,想把設(shè)計(jì)的library移動到另一臺服務(wù)器。直接copy過去,設(shè)計(jì)相關(guān)的工藝庫的信息怎么處理???在設(shè)計(jì)之前,會做attach工藝庫的動作。對于完整的設(shè)計(jì),這個要怎么attach工藝庫呢?
    發(fā)表于 06-24 06:44

    TCP服務(wù)器創(chuàng)建過程

    用過正點(diǎn)原子LWIP服務(wù)器例程開發(fā)的朋友可能知道,例程的設(shè)計(jì)是只支持個客戶端連接的,但實(shí)際應(yīng)用中往往需要用到多客戶端連接。下面是在正點(diǎn)原子
    發(fā)表于 08-24 08:03

    如何將整個POST參數(shù)字符串傳遞到另一臺服務(wù)器?

    正在發(fā)送“X=nnn&Y=nnn&Z=nnn”,并希望將其原封不動地傳遞給另一臺服務(wù)器
    發(fā)表于 02-27 06:18

    有沒有人有多個LWIP客戶端通過個端口連接一臺服務(wù)器的示例?

    有沒有人有多個客戶端通過個端口連接一臺服務(wù)器的示例?這樣做的最佳做法是什么?
    發(fā)表于 03-02 08:17

    如何使用tcp連接自己搭建的服務(wù)器

    大家好,我想使用tcp連接自己搭建的服務(wù)器 這個服務(wù)器不是本地local的IP4而是有域名的,類似espslr.*****.com,端口是8591 我使用examples\protoc
    發(fā)表于 03-07 06:58

    租用一臺服務(wù)器多少錢?

    租用一臺服務(wù)器多少錢??很多初次購買服務(wù)器的用戶經(jīng)常會詢問服務(wù)器多少錢一臺的問題,而要回答這個問題,首先就得遵循服務(wù)器購買流程,先依據(jù)自身的
    發(fā)表于 07-20 11:11 ?1340次閱讀

    一臺Linux服務(wù)器最多能支撐多少個TCP連接?

    量,還是內(nèi)存大小,亦或者是可創(chuàng)建文件句柄數(shù)量?讓我們起來了解下吧。 困惑很多人的并發(fā)問題 在網(wǎng)絡(luò)開發(fā)中,我發(fā)現(xiàn)有很多同學(xué)對個基礎(chǔ)問題始終是沒有徹底搞明白。那就是一臺服務(wù)器最大究竟能
    的頭像 發(fā)表于 12-29 11:13 ?5129次閱讀

    臺服務(wù)器支持TCP并發(fā)連接數(shù)

    的文件數(shù)量有關(guān)系,通過端口復(fù)用及調(diào)整服務(wù)器參數(shù)等手段,單臺服務(wù)器支持TCP并發(fā)連接數(shù)是可以高于65535的。
    的頭像 發(fā)表于 11-06 19:36 ?1509次閱讀

    用舊手機(jī)DIY一臺服務(wù)器

    本文將向你展示如何使用 UrBackup 和 Linux Deploy在一臺 Android 舊手機(jī)上搭建一臺備份服務(wù)器。舊手機(jī)的污染問題眾所周知,我有一臺舊手機(jī),雖然外殼有裂紋和磨損
    的頭像 發(fā)表于 12-30 14:30 ?1268次閱讀

    一臺服務(wù)器最大建立多少TCP連接呢?

    我們知道在Linux中切皆文件,那么一臺服務(wù)器最大打開多少個文件呢?Linux上打開的最大
    的頭像 發(fā)表于 02-03 10:11 ?1547次閱讀

    SOLARIS操作系統(tǒng)服務(wù)器數(shù)據(jù)恢復(fù)案例

    SPARC SOLARIS操作系統(tǒng)服務(wù)器通過光纖交換機(jī)共享一臺存儲作為集群使用。平時(shí)是一臺服務(wù)器(以下稱為主服務(wù)器)在運(yùn)行,如果該
    的頭像 發(fā)表于 07-10 16:26 ?369次閱讀

    一臺服務(wù)器,最大支持TCP連接數(shù)是多少?

    很多同學(xué)第反應(yīng)就是端口的限制,端口號最多是 65536個,那就最多只能支持 65536 TCP 連接。
    的頭像 發(fā)表于 01-19 18:16 ?5162次閱讀
    <b class='flag-5'>一臺服務(wù)器</b>,<b class='flag-5'>最大</b><b class='flag-5'>支持</b>的<b class='flag-5'>TCP</b><b class='flag-5'>連接</b>數(shù)是多少?

    主機(jī)托管是多個用戶共享一臺服務(wù)器嗎?有什么優(yōu)勢

    主機(jī)托管并不是多個用戶共享一臺服務(wù)器。主機(jī)托管是服務(wù),客戶可以將自己的硬件服務(wù)器托管給服務(wù)商,并享受專業(yè)的
    的頭像 發(fā)表于 08-13 14:45 ?144次閱讀

    服務(wù)器數(shù)據(jù)恢復(fù)—xfs文件系統(tǒng)服務(wù)器數(shù)據(jù)恢復(fù)案例

    某公司一臺服務(wù)器,連接一臺存儲。該服務(wù)器安裝linux操作系統(tǒng),文件系統(tǒng)為xfs。 在運(yùn)行過程中該服務(wù)器出現(xiàn)故障,管理員使用xfs_re
    的頭像 發(fā)表于 08-19 10:49 ?203次閱讀

    多個網(wǎng)站放在同一臺服務(wù)器ip有什么影響?

    將多個網(wǎng)站放在同一臺服務(wù)器上,使用同個IP地址,可能會有以下影響: 1、資源共享:多個網(wǎng)站共享同一臺服務(wù)器的資源,如CPU、內(nèi)存、存儲空間和帶寬。如果其中個網(wǎng)站流量或資源消耗突然增
    的頭像 發(fā)表于 09-12 11:15 ?156次閱讀