日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Ulimit的坑,讓我的故障一波又一波

本文轉(zhuǎn)載自微信公眾號「小姐姐味道」,作者小姐姐養(yǎng)的狗。轉(zhuǎn)載本文請聯(lián)系小姐姐味道公眾號。

最近遇到一個非常有趣的問題。其中有一組HAProxy,頻繁出現(xiàn)問題。登錄上服務(wù)器,cpu、內(nèi)存、網(wǎng)絡(luò)、io一頓猛查。最終發(fā)現(xiàn),機器上處于TIME_WAIT狀態(tài)的連接,多達(dá)6萬多個。

TIME_WAIT狀態(tài),一般都會出現(xiàn)在HAProxy、Nginx這種代理機器上,主要是由于頻繁的主動關(guān)閉所造成的。通過修改reuse和回收參數(shù),可以比較快速的解決問題。

網(wǎng)絡(luò)狀態(tài)的統(tǒng)計數(shù)量,可以使用下面的命令進(jìn)行統(tǒng)計。

 
 
 
 
  1. netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
  2. ESTABLISHED 70
  3. FIN_WAIT2 30
  4. CLOSING 33
  5. TIME_WAIT 65520

這本來沒什么神奇的,但65535這個數(shù)字,實在是太過于敏感。應(yīng)該是觸發(fā)了某種上限。

使我們更加感到疑惑的是:為什么TIME_WAIT狀態(tài)的連接,僅僅達(dá)到了65535,服務(wù)就不可用了?

到處號稱的單機百萬連接,是在吹牛皮么?怎么這么經(jīng)不起折騰?

65535,表示等于2的16次方減一,是一個神奇的數(shù)字。先把這小數(shù)字扔在一邊,我們來看一下Linux到底能支持多少個連接。

1. Linux能夠支持多少連接?

答案是無數(shù)個。可是端口只有65535個啊。

為什么端口只有65535個?

這是一個歷史原因,因為在TCP、UDP協(xié)議的開頭,會分別有16位來存儲源端口號和目標(biāo)端口號。很遺憾的是,這個值是short類型的,大小也是2^16-1。

因為歷史原因造成的不可改變的標(biāo)準(zhǔn),就是那么根深蒂固。

那Linux到底能支持多少個連接呢?答案是無數(shù)個。

拿nginx來說,我們把它監(jiān)聽在80端口上。這時候A機器去連接Nginx,可以發(fā)起多達(dá)6w多條長連接。如果B機器去連接Nginx,同樣也可以發(fā)起6w多條連接。這是由于確定一條連接,是由src和dst來共同決定的。

認(rèn)為Linux只能接受65535條連接的想法,只能說是犯了非常淺顯的想當(dāng)然主義。

65535個端口,作為壓測機可能對你來說太小了一些。但對于服務(wù)器來說,已經(jīng)綽綽有余了。

2. 如何支持百萬連接?

從上面可以看到,連接數(shù),是沒有限制的。但Linux還有一層防護(hù),那就是文件句柄數(shù)。通過lsof命令查看到的那些東西,就是所謂的文件句柄。

先來看一下幾個命令的展示。

ulmit,展示了每個進(jìn)程所能占用的文件句柄數(shù)量。

 
 
 
 
  1. ulimit -n
  2. 65535

file-max,展示了操作系統(tǒng)能夠占用的文件句柄數(shù)量總和,針對的是所有的進(jìn)程。

 
 
 
 
  1. cat /proc/sys/fs/file-max
  2. 766722

file-nr,展示了當(dāng)前已經(jīng)使用的句柄數(shù)量和總的句柄數(shù)量??梢阅脕碜霰O(jiān)控。

 
 
 
 
  1. cat /proc/sys/fs/file-nr
  2. 1824  0 766722

要支持百萬連接,既要放開操作系統(tǒng)級別的句柄,也要放開進(jìn)程級別的句柄。也就是說,ulimit和file-max的顯示,都要大于百萬才成。

3. 如何設(shè)置?

設(shè)置進(jìn)程的句柄個數(shù),常用的方式就有ulimit,但是非常非常不推薦。原因無他,只有在同一個shell中啟動的進(jìn)程,ulimit的設(shè)置才會生效。你打開另外一個shell,或者重啟機器,ulimit的改動都會丟失。就是下面這種方式:

 
 
 
 
  1. ulimit -n 1000000

正確的方式,是修改/etc/security/limits.conf文件。比如下面的內(nèi)容。

 
 
 
 
  1. root soft nofile 1000000
  2. root hard nofile 1000000
  3. * soft nofile 1000000
  4. * hard nofile 1000000

可以看到,我們可以針對于特定的用戶,修改其句柄數(shù)量。這在安裝es等應(yīng)用時,經(jīng)常碰到。

 
 
 
 
  1. es  -  nofile  65535

但即使是這種方式,也要求你需要打開一個新的shell進(jìn)行操作。在當(dāng)前修改的shell里或者修改之前的shell里,同樣不生效。xjjdog就曾遇到過多起這樣明明放開了限制,但還是發(fā)生問題的案例。

要看到這些改變是否已經(jīng)對進(jìn)程生效,可以查看進(jìn)程的內(nèi)存映射文件。比如cat /proc/180323/limits,其中會有詳細(xì)的展示。

這個數(shù)值,也并不是想要設(shè)多大就多大的。它的大小上限,是由nr_open決定的。想要更大,就要修改/ect/sysct.conf 中fs.nr_open的值。

 
 
 
 
  1. cat /proc/sys/fs/nr_open
  2. 1048576

那file-max又該如何修改呢?建議修改/etc/sysctl.conf文件,加入下面內(nèi)容。足足有6百多萬!

 
 
 
 
  1. fs.file-max = 6553560

當(dāng)文件數(shù)量超出的時候,就會報kernel: VFS: file-max limit 65535 reached的錯誤。

總結(jié)一下。

Linux即使放開一個端口,能夠接受的連接也是海量的。這些連接的上限,受到單進(jìn)程文件句柄數(shù)量和操作系統(tǒng)文件句柄數(shù)量的限制,也就是ulimit和file-max。

為了能夠?qū)?shù)修改持久化,我們傾向于將改動寫入到文件里。進(jìn)程的文件句柄限制,可以放在/etc/security/limits.conf中,它的上限受到fs.nr_open的制約;操作系統(tǒng)的文件句柄限制,可以放到/etc/sysctl.conf文件中。最后,別忘了在/proc/$id/limits文件中,確認(rèn)修改是否對進(jìn)程生效了。

如此,百萬連接才名不虛傳。我比較奇怪的是,為什么Linux不默認(rèn)放開這些配置呢?做成65535也認(rèn)啊,為什么搞個1024?

作者簡介:小姐姐味道 (xjjdog),一個不允許程序員走彎路的公眾號。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進(jìn)一步交流。


網(wǎng)站欄目:Ulimit的坑,讓我的故障一波又一波
文章轉(zhuǎn)載:http://m.5511xx.com/article/dpjjhhi.html