apache服務器的優化

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,以防內存溢出



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章