NO IMAGE
apache伺服器的最大併發數主要與伺服器的CPU、記憶體、頻寬、以及網站的一些服務如mysql等都有關係。

1、檔案控制代碼

Linux下編寫網路伺服器程式的朋友肯定都知道每一個tcp連線都要佔一個檔案描述符,一旦這個檔案描述符使用完了,新的連線到來返回給我們的錯誤是“Socket/File:Can’t open so many files”。

這時你需要明白作業系統對可以開啟的最大檔案數的限制。

  • 程序限制

    • 執行 ulimit -n 輸出 1024,說明對於一個程序而言最多隻能開啟1024個檔案,所以你要採用此預設配置最多也就可以併發上千個TCP連線。

    • 臨時修改:ulimit -n 1000000,但是這種臨時修改只對當前登入使用者目前的使用環境有效,系統重啟或使用者退出後就會失效。

    • 重啟後失效的修改(不過我在CentOS 6.5下測試,重啟後未發現失效):編輯 /etc/security/limits.conf 檔案, 修改後內容為

      * soft nofile 1000000

      * hard nofile 1000000

    • 永久修改:編輯/etc/rc.local,在其後新增如下內容

      ulimit -SHn 1000000

  • 全侷限制

    • 執行 cat /proc/sys/fs/file-nr 輸出 9344 0 592026,分別為:1.已經分配的檔案控制代碼數,2.已經分配但沒有使用的檔案控制代碼數,

    • 3.最大檔案控制代碼數。但在kernel 2.6版本中第二項的值總為0,這並不是一個錯誤,它實際上意味著已經分配的檔案描述符無一浪費的都已經被使用了 。

    • 我們可以把這個數值改大些,用 root 許可權修改 /etc/sysctl.conf 檔案:

      fs.file-max = 1000000

      net.ipv4.ip_conntrack_max = 1000000

      net.ipv4.netfilter.ip_conntrack_max = 1000000

    • 2、埠號範圍限制?

      作業系統上埠號1024以下是系統保留的,從1024-65535是使用者使用的。由於每個TCP連線都要佔一個埠號,所以我們最多可以有60000多個併發連線。我想有這種錯誤思路朋友不在少數吧?(其中我過去就一直這麼認為)

      我們來分析一下吧

      • 如何標識一個TCP連線:系統用一個4四元組來唯一標識一個TCP連線:{local ip, local port,remote ip,remote port}。好吧,我們拿出《UNIX網路程式設計:卷一》第四章中對accept的講解來看看概念性的東西,第二個引數cliaddr代表了客戶端的ip地址和埠號。而我們作為服務端實際只使用了bind時這一個埠,說明埠號65535並不是併發量的限制。

      • server最大tcp連線數:server通常固定在某個本地埠上監聽,等待client的連線請求。不考慮地址重用(unix的SO_REUSEADDR選項)的情況下,即使server端有多個ip,本地監聽埠也是獨佔的,因此server端tcp連線4元組中只有remote ip(也就是client ip)和remote port(客戶端port)是可變的,因此最大tcp連線為客戶端ip數×客戶端port數,對IPV4,不考慮ip地址分類等因素,最大tcp連線數約為2的32次方(ip數)×2的16次方(port數),也就是server端單機最大tcp連線數約為2的48次方。

      • 3、頻寬限制

      • 若頻寬5M,每位使用者訪問速度每秒500K,則每秒十個併發,一分鐘600個併發。

        4、記憶體限制

      • 檢視當前的連線數可以用:

        ps aux | grep httpd | wc -l
        或:
        pgrep httpd|wc -l

      • 計算httpd佔用記憶體的平均數:
        ps aux|grep -v grep|awk ‘/httpd/{sum =$6;n };END{print sum/n}’
      • 由於基本都是靜態頁面,CPU消耗很低,每程序佔用記憶體也不算多,大約200K。伺服器記憶體有2G,除去常規啟動的服務大約需要500M(保守估計),還剩1.5G可用,那麼理論上可以支援1.5*1024*1024*1024/200000 = 8053.06368
      • 5、mysql併發數限制

        mysql的連線設定為單例模式,這樣可以保證,在不同頁面訪問資料庫不用頻繁的開啟關閉資料庫,有利於提高資料庫效率。

      • 如果mysql 連線資料設定不合理可能會導致很小的流量mysql就提示MySQL: ERROR 1040: Too many connections錯誤了,那麼要如何才算是合理設定mysql最大連線數呢,下面我來給大家介紹介紹。

        MySQL伺服器的連線數並不是要達到最大的100%為好,還是要具體問題具體分析,下面就對MySQL伺服器最大連線數的合理設定進行了詳盡的分析,供您參考。

        我們經常會遇見“MySQL: ERROR 1040: Too many connections”的情況,通常,mysql的最大連線數預設是100, 最大可以達到16384。

        一種是訪問量確實很高,MySQL伺服器抗不住,這個時候就要考慮增加從伺服器分散讀壓力,另外一種情況是MySQL配置檔案中max_connections值過小:

        mysql> show variables like ‘max_connections’;
        —————– ——-
        | Variable_name | Value |
        —————– ——-
        | max_connections | 256 |
        —————– ——-

        這臺MySQL伺服器最大連線數是256,然後查詢一下伺服器響應的最大連線數:

        mysql> show global status like ‘Max_used_connections’;

        MySQL伺服器過去的最大連線數是245,沒有達到伺服器連線數上限256,應該沒有出現1040錯誤,比較理想的設定是:

        Max_used_connections / max_connections * 100% ≈ 85%

        最大連線數占上限連線數的85%左右,如果發現比例在10%以下,MySQL伺服器連線上線就設定得過高了

      • 6、如何設定apache的併發數量

        1、在httpd.conf檔案中修改

        #Server-pool management (MPM specific)

        #Include conf/extra/httpd-mpm.conf

        將上面一句的#註釋去掉

        2、確定當前的apache是什麼MPM模式(winnt模式,perfork模式,worker模式)

        進入到apache/bin目錄

        cmd命令:httpd.exe -1

        20130922220427

        說明:看mpm_xxx.c 如果xxx是winnt  說明是winnt,另外還可能是perfork或者worker

        3、修改httpd-mpm.conf檔案

        # WinNT MPM

        # ThreadsPerChild: constant number of worker threads in the server process

        # MaxRequestsPerChild: maximum  number of requests a server process serves

        <IfModule mpm_winnt_module>

        ThreadsPerChild      150  //修改這個值即可

        MaxRequestsPerChild    0

        </IfModule>

        4、重啟apache,測試看看

        在Linux下,一般採用的MPM是perfork模式

        <IfModule mpm_prefork_module>

        StartServers          5        //預先起5個程序

        MinSpareServers       5       //最小空閒程序

        MaxSpareServers      10      //最大空閒程序

        MaxClients          150      //併發連線數

        MaxRequestsPerChild   0      //指一個程序裡可以起多少個執行緒,對worker更好,0為不限制

        </IfModule>

      • 7、apache中MaxRequestsPerChild引數配置

      • MaxRequestsPerChild在apache中是一個非常重要的引數對於網站流量過大機器配置不好的朋友可以通過MaxRequestsPerChild來合理的設定程序與子程序的數量以達到最優的配置,下面一起來看看關於MaxRequestsPerChild引數配置的例子。

      • MaxRequestsPerChild引數介紹

        用 記事本開啟apache2confhttpd.conf,

        通常在“Windows工作管理員-程序”中可以看到兩個apache.exe程序,一個是父程序、一個是子程序,父程序接到訪問請求 後,將請求交由子程序處理。

        MaxRequestsPerChild這個指令設定一個獨立的子程序將能處理的請求數量。在處理 “MaxRequestsPerChild 數字”個請求之後,子程序將會被父程序終止,這時候子程序佔用的記憶體就會釋放,如果再有訪問請求,父程序會重新產生子程序進行處理。

        如果 MaxRequestsPerChild預設設為0(無限)或較大的數字(例如10000以上)可以使每個子程序處理更多的請求,不會因為不斷終止、啟動 子程序降低訪問效率,但MaxRequestsPerChild設定為0時,如果佔用了200~300M記憶體,即使負載下來時佔用的記憶體也不會減少。

        記憶體 較大的伺服器可以設定為0或較大的數字。記憶體較小的伺服器不妨設定成30、50、100,以防記憶體溢位