成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

物聯(lián)網(wǎng)高并發(fā)編程之單臺服務(wù)器最大并發(fā)TCP連接數(shù)

leap_frog / 1491人閱讀

摘要:對端,通過增加內(nèi)存修改最大文件描述符個數(shù)等參數(shù),單機最大并發(fā)連接數(shù)超過萬甚至上百萬是沒問題的,國外公司在產(chǎn)品環(huán)境中已做到萬并發(fā)

[TOC]

前言

曾幾何時我們還在尋求網(wǎng)絡(luò)編程中C10K問題的解決方案,但是現(xiàn)在從硬件和操作系統(tǒng)支持來看單臺服務(wù)器支持上萬并發(fā)連接已經(jīng)沒有多少挑戰(zhàn)性了。

我們先假設(shè)單臺服務(wù)器最多只能支持萬級并發(fā)連接,其實對絕大多數(shù)應(yīng)用來說已經(jīng)遠遠足夠了,但是對于一些擁有很大用戶基數(shù)的互聯(lián)網(wǎng)公司,往往面臨的并發(fā)連接數(shù)是百萬,千萬,甚至騰訊的上億(注:QQ默認用的UDP協(xié)議)。

雖然現(xiàn)在的集群,分布式技術(shù)可以為我們將并發(fā)負載分擔在多臺服務(wù)器上,那我們只需要擴展出數(shù)十臺電腦就可以解決問題,但是我們更希望能更大的挖掘單臺服務(wù)器的資源,先努力垂直擴展,再進行水平擴展,這樣可以有效的節(jié)省服務(wù)器相關(guān)的開支(硬件資源,機房,運維,電力其實也是一筆不小的開支)。

那么到底一臺服務(wù)器能夠支持多少TCP并發(fā)連接呢?

文件句柄限制

在linux下編寫網(wǎng)絡(luò)服務(wù)器程序的朋友肯定都知道每一個tcp連接都要占一個文件描述符,一旦這個文件描述符使用完了,新的連接到來返回給我們的錯誤是:

“Socket/File:Can"t open so many files”

這時你需要明白操作系統(tǒng)對可以打開的最大文件數(shù)的限制。

進程限制

執(zhí)行 ulimit -n輸出 1024,說明對于一個進程而言最多只能打開1024個文件,所以你要采用此默認配置最多也就可以并發(fā)上千個TCP連接。

臨時修改:ulimit -n 1000000,但是這種臨時修改只對當前登錄用戶目前的使用環(huán)境有效,系統(tǒng)重啟或用戶退出后就會失效。

重啟后失效的修改(不過我在CentOS 6.5下測試,重啟后未發(fā)現(xiàn)失效):編輯 /etc/security/limits.conf 文件, 修改后內(nèi)容為

soft nofile 1000000

hard nofile 1000000

永久修改:編輯/etc/rc.local,在其后添加如下內(nèi)容

ulimit -SHn 1000000

全局限制

執(zhí)行 cat /proc/sys/fs/file-nr 輸出 9344 0 592026,分別為:

1.已經(jīng)分配的文件句柄數(shù)
2.已經(jīng)分配但沒有使用的文件句柄數(shù)
3.最大文件句柄數(shù)。

但在kernel 2.6版本中第二項的值總為0,這并不是一個錯誤,它實際上意味著已經(jīng)分配的文件描述符無一浪費的都已經(jīng)被使用了 。

我們可以把這個數(shù)值改大些,用 root 權(quán)限修改 /etc/sysctl.conf 文件:

fs.file-max = 1000000

net.ipv4.ip_conntrack_max = 1000000

net.ipv4.netfilter.ip_conntrack_max = 1000000

端口號范圍限制?

操作系統(tǒng)上端口號1024以下是系統(tǒng)保留的,從1024-65535是用戶使用的。

由于每個TCP連接都要占一個端口號,所以我們最多可以有60000多個并發(fā)連接。我想有這種錯誤思路朋友不在少數(shù)吧?(其中我過去就一直這么認為)

我們來分析一下吧

其實65535這個數(shù)字,只是決定了服務(wù)器端最多可以擁有65535個Bind的Socket。

也就是說,最多可以開65535個服務(wù)器進程,但是你要知道這個能夠連接客戶端的數(shù)量沒有任何關(guān)系,Accept過來的Socket是不需要Bind任何IP地址的,也沒有端口占用這一說。作為Server端的Socket本身只負責監(jiān)聽和接受連接操作

如何標識一個TCP連接:系統(tǒng)用一個4四元組來唯一標識一個TCP連接:{local ip, local port,remote ip,remote port}。

我們作為服務(wù)端實際只使用了bind時這一個端口,說明端口號65535并不是并發(fā)量的限制。

