Apache的多路處理模塊MPM:Prefork Worker Event

  1. 如何確認當前apache使用哪一種模式
    • 經過/etc/init.d/httpd中的來確認系統apache的運行腳本路徑
      • apachectl=/usr/sbin/apachectl
        httpd=${HTTPD-/usr/sbin/httpd}
        prog=httpd
        pidfile=${PIDFILE-/var/run/httpd.pid}
        lockfile=${LOCKFILE-/var/lock/subsys/httpd}
    • /usr/sbin/httpd -l
    • /usr/sbin/httpd -V | grep MPM
  2. prefork MPM使用多個子進程,每一個子進程一個線程的方式處理請求,每一個進程一個時間只處理一個請求。
    • 快,由於它每一個子進程沒有管理多個子線程的負擔
    • 穩定,由於某個請求出問題,不會影響到其餘進程,由於他們擁有獨立的地址空間,變量和內存。
    • 可用於非線程安全的第三方模塊,好比可使用非線程安全的mod_php模塊,但在大量併發的狀況下,會迅速大量消耗資源
    • 調優的關鍵參數,MaxClients和ServerLimit。MaxClients小於256的時候,ServerLimit不起做用,其默認值是256。通常這兩個值設置成同樣。MaxClients決定你的最大併發數。
      • MaxClients = (Total Memory – Critical Services Memory(OS)) / Size Per Apache process(about 30M)
    • 計算現有系統的每一個apache進程的內存使用量
      • ps aux | grep httpd | grep -v pts | awk '{ tot += $6; procs += 1; print $1,$2,$6,$11 } END { print "TOTAL: ",tot,"/",procs,"=",tot/procs }'
    • 估算MaxConnectionsPerChild公式
      • total amount of daily requests  / total number of daily processes
  3. worker MPM使用多個子進程,每一個子進程多個線程的混合方式處理請求,每一個線程一個時間只處理一個請求。對資源比較友好,適用於高併發狀況
    • 經常使用於高併發
    • 典型配置:
      • ServerLimit 40
        StartServers 2
        MaxClients 1000
        MinSpareThreads 25
        MaxSpareThreads 75
        ThreadsPerChild 25
        MaxRequestsPerChild 0php

      • 這裏ServerLimit限制進程數,MaxClients指的是同時最大鏈接數:ServerLimit = MaxClients / ThreadsPerChild
  4. event MPM在進程和線程的模式上和worker同樣,區別在於線程只負責處理請求自己,當請求處理完該線程當即能夠回收,http的鏈接管理交給父進程。
    • worker模式的時候,若是該http鏈接的keepalive設置的比較長的話,即便該請求已經處理完,也不能回收,由於http鏈接沒中斷,這樣就須要維持更多的線程。
相關文章
相關標籤/搜索