<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          漫畫 | 一臺Linux服務器最多能支撐多少個TCP連接?

          共 2067字,需瀏覽 5分鐘

           ·

          2020-12-16 20:59

          困惑很多人的并發(fā)問題

          在網(wǎng)絡開發(fā)中,我發(fā)現(xiàn)有很多同學對一個基礎問題始終是沒有徹底搞明白。那就是一臺服務器最大究竟能支持多少個網(wǎng)絡連接?我想我有必要單獨發(fā)一篇文章來好好說一下這個問題。

          很多同學看到這個問題的第一反應是65535。原因是:“聽說端口號最多有65535個,那長連接就最多保持65535個了”。是這樣的嗎?還有的人說:“應該受TCP連接里四元組的空間大小限制,算起來是200多萬億個!”

          如果你對這個問題也是理解的不夠徹底,那么今天講個故事講給你聽!

          一次關于服務器端并發(fā)的聊天

          "TCP連接四元組是源IP地址、源端口、目的IP地址和目的端口。任意一個元素發(fā)生了改變,那么就代表的是一條完全不同的連接了。拿我的Nginx舉例,它的端口是固定使用80。另外我的IP也是固定的,這樣目的IP地址、目的端口都是固定的。剩下源IP地址、源端口是可變的。所以理論上我的Nginx上最多可以建立2的32次方(ip數(shù))×2的16次方(port數(shù))個連接。這是兩百多萬億的一個大數(shù)字!!"

          "進程每打開一個文件(linux下一切皆文件,包括socket),都會消耗一定的內存資源。如果有不懷好心的人啟動一個進程來無限的創(chuàng)建和打開新的文件,會讓服務器崩潰。所以linux系統(tǒng)出于安全角度的考慮,在多個位置都限制了可打開的文件描述符的數(shù)量,包括系統(tǒng)級、用戶級、進程級。這三個限制的含義和修改方式如下:"

          • 系統(tǒng)級:當前系統(tǒng)可打開的最大數(shù)量,通過fs.file-max參數(shù)可修改
          • 用戶級:指定用戶可打開的最大數(shù)量,修改/etc/security/limits.conf
          • 進程級:單個進程可打開的最大數(shù)量,通過fs.nr_open參數(shù)可修改

          "我的接收緩存區(qū)大小是可以配置的,通過sysctl命令就可以查看。"

          $?sysctl?-a?|?grep?rmem
          net.ipv4.tcp_rmem?=?4096?87380?8388608
          net.core.rmem_default?=?212992
          net.core.rmem_max?=?8388608

          "其中在tcp_rmem"中的第一個值是為你們的TCP連接所需分配的最少字節(jié)數(shù)。該值默認是4K,最大的話8MB之多。也就是說你們有數(shù)據(jù)發(fā)送的時候我需要至少為對應的socket再分配4K內存,甚至可能更大。"

          "TCP分配發(fā)送緩存區(qū)的大小受參數(shù)net.ipv4.tcp_wmem配置影響。"

          $?sysctl?-a?|?grep?wmem
          net.ipv4.tcp_wmem?=?4096?65536?8388608
          net.core.wmem_default?=?212992
          net.core.wmem_max?=?8388608

          "在net.ipv4.tcp_wmem"中的第一個值是發(fā)送緩存區(qū)的最小值,默認也是4K。當然了如果數(shù)據(jù)很大的話,該緩存區(qū)實際分配的也會比默認值大。"


          服務端百萬連接達成記

          “準備啥呢,還記得前說過Linux對最大文件對象數(shù)量有限制,所以要想完成這個實驗,得在用戶級、系統(tǒng)級、進程級等位置把這個上限加大。我們實驗目的是100W,這里都設置成110W,這個很重要!因為得保證做實驗的時候其它基礎命令例如ps,vi等是可用的。

          活動連接數(shù)量確實達到了100W:

          $?ss?-n?|?grep?ESTAB?|?wc?-l??
          1000024

          當前機器內存總共是3.9GB,其中內核Slab占用了3.2GB之多。MemFree和Buffers加起來也只剩下100多MB了:

          $?cat?/proc/meminfo
          MemTotal:????????3922956?kB
          MemFree:???????????96652?kB
          MemAvailable:???????6448?kB
          Buffers:???????????44396?kB
          ......
          Slab:??????????3241244KB?kB

          通過slabtop命令可以查看到densty、flip、sock_inode_cache、TCP四個內核對象都分別有100W個:


          結語

          互聯(lián)網(wǎng)后端的業(yè)務特點之一就是高并發(fā). 但是一臺服務器最大究竟能支持多少個TCP連接,這個問題似乎卻又在困惑著很多同學。希望今天過后,你能夠將這個問題踩在腳下摩擦!

          學習是一件痛苦的事情,尤其咱們號里很多讀者朋友都是工作滿一天了再來看我的技術號的文章的。我一直都在琢磨到底怎么樣組織技術內容形式,能讓大家理解起來更能省一點腦細胞呢。這篇服務器的最大并發(fā)數(shù)的文章是早就想發(fā)的,但是寫了兩三個版本都不滿意。今天終于想出了一種讓大家更容易理解的方式,算過了自己這關了。

          資料自提

          1、計網(wǎng)、操作系統(tǒng)、計組相關視頻
          2、前字節(jié)大神刷題筆記
          3、計算機基礎知識PDF下載
          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品日韩一区二区三区 | 国产成人无码综合亚洲日韩不卡 | 久久久久无码精品人妻 | 好吊操在线视频 | 日韩免费三级 |