[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 應用技術 > Apache > 正文
調整BSD上Apache的性能
http://www.apache.org Cernet譯 (2001-04-16 14:26:50)
From http://www.apache.org/docs/misc/perf-bsd44.html 
Cernet譯 

和其他操作系統一樣,監聽隊列(listen queue)是首要限制條件。下面是Aaron Gifford  對BSDI 1.x,2.x和FreeBSD 2.0(包括舊版本)上的建議。 
編輯下面兩個文件: 
/usr/include/sys/socket.h 
/usr/src/sys/sys/socket.h 
在每個文件中,搜尋: 
    /* 
     * Maximum queue length specifiable by listen. 
     */ 
    #define SOMAXCONN       5 
將5修改為任何可以工作的值即可。經測試調整到32是不會有什問題的。 
修改,重新編譯kernel和Apache Server然重新啟動。 
FreeBSD 2.1在SOMAXCONN設置為32時工作的非常好。 
附錄:BSD服務器在重負載下Apache的性能調整 
From Chuck Murcko  

如果正運行著一個非常繁忙的BSD Apache服務器並且系統的反應很慢,那如下工作將很有用處: 
    運行vmstat檢查內存使用情況、page/swap利用率等 
    運行netstat -m檢查mbuf使用情況 
    運行fstat檢查文件描述符使用情況 
這些應用提供給你該如何調整kernel的信息以及是否應該增加一些內存。下面是一個有很重負載的BSD服務器的kernel配置參數(實際是BSDI服務器,但是與FreeBSD和4.4-Lite相關),系統其他參數沒有變化。 

maxusers    256 

maxusers對其他kernel參數產生影響: 

    進程的最大數目 
    每個用戶進程的最大數目 
    系統打開文件數目限制 
    每個用戶打開文件數目限制 
    mbuf clusters最大數目 
    Proc/pgrp hash表大小 

這些引申參數的定義公式在/usr/src/sys/conf/param.c中。這些計算出來的參數部分會被kernel配置文建裡自己定義的值覆蓋: 

# Network options. NMBCLUSTERS defines the number of mbuf clusters and 
# defaults to 256. This machine is a server that handles lots of traffic, 
# so we crank that value. 
options         NMBCLUSTERS=4096        # mbuf clusters at 4096 


# Misc. options 

options         CHILD_MAX=512           # maximum number of child processes 
options         OPEN_MAX=512            # maximum fds (breaks RPC svcs) 

在許多情況下,NMBCLUSTERS應該設置的比第一眼看上去需要設置的值大的多。這是因為如果瀏覽器在傳輸中中斷了連接,與特定連接相關的socket fd要在TIME_WAIT狀態等幾分鐘才釋放,在等待時mbuf並沒有釋放。另外,在服務器的timeouts中,一些連接會停留在FIN_WAIT_2狀態,這個狀態不會超時,瀏覽器又不會發出最終的FIN信號。 

關mbuf clusters更多的信息(From sys/mubf.h) 

/* 
 * Mbufs are of a single size, MSIZE (machine/machparam.h), which 
 * includes overhead.  An mbuf may add a single "mbuf cluster" of size 
 * MCLBYTES (also in machine/machparam.h), which has no additional overhead 
 * and is used instead of the internal data area; this is done when 
 * at least MINCLSIZE of data must be stored. 
 */ 

CHILD_MAX和OPEN_MAX設置成允許512個子進程(與每用戶最大進程數不同)和文件描述符。這個值可以根據你的特殊配置進行修改(如果你的模塊或CGI要打開許多文件時,就設置一個較大的OPEN_MAX)。如果在同一機器上除httpd外還有其他許多工作,就需要設置較大的NPROC。該例中NPROC的值來源maxusers。 

增大listen() queue的大小,需要調整SOMAXCONN的值。SOMAXCONN不是來自maxusers的。所以需要自己增大這個值。目前,這個值在sys/socket.h中設置。調整這個參數最好的方式時run-time(運行時更改),這要比在頭文件中修改要好。要在運行時更改,編輯/etc/rc.local,增加: 

   /usr/sbin/sysctl -w kern.somaxconn=256 

這裡使用256,可以進行更改以適合你的需要。許多情況下,設置成128就可以了。 

警告: 

如果配置的kernel使用的資源超過了你可使用的系統RAM的數量,系統可能不能啟動。保証任何時候有一個可以啟動系統的kernel。使用一些系統工具了解一下你是否需要增加一些內存。 

當OPEN_MAX大256時,RPC服務會失敗。這是由原始的RPC庫的一個函數使用1 byte保存文件描述符導致的。BSDI release 2.1解決了部分問題,但最終的解決需要等待重新設計RPC。 

最還有一個在Apache中對子進程配置的硬限制。 

對Apache 1.0.5以的版本,需要改變httpd.h中HARD_SERVER_LIMIT的定義並重新編譯才能運行超過150個httpd進程。 

在conf/httpd.conf-dist中: 

# Limit on total number of servers running, i.e., limit on the number 
# of clients who can simultaneously connect --- if this limit is ever 
# reached, clients will be LOCKED OUT, so it should NOT BE SET TOO LOW. 
# It is intended mainly as a brake to keep a runaway server from taking 
# Unix with it as it spirals down... 

MaxClients 150 

在增大這個值之前,要檢查一下你的系統,RAM 擴展,並調整kernel。 

M. Teterin"  寫到: 

對kernel和經常使用的應用程序進行優化非常有用。在AMD-133(486類CPU)上重新編譯FreeBSD kernel時加上 
      -m486 -fexpensive-optimizations -fomit-frame-pointer -O2 
可以減少 "unable" errors。 

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章

======
 

★  樊強制作 歡迎分享  ★