摘要:對(duì)端,通過(guò)增加內(nèi)存修改最大文件描述符個(gè)數(shù)等參數(shù),單機(jī)最大并發(fā)連接數(shù)超過(guò)萬(wàn)甚至上百萬(wàn)是沒(méi)問(wèn)題的,國(guó)外公司在產(chǎn)品環(huán)境中已做到萬(wàn)并發(fā)
[TOC]
前言曾幾何時(shí)我們還在尋求網(wǎng)絡(luò)編程中C10K問(wèn)題的解決方案,但是現(xiàn)在從硬件和操作系統(tǒng)支持來(lái)看單臺(tái)服務(wù)器支持上萬(wàn)并發(fā)連接已經(jīng)沒(méi)有多少挑戰(zhàn)性了。
我們先假設(shè)單臺(tái)服務(wù)器最多只能支持萬(wàn)級(jí)并發(fā)連接,其實(shí)對(duì)絕大多數(shù)應(yīng)用來(lái)說(shuō)已經(jīng)遠(yuǎn)遠(yuǎn)足夠了,但是對(duì)于一些擁有很大用戶(hù)基數(shù)的互聯(lián)網(wǎng)公司,往往面臨的并發(fā)連接數(shù)是百萬(wàn),千萬(wàn),甚至騰訊的上億(注:QQ默認(rèn)用的UDP協(xié)議)。
雖然現(xiàn)在的集群,分布式技術(shù)可以為我們將并發(fā)負(fù)載分擔(dān)在多臺(tái)服務(wù)器上,那我們只需要擴(kuò)展出數(shù)十臺(tái)電腦就可以解決問(wèn)題,但是我們更希望能更大的挖掘單臺(tái)服務(wù)器的資源,先努力垂直擴(kuò)展,再進(jìn)行水平擴(kuò)展,這樣可以有效的節(jié)省服務(wù)器相關(guān)的開(kāi)支(硬件資源,機(jī)房,運(yùn)維,電力其實(shí)也是一筆不小的開(kāi)支)。
那么到底一臺(tái)服務(wù)器能夠支持多少TCP并發(fā)連接呢?
文件句柄限制在linux下編寫(xiě)網(wǎng)絡(luò)服務(wù)器程序的朋友肯定都知道每一個(gè)tcp連接都要占一個(gè)文件描述符,一旦這個(gè)文件描述符使用完了,新的連接到來(lái)返回給我們的錯(cuò)誤是:
“Socket/File:Can"t open so many files”
這時(shí)你需要明白操作系統(tǒng)對(duì)可以打開(kāi)的最大文件數(shù)的限制。
進(jìn)程限制執(zhí)行 ulimit -n輸出 1024,說(shuō)明對(duì)于一個(gè)進(jìn)程而言最多只能打開(kāi)1024個(gè)文件,所以你要采用此默認(rèn)配置最多也就可以并發(fā)上千個(gè)TCP連接。
臨時(shí)修改:ulimit -n 1000000,但是這種臨時(shí)修改只對(duì)當(dāng)前登錄用戶(hù)目前的使用環(huán)境有效,系統(tǒng)重啟或用戶(hù)退出后就會(huì)失效。
重啟后失效的修改(不過(guò)我在CentOS 6.5下測(cè)試,重啟后未發(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)分配但沒(méi)有使用的文件句柄數(shù)
3.最大文件句柄數(shù)。
但在kernel 2.6版本中第二項(xiàng)的值總為0,這并不是一個(gè)錯(cuò)誤,它實(shí)際上意味著已經(jīng)分配的文件描述符無(wú)一浪費(fèi)的都已經(jīng)被使用了 。
我們可以把這個(gè)數(shù)值改大些,用 root 權(quán)限修改 /etc/sysctl.conf 文件:
fs.file-max = 1000000 net.ipv4.ip_conntrack_max = 1000000 net.ipv4.netfilter.ip_conntrack_max = 1000000端口號(hào)范圍限制?
操作系統(tǒng)上端口號(hào)1024以下是系統(tǒng)保留的,從1024-65535是用戶(hù)使用的。
由于每個(gè)TCP連接都要占一個(gè)端口號(hào),所以我們最多可以有60000多個(gè)并發(fā)連接。我想有這種錯(cuò)誤思路朋友不在少數(shù)吧?(其中我過(guò)去就一直這么認(rèn)為)
我們來(lái)分析一下吧
其實(shí)65535這個(gè)數(shù)字,只是決定了服務(wù)器端最多可以擁有65535個(gè)Bind的Socket。
也就是說(shuō),最多可以開(kāi)65535個(gè)服務(wù)器進(jìn)程,但是你要知道這個(gè)能夠連接客戶(hù)端的數(shù)量沒(méi)有任何關(guān)系,Accept過(guò)來(lái)的Socket是不需要Bind任何IP地址的,也沒(méi)有端口占用這一說(shuō)。作為Server端的Socket本身只負(fù)責(zé)監(jiān)聽(tīng)和接受連接操作
如何標(biāo)識(shí)一個(gè)TCP連接:系統(tǒng)用一個(gè)4四元組來(lái)唯一標(biāo)識(shí)一個(gè)TCP連接:{local ip, local port,remote ip,remote port}。
我們作為服務(wù)端實(shí)際只使用了bind時(shí)這一個(gè)端口,說(shuō)明端口號(hào)65535并不是并發(fā)量的限制。
server最大tcp連接數(shù):server通常固定在某個(gè)本地端口上監(jiān)聽(tīng),等待client的連接請(qǐng)求。
不考慮地址重用(unix的SO_REUSEADDR選項(xiàng))的情況下,即使server端有多個(gè)ip,本地監(jiān)聽(tīng)端口也是獨(dú)占的,因此server端tcp連接4元組中只有remote ip(也就是client ip)和remote port(客戶(hù)端port)是可變的,
因此最大tcp連接為客戶(hù)端ip數(shù)×客戶(hù)端port數(shù),對(duì)IPV4,不考慮ip地址分類(lèi)等因素,最大tcp連接數(shù)約為2的32次方(ip數(shù))×2的16次方(port數(shù)),
也就是server端單機(jī)最大tcp連接數(shù)約為2的48次方。
TCP連出受端口限制,連入僅受內(nèi)存限制
總結(jié)上面給出的結(jié)論都是理論上的單機(jī)TCP并發(fā)連接數(shù),實(shí)際上單機(jī)并發(fā)連接數(shù)肯定要受硬件資源(內(nèi)存)、網(wǎng)絡(luò)資源(帶寬)的限制。
對(duì)server端,通過(guò)增加內(nèi)存、修改最大文件描述符個(gè)數(shù)等參數(shù),單機(jī)最大并發(fā)TCP連接數(shù)超過(guò)10萬(wàn),甚至上百萬(wàn) 是沒(méi)問(wèn)題的,國(guó)外 Urban Airship 公司在產(chǎn)品環(huán)境中已做到 50 萬(wàn)并發(fā)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/72526.html
摘要:?jiǎn)栴}任一文件句柄的不成功會(huì)阻塞住整個(gè)應(yīng)用。主要解決的前兩個(gè)問(wèn)題通過(guò)一個(gè)數(shù)組向內(nèi)核傳遞需要關(guān)注的事件消除文件句柄上限,同時(shí)使用不同字段分別標(biāo)注關(guān)注事件和發(fā)生事件,來(lái)避免重復(fù)初始化。問(wèn)題逐個(gè)排查所有文件句柄狀態(tài)效率不高。 C10K問(wèn)題思維導(dǎo)圖 showImg(https://segmentfault.com/img/bVbkrKe?w=1818&h=1276); C10K問(wèn)題出現(xiàn)前期 大家...
摘要:缺點(diǎn)每個(gè)連接需要獨(dú)立的進(jìn)程線(xiàn)程單獨(dú)處理,當(dāng)并發(fā)請(qǐng)求量大時(shí)為了維護(hù)程序,內(nèi)存線(xiàn)程切換開(kāi)銷(xiāo)較大,這種模型在實(shí)際生產(chǎn)中很少使用。而在系統(tǒng)下,才引入,目前并不完善,因此在下實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)編程時(shí)都是以復(fù)用模型模式為主。 思維導(dǎo)圖 showImg(https://segmentfault.com/img/bVbkrNz?w=1766&h=994); 互聯(lián)網(wǎng)服務(wù)端處理網(wǎng)絡(luò)請(qǐng)求的原理 首先看看一個(gè)典型...
摘要:如需了解更多物聯(lián)網(wǎng)網(wǎng)絡(luò)編程知識(shí)請(qǐng)點(diǎn)擊物聯(lián)網(wǎng)云端開(kāi)發(fā)武器庫(kù)物聯(lián)網(wǎng)高并發(fā)編程之網(wǎng)絡(luò)編程中的線(xiàn)程模型值得說(shuō)明的是,具體選擇線(xiàn)程還是進(jìn)程,更多是與平臺(tái)及編程語(yǔ)言相關(guān)。 如需了解更多物聯(lián)網(wǎng)網(wǎng)絡(luò)編程知識(shí)請(qǐng)點(diǎn)擊:物聯(lián)網(wǎng)云端開(kāi)發(fā)武器庫(kù) 物聯(lián)網(wǎng)高并發(fā)編程之網(wǎng)絡(luò)編程中的線(xiàn)程模型 值得說(shuō)明的是,具體選擇線(xiàn)程還是進(jìn)程,更多是與平臺(tái)及編程語(yǔ)言相關(guān)。例如 C 語(yǔ)言使用線(xiàn)程和進(jìn)程都可以(例如 Nginx 使用進(jìn)程...
摘要:前言這篇文章的主題是記錄一次程序的性能優(yōu)化,在優(yōu)化的過(guò)程中遇到的問(wèn)題,以及如何去解決的。因?yàn)槲覀兊倪B接數(shù)只有,一旦請(qǐng)求過(guò)多,勢(shì)必會(huì)導(dǎo)致數(shù)據(jù)庫(kù)瓶頸。我們?cè)俅螇簻y(cè),結(jié)果顯示萬(wàn),服務(wù)器數(shù)據(jù)庫(kù)連接正常,連接正常,響應(yīng)時(shí)間平均為,錯(cuò)誤率為。 前言 這篇文章的主題是記錄一次Python程序的性能優(yōu)化,在優(yōu)化的過(guò)程中遇到的問(wèn)題,以及如何去解決的。為大家提供一個(gè)優(yōu)化的思路,首先要聲明的一點(diǎn)是,我的方式...
閱讀 3017·2023-04-25 19:20
閱讀 879·2021-11-24 09:38
閱讀 2160·2021-09-26 09:55
閱讀 2512·2021-09-02 15:11
閱讀 2261·2019-08-30 15:55
閱讀 3671·2019-08-30 15:54
閱讀 3223·2019-08-30 14:03
閱讀 3024·2019-08-29 17:11