server最大tcp連接數(shù):server通常固定在某個本地端口上監(jiān)聽,等待client的連接請求。

不考慮地址重用(unix的SO_REUSEADDR選項)的情況下,即使server端有多個ip,本地監(jiān)聽端口也是獨占的,因此server端tcp連接4元組中只有remote ip(也就是client ip)和remote port(客戶端port)是可變的,

因此最大tcp連接為客戶端ip數(shù)×客戶端port數(shù),對IPV4,不考慮ip地址分類等因素,最大tcp連接數(shù)約為2的32次方(ip數(shù))×2的16次方(port數(shù)),

也就是server端單機最大tcp連接數(shù)約為2的48次方。

TCP連出受端口限制,連入僅受內(nèi)存限制

總結(jié)

上面給出的結(jié)論都是理論上的單機TCP并發(fā)連接數(shù),實際上單機并發(fā)連接數(shù)肯定要受硬件資源(內(nèi)存)、網(wǎng)絡(luò)資源(帶寬)的限制。

對server端,通過增加內(nèi)存、修改最大文件描述符個數(shù)等參數(shù),單機最大并發(fā)TCP連接數(shù)超過10萬,甚至上百萬 是沒問題的,國外 Urban Airship 公司在產(chǎn)品環(huán)境中已做到 50 萬并發(fā)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72526.html

相關(guān)文章

  • 聯(lián)網(wǎng)并發(fā)編程之C10K問題原理和解決方案

    摘要:問題任一文件句柄的不成功會阻塞住整個應(yīng)用。主要解決的前兩個問題通過一個數(shù)組向內(nèi)核傳遞需要關(guān)注的事件消除文件句柄上限,同時使用不同字段分別標注關(guān)注事件和發(fā)生事件,來避免重復初始化。問題逐個排查所有文件句柄狀態(tài)效率不高。 C10K問題思維導圖 showImg(https://segmentfault.com/img/bVbkrKe?w=1818&h=1276); C10K問題出現(xiàn)前期 大家...

    dayday_up 評論0 收藏0
  • 聯(lián)網(wǎng)并發(fā)編程之網(wǎng)絡(luò)編程中的I/O模型

    摘要:缺點每個連接需要獨立的進程線程單獨處理,當并發(fā)請求量大時為了維護程序,內(nèi)存線程切換開銷較大,這種模型在實際生產(chǎn)中很少使用。而在系統(tǒng)下,才引入,目前并不完善,因此在下實現(xiàn)高并發(fā)網(wǎng)絡(luò)編程時都是以復用模型模式為主。 思維導圖 showImg(https://segmentfault.com/img/bVbkrNz?w=1766&h=994); 互聯(lián)網(wǎng)服務(wù)端處理網(wǎng)絡(luò)請求的原理 首先看看一個典型...

    hsluoyz 評論0 收藏0
  • 聯(lián)網(wǎng)并發(fā)編程之網(wǎng)絡(luò)編程中的線程模型

    摘要:如需了解更多物聯(lián)網(wǎng)網(wǎng)絡(luò)編程知識請點擊物聯(lián)網(wǎng)云端開發(fā)武器庫物聯(lián)網(wǎng)高并發(fā)編程之網(wǎng)絡(luò)編程中的線程模型值得說明的是,具體選擇線程還是進程,更多是與平臺及編程語言相關(guān)。 如需了解更多物聯(lián)網(wǎng)網(wǎng)絡(luò)編程知識請點擊:物聯(lián)網(wǎng)云端開發(fā)武器庫 物聯(lián)網(wǎng)高并發(fā)編程之網(wǎng)絡(luò)編程中的線程模型 值得說明的是,具體選擇線程還是進程,更多是與平臺及編程語言相關(guān)。例如 C 語言使用線程和進程都可以(例如 Nginx 使用進程...

    ziwenxie 評論0 收藏0
  • 記一次性能優(yōu)化,單臺4核8G機器支撐5萬QPS

    摘要:前言這篇文章的主題是記錄一次程序的性能優(yōu)化,在優(yōu)化的過程中遇到的問題,以及如何去解決的。因為我們的連接數(shù)只有,一旦請求過多,勢必會導致數(shù)據(jù)庫瓶頸。我們再次壓測,結(jié)果顯示萬,服務(wù)器數(shù)據(jù)庫連接正常,連接正常,響應(yīng)時間平均為,錯誤率為。 前言 這篇文章的主題是記錄一次Python程序的性能優(yōu)化,在優(yōu)化的過程中遇到的問題,以及如何去解決的。為大家提供一個優(yōu)化的思路,首先要聲明的一點是,我的方式...

    Barry_Ng 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<