mysql最多多少个索引_漫画 | 一台Linux服务器最多能支撑多少个TCP连接?
困惑很多人的并發(fā)問題
在網(wǎng)絡(luò)開發(fā)中,我發(fā)現(xiàn)有很多同學(xué)對(duì)一個(gè)基礎(chǔ)問題始終是沒有徹底搞明白。那就是一臺(tái)服務(wù)器最大究竟能支持多少個(gè)網(wǎng)絡(luò)連接?我想我有必要單獨(dú)發(fā)一篇文章來好好說一下這個(gè)問題。
很多同學(xué)看到這個(gè)問題的第一反應(yīng)是65535。原因是:“聽說端口號(hào)最多有65535個(gè),那長(zhǎng)連接就最多保持65535個(gè)了”。是這樣的嗎?還有的人說:“應(yīng)該受TCP連接里四元組的空間大小限制,算起來是200多萬億個(gè)!”
如果你對(duì)這個(gè)問題也是理解的不夠徹底,那么今天講個(gè)故事講給你聽!
一次關(guān)于服務(wù)器端并發(fā)的聊天
"TCP連接四元組是源IP地址、源端口、目的IP地址和目的端口。任意一個(gè)元素發(fā)生了改變,那么就代表的是一條完全不同的連接了。拿我的Nginx舉例,它的端口是固定使用80。另外我的IP也是固定的,這樣目的IP地址、目的端口都是固定的。剩下源IP地址、源端口是可變的。所以理論上我的Nginx上最多可以建立2的32次方(ip數(shù))×2的16次方(port數(shù))個(gè)連接。這是兩百多萬億的一個(gè)大數(shù)字!!"
"進(jìn)程每打開一個(gè)文件(linux下一切皆文件,包括socket),都會(huì)消耗一定的內(nèi)存資源。如果有不懷好心的人啟動(dòng)一個(gè)進(jìn)程來無限的創(chuàng)建和打開新的文件,會(huì)讓服務(wù)器崩潰。所以linux系統(tǒng)出于安全角度的考慮,在多個(gè)位置都限制了可打開的文件描述符的數(shù)量,包括系統(tǒng)級(jí)、用戶級(jí)、進(jìn)程級(jí)。這三個(gè)限制的含義和修改方式如下:"
- 系統(tǒng)級(jí):當(dāng)前系統(tǒng)可打開的最大數(shù)量,通過fs.file-max參數(shù)可修改
- 用戶級(jí):指定用戶可打開的最大數(shù)量,修改/etc/security/limits.conf
- 進(jìn)程級(jí):單個(gè)進(jìn)程可打開的最大數(shù)量,通過fs.nr_open參數(shù)可修改
"我的接收緩存區(qū)大小是可以配置的,通過sysctl命令就可以查看。"
$?sysctl?-a?|?grep?rmemnet.ipv4.tcp_rmem?=?4096?87380?8388608
net.core.rmem_default?=?212992
net.core.rmem_max?=?8388608
"其中在tcp_rmem"中的第一個(gè)值是為你們的TCP連接所需分配的最少字節(jié)數(shù)。該值默認(rèn)是4K,最大的話8MB之多。也就是說你們有數(shù)據(jù)發(fā)送的時(shí)候我需要至少為對(duì)應(yīng)的socket再分配4K內(nèi)存,甚至可能更大。"
"TCP分配發(fā)送緩存區(qū)的大小受參數(shù)net.ipv4.tcp_wmem配置影響。"
$?sysctl?-a?|?grep?wmemnet.ipv4.tcp_wmem?=?4096?65536?8388608
net.core.wmem_default?=?212992
net.core.wmem_max?=?8388608
"在net.ipv4.tcp_wmem"中的第一個(gè)值是發(fā)送緩存區(qū)的最小值,默認(rèn)也是4K。當(dāng)然了如果數(shù)據(jù)很大的話,該緩存區(qū)實(shí)際分配的也會(huì)比默認(rèn)值大。"
服務(wù)端百萬連接達(dá)成記
“準(zhǔn)備啥呢,還記得前面說過Linux對(duì)最大文件對(duì)象數(shù)量有限制,所以要想完成這個(gè)實(shí)驗(yàn),得在用戶級(jí)、系統(tǒng)級(jí)、進(jìn)程級(jí)等位置把這個(gè)上限加大。我們實(shí)驗(yàn)?zāi)康氖?00W,這里都設(shè)置成110W,這個(gè)很重要!因?yàn)榈帽WC做實(shí)驗(yàn)的時(shí)候其它基礎(chǔ)命令例如ps,vi等是可用的?!?/p>
活動(dòng)連接數(shù)量確實(shí)達(dá)到了100W:
$?ss?-n?|?grep?ESTAB?|?wc?-l??1000024
當(dāng)前機(jī)器內(nèi)存總共是3.9GB,其中內(nèi)核Slab占用了3.2GB之多。MemFree和Buffers加起來也只剩下100多MB了:
$?cat?/proc/meminfoMemTotal:????????3922956?kB
MemFree:???????????96652?kB
MemAvailable:???????6448?kB
Buffers:???????????44396?kB
......
Slab:??????????3241244KB?kB
通過slabtop命令可以查看到densty、flip、sock_inode_cache、TCP四個(gè)內(nèi)核對(duì)象都分別有100W個(gè):
結(jié)語
互聯(lián)網(wǎng)后端的業(yè)務(wù)特點(diǎn)之一就是高并發(fā). 但是一臺(tái)服務(wù)器最大究竟能支持多少個(gè)TCP連接,這個(gè)問題似乎卻又在困惑著很多同學(xué)。希望今天過后,你能夠?qū)⑦@個(gè)問題踩在腳下摩擦!
學(xué)習(xí)是一件痛苦的事情,尤其咱們號(hào)里很多讀者朋友都是工作滿一天了再來看我的技術(shù)號(hào)的文章的。我一直都在琢磨到底怎么樣組織技術(shù)內(nèi)容形式,能讓大家理解起來更能省一點(diǎn)腦細(xì)胞呢。這篇服務(wù)器的最大并發(fā)數(shù)的文章是早就想發(fā)的,但是寫了兩三個(gè)版本都不滿意。今天終于想出了一種讓大家更容易理解的方式,算過了自己這關(guān)了。
如果您喜歡我的文章、并覺得它有用,期望您能不吝把它轉(zhuǎn)發(fā)到你的朋友圈,技術(shù)群?;蛘吣呐率屈c(diǎn)個(gè)贊,點(diǎn)個(gè)再看都可以。觸達(dá)更多的技術(shù)同學(xué)并收獲大家的反饋將極大地提升彥飛的創(chuàng)作動(dòng)力!
改天再講客戶端,敬請(qǐng)期待!!
推薦↓↓↓運(yùn)維
總結(jié)
以上是生活随笔為你收集整理的mysql最多多少个索引_漫画 | 一台Linux服务器最多能支撑多少个TCP连接?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python控制语句中的条件语句_『Py
- 下一篇: 坚果云下载的文件夹在哪_坚果云文件夹在哪