按照題主的意思 是根據(jù)內(nèi)存去算一個(gè)最大并發(fā)的連接數(shù). 那么首先要找出來(lái)單個(gè)連接消耗內(nèi)存的地方.
第一個(gè)首先是socket buffer. read 和write 分別有一個(gè), 默認(rèn)大小在
/proc/sys/net/ipv4/tcp_rmem (for read)
/proc/sys/net/ipv4/tcp_wmem (for write)
默認(rèn)大小都是87K和16K, 最低是4K和4K, 最高是2M,2M, 實(shí)際使用默認(rèn)值最低也要保留8K,8K.
然后是邏輯IO緩沖區(qū)
就是比如你監(jiān)聽(tīng)了recv事件 事件來(lái)了 你要有內(nèi)存可用(一般都是socket建立起就分配好,斷開(kāi)才會(huì)釋放的).
這個(gè)內(nèi)存是自己寫(xiě)socket程序時(shí)候自己控制的, 最低也要4K,4K, 實(shí)際使用8K,8K至少.
現(xiàn)在設(shè)定一個(gè)優(yōu)化方案和使用場(chǎng)景, 首先假設(shè)4G內(nèi)存全部為空閑(系統(tǒng)和其他進(jìn)程也要內(nèi)存的….
假如網(wǎng)絡(luò)包的大小都可以控制在4K以下, 假設(shè)所有連接的網(wǎng)絡(luò)都不會(huì)擁堵, 或者擁堵時(shí)候的總量在4K以下:
一個(gè)連接的內(nèi)存消耗是4+4+4+4=16K
4G/16K=26.2萬(wàn)并發(fā)
假如網(wǎng)絡(luò)包的大小都可以控制在8K以下, 假設(shè)所有連接的網(wǎng)絡(luò)都不會(huì)擁堵, 或者擁堵時(shí)候的總量在8K以下
一個(gè)socket的內(nèi)存占用介于 24K ~ 32K之間, 保守的按照32K算
4G/32K=13.1萬(wàn)并發(fā), 這個(gè)在生產(chǎn)環(huán)境作為一個(gè)純網(wǎng)絡(luò)層面的內(nèi)存消耗, 是可以作為參考的.
假如使用默認(rèn)配置, 假如所有連接的網(wǎng)絡(luò)都出現(xiàn)嚴(yán)重?fù)矶? 不考慮邏輯上的發(fā)送隊(duì)列的占用,
使用默認(rèn)配置是2M+2M+8+8 ~= 4M
4G/4M=1024并發(fā) ( …
如果考慮到發(fā)送隊(duì)列也擁堵的話 自己腦補(bǔ).
如果只是為了跑分 為了并發(fā)而優(yōu)化, 沒(méi)有常駐的邏輯緩沖區(qū) 并且socket的網(wǎng)絡(luò)吞吐量很小并且負(fù)載平滑, 把socket buffer size設(shè)置系統(tǒng)最低.
那么是
4G/8K = 52.4萬(wàn)并發(fā) 這個(gè)應(yīng)該是極限值了.