linux apache服務器優化建議整理(很實用)


apache服務器的time_wait過多 fin_wait1過多等問題

    通常表現為apache服務器負載高,w命令顯示load average可能上百,但是web服務基本沒有問題。同時ssh能夠登陸,但是反應非常遲鈍。

原因:最可能的原因是httpd.conf里面keepalive沒有開,導致每次請求都要建立新的tcp連接,請求完成以后關閉,增加了很多 time_wait的狀態。另,keepalive可能會增加一部分內存的開銷,但是問題不大。也有一些文章討論到了sysctl里面一些參數的設置可以改善這個問題,但是這就舍本逐末了。

2。fin_wait1狀態過多。fin_wait1狀態是在server端主動要求關閉tcp連接,並且主動發送fin以后,等待 client端回復ack時候的狀態。fin_wait1的產生原因有很多,需要結合netstat的狀態來分析。

netstat -nat|awk ‘{print awk $NF}’|sort|uniq -c|sort -n

上面的命令可以幫助分析哪種tcp狀態數量異常

netstat -nat|grep ":80"|awk ‘{print $5}’ |awk -F: ‘{print $1}’ | sort| uniq -c|sort -n
則可以幫助你將請求80服務的client ip按照連接數排序。

回到fin_wait1這個話題,如果發現fin_wait1狀態很多,並且client ip分布正常,那可能是有人用肉雞進行ddos攻擊、又或者最近的程序改動引起了問題。一般說來后者可能性更大,應該主動聯系程序員解決。

但是如果有某個ip連接數非常多,就值得注意了,可以考慮用iptables直接封了他。

apache如何限制用戶線程數?限制客戶端一個IP同時連接數,實際應用:限制flashget,網絡螞蟻等軟件只有2個進程有效

apache如何限制用戶線程數?

限制客戶端一個IP同時連接數,實際應用:限制flashget,網絡螞蟻等軟件只有2個進程有效。
(注釋:/opt/httpd/是我的apache的安裝目錄,大家可以自行改成自己的路徑)

 

首先,從http://dominia.org/djao/下載mod_limitipconn-0.22.tar.gz
上傳解壓后運行

#/opt/httpd/bin/apxs -c -i -a mod_limitipconn.c 將此外部DSO模塊編譯入Apache

檢查/opt/httpd/modules是否有mod_limitipconn.so模塊

配置apache配置文件,找到相應位置,如下:
LoadModule limitipconn_module modules/mod_limitipconn.so
#

MaxConnPerIP 2

並將#ExtendedStatus On的注釋去掉

重啟Apache,檢查是否可限制單一IP多個並發連接

測試效果,用flashget下載,默認是5個螞蟻,只有2個可以連接並進行下載,其他的3個始終連接不上!--成功!!!

Apache性能優化2009-01-15 13:32Tunning Apache

Apache幾目前Internet上使用最為廣泛的Web服務器。它具有比商業Web服務器不遑多讓的功能與速度,同時安裝與設置也十分簡單,正是這些特性讓它成為市場占有率最高的Web服務器軟件。不過Apache安裝簡單,並不意味着簡單地安裝就可以適用於絕大多數應用環境,在高負荷的 Web站點,Apache還需要進行調整、優化……

優化方法

Apache的配置文件是httpd.conf。Windows下該文件位於Apache安裝目錄的Conf子目錄下,RedHat Enterprise Linux AS 3.0 Update 2位於/etc/httpd/conf。通過調整該文件的某些參數,可以優化Apache的運行效率。

為了驗證后文Apache參數的調整是否起作用,我們通常用Apache附帶的ab(Apache Bench)對其進行壓力測試。

ab最常用的語法格式是這樣的:

ab -n XXX -c YYY -k http://hostname.port/path/filename

其中:

-n XXX:
表示最多進行XXX次測試。也就是下載filename文件XXX次。

-c YYY:
客戶端並發連接個數。

-k:   
啟用HTTP KeepAlive功能。默認不啟用KeepAlive功能。

比如我們要對http://hostname:port/file.com下載10000次進行測試,並發訪問為60個,啟用HTTP KeepAlive功能,則訪問指令為:

ab -n 10000 -c 60 -k http://hostname:port/file.htm

測試平台

在本次優化過程中。筆者采用了兩台電腦進行壓力測試。其中一台為客戶端,運行ab發送請求,另外一台為服務器,安裝有Apache提供Web服務。

1.服務器配置

服務器端,筆者采用了較低端的配置。這樣更容易通過ab測試看來調整參數后的效果:

CPU:      Intel Celeron 1.0GHz
內存:    512MB SRAM 100MHz
硬盤:    Maxtor 4D040H2
網卡:    D-Link DFE 530TX

服務器端筆者安裝兩種操作系統:Windows Server 2003 Enterprise Edition並升級到最新的Hotfix。Apache服務器版本為2.0.50;或者RedHat Enterprise Linux AS 3.0 Update 2。

2.客戶端配置

為了使評測的瓶頸不在客戶端,筆者客戶端配置要比服務器端好,具體硬件配置如下:

CPU:      P4 3.0GHz 533MHz 打開了HT支持
內存:    512MB DDR 400
硬盤:    WD1200JB-00CRA1
網卡:    D-Link DFE 530TX

客戶端安裝有RedHat Enterprise Linux AS 3.0 Update 2。並利用其中的ab來進行性能測試。

通用優化技巧

對於Apache服務器來說,為了提高性能需要進行的某些參數調整具有通用性,也就是說只要采用了就可以使其性能更好。

1.關閉DNS和名字解析

* HostnameLookups on | off | double

Apache 1.3之前HostnameLookups默認是打開的。這樣客戶端在訪問服務器時,服務器將要解析客戶端的主機名,並將其保存在日志文件中。對客戶端進行域名反向解析會大幅降低服務器速度,所以最好將其設置為Off。關閉指令如下:

HostnameLookups off

* UseCanonicalName on | off | dns

打開UseCanonicalName是Web服務器的標准做法。這是因為客戶發送的大部分請求都是對本服務器的引用,打開該項設置就能使用 ServerName和Port選項的設置內容構建完整的URL。如果將這個參數設置為Off,那么Apache將使用從客戶請求中獲得服務器名字和端口值,重新構建URL。

如果你不需要在Apache中架設虛擬主機,建議設置為:

UseCanonicalName on

2.關閉多余模塊

Apache采用了模塊化設計,管理員可以有選擇地加載一些模塊來加強服務器的功能。這些模塊,可以在創建服務器時靜態編譯到服務器的二進制代碼中,也可以編譯成一些獨立服務器程序的Dynamic Shared Objects(DSO)文件,在Apache啟動的時候根據需要,動態加載。事實證明,不加載多余的模塊總是可以提高Apache的性能。

Apache的DSO模塊是在httpd.conf中以:

LoadModule access_module modules/mod_access.so

方式加載。當不需要某個模塊時,只要在其前添加“#”,注釋掉該行。

一般來說,不需要加載以下模塊:

mod_include.so:
服務器端包含,是一種已經過時的技術。

mod_autoindex.so:
如果不希望Apache列目錄顯示,可以刪除。

mod_access.so、mod_auth.so:
如果你不需要進行安全驗證,也沒有必要加載。

最好加載以下模塊:

mod_dir.so:
用於定義缺省文檔index.php、index.jsp等。

mod_log_config.so:
用於定義記錄文件格式。

mod_mime.so:
定義文件類型的關聯。

最后需要說明一點的是,並不是加載所有的模塊都會降低Apache性能。比如mod_zip可以把文件壓縮之后再傳給客戶端,這樣就可以減少 40%左右的網絡流量,而mod_expires則可以減少10%左右的重復請求。

3.取消.htaccess驗證

除非你確定需要使用.htaccess文件來控制客戶端對相應目錄的訪問權限,否則設置“AllowOverride None”,可以免除Apache在每個目錄搜索.htaccess文件之苦。

4.取消符號鏈接

FollowSymLinks允許使用符號連接,這將使用瀏覽器有可能訪問文檔根目錄(DocumentRoot)之外的內容,並且只有符號連接的目的與符號連接本身為同一用戶所擁有時(SymLinksOwnerMatch),才允許訪問,這個設置將增加一些安全性,但將耗費Apache大量的資源。

筆者建議:

Options FollowSymLinks

但是不要啟用SymLinksOwnerMatch。

5.打開KeepAlive支持

在HTTP 1.0中和Apache服務器的一次連接只能發出一次HTTP請求,而KeepAlive參數支持HTTP 1.1版本的一次連接,多次傳輸功能,這樣就可以在一次連接中發出多個HTTP請求。從而避免對於同一個客戶端需要打開不同的連接。很多請求通過同一個 TCP連接來發送,可以節約網絡和系統資源。

在Apache的配置文件httpd.conf中,設置:

KeepAlive on
KeepAliveTimeout 15

這樣就能限制每個連接的保持時間是15秒。在我們的評測中發現,打開KeepAlive之前,ab測試的數據為:

Requests per second:    201.32 [#/sec] (mean)
Time per request:      298.031 [ms] (mean)
Time per request:      4.967 [ms] (mean, across all concurrent requests)
Transfer rate:          839.49 [Kbytes/sec] received

而打開KeepAlive支持之后,ab測試數據為:

Requests per second:    341.70 [#/sec] (mean)
Time per request:      175.594 [ms] (mean)
Time per request:      2.927 [ms] (mean, across all concurrent requests)
Transfer rate:          1437.04 [Kbytes/sec] received

最能反應Apache服務器性能的Requests per second,即每秒完成的請求次數從201.32提升到341.70,提升幅度為70%。雖然在現實環境中,不可能有這么多的同一連接發出的請求,但啟用KeepAlive確實在一定程度上可以提高Apache服務器的吞吐量和反應速度。

另外,可以設置:

MaxKeepAliveRequests 100

把MaxKeepAliveRequests設置的盡量大,可以在一次連接中進行更多的HTTP請求。但在我們的測試中還發現,把 MaxKeepAliveRequests設置成1000,則評測的客戶端容易出現“Send requesttimed out”的錯誤,所以具體數值還要根據自己的情形來設置。

參數決定性能

Apache除了可以通過一些常規方式進行優化外,還需要調整其運行參數,這樣才能構建一個適合相應網絡環境的Web服務。這些指令從兩個級別對Apache進行了優化。

* 進程級(Process-level)

進程級的參數用來控制Apache相應的客戶端請求的進程數Process(在Windows下稱之為線程數,threads)。

* 協議級(Protocol-level)

協議級的指令則用來控制Apache與客戶端的連接多久才自動斷開。

由於Windows和Linux/UNIX設計原理的不同,所以進程級的指令根據Apache是工作在Linux/UNIX或者Windows 下,而分成兩種。

1.Linux下Apache性能優化

Linux下的Apache預設工作在prefork模式下(由每個進程處理連接請求),這種工作模式也是Apache 1.3系列的工作模式。如果你需要其工作在其他模式下,則需要手工編譯源代碼來實現:

./configure –prefix=/usr/local/apache-2.0.50 –with-mpm=worker –enable-include && make && make install

Linux下進程級的Apache調整參數包括以下五個。

* StartServers

該參數決定Linux啟動時,自動打開的Apache服務器的數目。它對Apache服務器的性能沒有太大的影響。因為如果 MinSpareServers設置的比較大,Apache服務器進程數會馬上調整到不小於MinSpareServers的數目。

在Linux下,我們可以通過:

ps aux |grep httpd

來查看當前打開的Apache服務進程數。

* MinspareServers

該參數用於配置在任何時候可用的最小Apache進程個數。一般情況下,當目前可用的Apache進程數不能滿足需求時,Apache會自動打開新進程以服務客戶。所以設置MinspareServers為較大的值只是為了讓在比較繁忙的Web環境,讓Apache可以盡快地滿足客戶端的訪問需求。對於每天有百萬訪問量的網站來說,下面的數值是比較合適的:

MinspareServers 32

* MaxSpareServers

較大的MinSpareServers可以保證Apache有較快的反應速度,過大的MinSpareServers又會占用更多的系統內存。如果你的系統內存不是很充足或者運行有其他的服務,把MaxSpareServers設置小一些可以為其他服務空出一些內存。當空閑Apache進程超過 MaxSpareServers指定的數值時,Apache主進程會殺掉多余的空閑進程而保持空閑進程在MaxSpareServers指定的數值。

對於每天百萬訪問量的網站來說,配置大容量的內容,並且設置如下的值是比較合適的:

MaxSpareServers 64

* MaxClients

服務器的處理能力畢竟是有限的,不可能同時處理無限多的連接請求。參數MaxClients就用於規定服務器支持的最多並發訪問的客戶數。

如果MaxClients設置得過大,系統在繁忙時不得不在過多的進程之間來回切換為更多的客戶服務。這樣對每個客戶的反應就會變慢;如果設置得過小,系統繁忙時就會拒絕客戶連接請求。

我們的設想原則是,當服務器性能較高時,可以適當增加這個值的設置。如果繁忙出現拒絕訪問現象,說明需要升級服務器硬件了。

如果你不在意訪問速度,或者認為反應速度慢也總比拒絕連接好,可以把該值設置大一些。

* MaxRequestsPerChild

當設置KeepAlive為off時,Apache服務器是用單獨的子進程為一次連接服務,這樣,每次連接都需要生成、關閉子進程,這些額外的操作浪費了計算機的大量處理能力。最好的方式是一個子進程可以為多次連接請求服務。

但子進程在接受訪問請求時,需要不斷地申請和釋放內存,次數多了就會造成內存垃圾,影響系統穩定性。為了解決這個問題,可以規定每一個子進程處理的最大請求數,超過此數值,就讓該子進程退出,再從原始的httpd進程中重新復制一個干凈的副本,從而提高系統的穩定性。

第個子進程能夠處理服務請求的最大次數由MaxRequestsPerChild定義。RedHat Enterprise Linux AS 3.0 Update 2缺省的設置值為1000這個值比較適合(設置為0支持每個副本進行無限次的服務處理)。

在我們的測試過程中發現,RedHat Enterprise Linux AS 3.0 Update 2下默認配置的Apache並不能很好地應付大負荷站點。我們需要打開KeepAlive,並加大StartServers、 MinSpareServers、MaxSpareServers和MaxClients的數值。這些參數對於Apache性能的改善有很大的影響。

小知識:
RedHat Enterprise Linux AS 3.0 Update 2最大MaxClients只能設置到256。如果你需要設置其為更高,需要在MaxClients前面添加:
ServerLimit xxx
其中xxx不能少於MaxClients的數值。該設置方法適用於Apache 2.0系列。

2.Windows下Apache優化

Windows下,Apache 2.0經過了全新的設計,采用多線程的方式(work)運行。這種運行方式,理論上比Linux/UNIX的Perfork運行模式有更好的性能。

Work模式下由單個控制進程負責子進程的建立。每個子進程可以建立由ThreadsPerChild指定的固定數量的線程。由獨立的線程監聽並處理到來的連接。

在Windows下可以執行“Apache -l”。查看當前工作模式,如果顯示“mpm_winnt.c”,則表示Apache工作在多線程模式下;在Linux下執行“httpd -l”看到“prefork.c”表示工作在子進程模式下。

其配置語句是:

StartServers          2
MaxClients          150
MinSpareThreads      25
MaxSpareThreads      75         
ThreadsPerChild      25
MaxRequestsPerChild    0

Apache力圖維持一個備用的服務線程池,讓客戶端無須等待線程/進程的建立即可得到處理。最初建立的進程數由 StartServers指定。然后Apache會不停地檢測所有Apache進程中空閑線程的總數,並新建或結束進程使總數維持在 MinSpareThreads和MaxSpareThreads所指定的范圍以內。但同時可以得到處理的客戶端的最大數量又取決於MaxClients 指令,而進程建立的最大數量取決於ServerLimit指令。三者之間的關系為:

ServerLimit*ThreadsPerChild >=MaxClients

具體參數和優化方法這里由於篇幅所限,不再具體介紹。有興趣的朋友可以參考前文介紹的Linux下的優化進行。

Apache服務器的優化-模式設置2009-01-15 12:08服務器的優化
(MPM: Multi-Processing Modules)
apache2主要的優勢就是對多處理器的支持更好,在編譯時同過使用–with-mpm選項來決定apache2的工作模式。如果知道當前的apache2使用什么工作機制,可以通過httpd -l命令列出apache的所有模塊,就可以知道其工作方式:

prefork:
如果httpd -l列出prefork.c,則需要對下面的段進行配置:

StartServers 5 #啟動apache時啟動的httpd進程個數。
MinSpareServers 5 #服務器保持的最小空閑進程數。
MaxSpareServers 10 #服務器保持的最大空閑進程數。
MaxClients 150 #最大並發連接數。
MaxRequestsPerChild 1000 #每個子進程被請求服務多少次后被kill掉。0表示不限制,推薦設置為1000。

在該工作模式下,服務器啟動后起動5個httpd進程(加父進程共6個,通過ps -ax|grep httpd命令可以看到)。當有用戶連接時,apache會使用一個空閑進程為該連接服務,同時父進程會fork一個子進程。直到內存中的空閑進程達到 MaxSpareServers。該模式是為了兼容一些舊版本的程序。我缺省編譯時的選項。

worker:
如果httpd -l列出worker.c,則需要對下面的段進行配置:

StartServers 2 #啟動apache時啟動的httpd進程個數。
MaxClients 150 #最大並發連接數。
MinSpareThreads 25 #服務器保持的最小空閑線程數。
MaxSpareThreads 75 #服務器保持的最大空閑線程數。
ThreadsPerChild 25 #每個子進程的產生的線程數。
MaxRequestsPerChild 0 #每個子進程被請求服務多少次后被kill掉。0表示不限制,推薦設置為1000。

該模式是由線程來監聽客戶的連接。當有新客戶連接時,由其中的一個空閑線程接受連接。服務器在啟動時啟動兩個進程,每個進程產生的線程數是固定的(ThreadsPerChild決定),因此啟動時有50個線程。當50個線程不夠用時,服務器自動fork一個進程,再產生25個線程。

perchild:
如果httpd -l列出perchild.c,則需要對下面的段進行配置:

NumServers 5 #服務器啟動時啟動的子進程數
StartThreads 5 #每個子進程啟動時啟動的線程數
MinSpareThreads 5 #內存中的最小空閑線程數
MaxSpareThreads 10 #最大空閑線程數
MaxThreadsPerChild 2000 #每個線程最多被請求多少次后退出。0不受限制
MaxRequestsPerChild 10000 #每個子進程服務多少次后被重新fork。0表示不受限制。

該模式下,子進程的數量是固定的,線程數不受限制。當客戶端連接到服務器時,又空閑的線程提供服務。 如果空閑線程數不夠,子進程自動產生線程來為新的連接服務。該模式用於多站點服務器。
Apache的prefork模式和worker 模式2009-01-15 11:48Apache的prefork模式和worker模式

prefork模式
這個多路處理模塊(MPM)實現了一個非線程型的、預派生的web服務器,它的工作方式類似於Apache 1.3。它適合於沒有線程安全庫,需要避免線程兼容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。

這個MPM具有很強的自我調節能力,只需要很少的配置指令調整。最重要的是將MaxClients設置為一個足夠大的數值以處理潛在的請求高峰,同時又不能太大,以致需要使用的內存超出物理內存的大小。

worker模式
此多路處理模塊(MPM)使網絡服務器支持混合的多線程多進程。由於使用線程來處理請求,所以可以處理海量請求,而系統資源的開銷小於基於進程的MPM。但是,它也使用了多進程,每個進程又有多個線程,以獲得基於進程的MPM的穩定性。

控制這個MPM的最重要的指令是,控制每個子進程允許建立的線程數的ThreadsPerChild指令,和控制允許建立的總線程數的 MaxClients指令。

prefork和worker模式的切換
1.將當前的prefork模式啟動文件改名
mv httpd httpd.prefork
2.將worker模式的啟動文件改名
mv httpd.worker httpd
3.修改 Apache配置文件
vi /usr/local/apache2/conf/extra/httpd-mpm.conf
找到里邊的如下一段,可適當修改負載等參數:
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
4.重新啟動服務
/usr/local/apache2/bin/apachectl restart
即可換成worker方式啟動apache2

處於穩定性和安全性考慮,不建議更換apache2的運行方式,使用系統默認prefork即可。另外很多php模塊不能工作在worker模式下,例如redhat linux自帶的php也不能支持線程安全。所以最好不要切換工作模式。

prefork和worker模式的比較
prefork模式使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接。在大多數平台上,Prefork MPM在效率上要比Worker MPM要高,但是內存使用大得多。prefork的無線程設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好線程安全的第三方模塊,並且對於那些線程調試困難的平台而言,它也更容易調試一些。

worker模式使用多個子進程,每個子進程有多個線程。每個線程在某個確定的時間只能維持一個連接。通常來說,在一個高流量的HTTP服務器上,Worker MPM是個比較好的選擇,因為Worker MPM的內存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個線程崩潰,整個進程就會連同其所有線程一起”死掉”.由於線程共享內存空間,所以一個程序在運行時必須被系統識別為”每個線程都是安全的”。

總的來說,prefork方式速度要稍高於worker,然而它需要的cpu和memory資源也稍多於woker。

prefork模式配置詳解
<IfModule mpm_prefork_module>
ServerLimit 256
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 256
MaxRequestsPerChild 0
</IfModule>
ServerLimit
默認的 MaxClient最大是256個線程,如果想設置更大的值,就的加上ServerLimit這個參數。20000是ServerLimit這個參數的最大值。如果需要更大,則必須編譯apache,此前都是不需要重新編譯Apache。
生效前提:必須放在其他指令的前面

StartServers
指定服務器啟動時建立的子進程數量,prefork默認為5。

MinSpareServers
指定空閑子進程的最小數量,默認為5。如果當前空閑子進程數少於MinSpareServers ,那么Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。

MaxSpareServers
設置空閑子進程的最大數量,默認為10。如果當前有超過MaxSpareServers數量的空閑子進程,那么父進程將殺死多余的子進程。此參數不要設的太大。如果你將該指令的值設置為比MinSpareServers小,Apache將會自動將其修改成”MinSpareServers 1″。

MaxClients
限定同一時間客戶端最大接入請求的數量(單個進程並發線程數),默認為256。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個鏈接被釋放,隊列中的請求將得到服務。要增大這個值,你必須同時增大ServerLimit。

MaxRequestsPerChild
每個子進程在其生存期內允許伺服的最大請求數量,默認為10000.到達 MaxRequestsPerChild的限制后,子進程將會結束。如果MaxRequestsPerChild為”0″,子進程將永遠不會結束。將 MaxRequestsPerChild設置成非零值有兩個好處:
1.可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。

worker模式配置詳解
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>

StartServers
服務器啟動時建立的子進程數,默認值是”3″。

MaxClients
允許同時伺服的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候隊列。默認值是”400″,16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,你必須同時增加ServerLimit的值。

MinSpareThreads
最小空閑線程數,默認值是”75″。這個MPM將基於整個服務器監視空閑線程數。如果服務器中總的空閑線程數太少,子進程將產生新的空閑線程。

MaxSpareThreads
設置最大空閑線程數。默認值是”250″。這個MPM將基於整個服務器監視空閑線程數。如果服務器中總的空閑線程數太多,子進程將殺死多余的空閑線程。MaxSpareThreads的取值范圍是有限制的。Apache將按照如下限制自動修正你設置的值:worker要求其大於等於MinSpareThreads加上ThreadsPerChild的和。

ThreadsPerChild
每個子進程建立的常駐的執行線程數。默認值是25。子進程在啟動時建立這些線程后就不再建立新的線程了。

MaxRequestsPerChild
設置每個子進程在其生存期內允許伺服的最大請求數量。到達 MaxRequestsPerChild的限制后,子進程將會結束。如果MaxRequestsPerChild為”0″,子進程將永遠不會結束。將 MaxRequestsPerChild設置成非零值有兩個好處:
1.可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
注意對於KeepAlive鏈接,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大鏈接數量的行為。

巧用tmpfs加速你的linux服務器

今天從朋友高春輝那里又學了一招,就是使用tmpfs,我把他消化后用來實現虛擬磁盤來存放squid的緩存文件和php的seesion。速度快不少哦!

默認系統就會加載/dev/shm ,它就是所謂的tmpfs,有人說跟ramdisk(虛擬磁盤),但不一樣。象虛擬磁盤一樣,tmpfs 可以使用您的 RAM,但它也可以使用您的交換分區來存儲。而且傳統的虛擬磁盤是個塊設備,並需要一個 mkfs 之類的命令才能真正地使用它,tmpfs 是一個文件系統,而不是塊設備;您只是安裝它,它就可以使用了。

tmpfs有以下優勢:
1。動態文件系統的大小,
2。tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 文件系統會完全駐留在 RAM 中,讀寫幾乎可以是瞬間的。
3。tmpfs 數據在重新啟動之后不會保留,因為虛擬內存本質上就是易失的。所以有必要做一些腳本做諸如加載,綁定的操作。

好了講了一些大道理,大家看的煩了吧,還是講講我的應用吧:)

首先在/dev/stm建個tmp文件夾,然后與實際/tmp綁定

mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount –bind /dev/shm/tmp /tmp

1。squid的緩存目錄設置

vi /etc/squid/squid.conf

修改成
cache_dir ufs /tmp 256 16 256
這里的第一個256表示使用256M內存,我覺得高性能 LINUX雙效防火牆HOWTO使用ramdisk的方法還不如直接使用tmpfs,至少每次啟動不用mkfs,還可以動態改變大小。

然后重啟一下服務,ok,現在所有的squid緩存文件都保存倒tmpfs文件系統里了,很快哦。

2。對php性能的優化

對於一個訪問量大的以apache+php的網站,可能tmp下的臨時文件都會很多,比如seesion或者一些緩存文件,那么你可以把它保存到 tmpfs文件。

保存seesion的方法很簡單了只要修改php.ini就行了,由於我已經把/dev/stm/tmp與/tmp綁定,所以不改寫也行,至於 php程序產生的緩存文件那只能改自己的php程序了:)

希望我的這個方法,能對你有所啟發。

參考文檔:使用虛擬內存(virtual memory,VM)文件系統和綁定安裝

Apache下限制每個虛擬主機的並發數

下載模塊:http://www.nowhere-land.org/programs/mod_vhost_limit/

安裝:
apxs -c mod_vhost_limit.c -o /path/to/libexec/mod_vhost_limit.so

在 httpd.conf 加入:
LoadModule vhost_limit_module libexec/mod_vhost_limit.so
AddModule mod_vhost_limit.c

配置:
MaxClients 150
ExtendedStatus On
NameVirtualHost *
<VirtualHost *>
    ServerName server1
    DocumentRoot /some/where/1
    MaxVhostClients 100
</VirtualHost>
<VirtualHost *>
    ServerName server2
    DocumentRoot /some/where/2
    MaxVhostClients 30
</VirtualHost>
<VirtualHost *>
    ServerName server3
    DocumentRoot /some/where/3
</VirtualHost>

其中:server1 被限制為 100 個並發線程數。server2 被限制為 30 個並發線程數。server3 沒有被限制。
注:需 mod_status 的 ExtendedStatus On 支持!!

如超出限制的並發數在客戶端就會出現503錯誤:
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
——————————————————————————–

Apache/1.3.27 Server at server1 Port 80

在 error_log 中將會有類似以下的錯誤提示:
[Mon Jun 23 15:22:24 2003] [error] client access to server1 deferred, MaxVhostClients 100 exceeded
——————————————————————————–

下載 mod_limitipconn.c
http://dominia.org/djao/limit/mod_limitipconn-0.04.tar.gz
http://dominia.org/djao/limit/mod_limitipconn-0.04-1.i386.rpm
(proxy client detection feature not enabled)
http://dominia.org/djao/limit/mod_limitipconn-0.04-1.src.rpm
我用的是tar包下載的是mod_limitipconn-0.04.tar.gz,(該模塊已經可以支持apache2)在服務器上執行# wget http://dominia.org/djao/limit/mod_limitipconn-0.04.tar.gz 下載到本地,然后執行下面的命令編譯安裝。我的apache位於/usr/local/apache目錄

解壓縮:
[root@ns chenlf]# tar zxvf mod_limitipconn-0.04.tar.gz
mod_limitipconn-0.04/
mod_limitipconn-0.04/Makefile
mod_limitipconn-0.04/README
mod_limitipconn-0.04/apachesrc.diff
mod_limitipconn-0.04/mod_limitipconn.c
mod_limitipconn-0.04/ChangeLog

編譯安裝:
[root@ns chenlf]# cd mod_limitipconn-0.04
[root@ns mod_limitipconn-0.04]# ls
apachesrc.diff     ChangeLog     Makefile
mod_limitipconn.c README
[root@ns mod_limitipconn-0.04]
# /usr/local/apache/bin/apxs -c -i -a mod_limitipconn.c
gcc -DLINUX=22 -I/usr/include/db1 -fpic -DSHARED_MODULE -I
/usr/local/apache/include -c mod_limitipconn.c
gcc -shared -o mod_limitipconn.so mod_limitipconn.o
[activating module `limitipconn' in /usr/local/apache/conf/httpd.conf]
cp mod_limitipconn.so 
/usr/local/apache/libexec/mod_limitipconn.so
chmod 755 /usr/local/apache/libexec/mod_limitipconn.so
cp /usr/local/apache/conf/httpd.conf
    /usr/local/apache/conf/httpd.conf.bak
cp /usr/local/apache/conf/httpd.conf.new
    /usr/local/apache/conf/httpd.conf
rm /usr/local/apache/conf/httpd.conf.new

修改配置文件:
全局控制,在httpd.conf加上以下幾行:
<IfModule mod_limitipconn.c>
    <Location /> # 所有虛擬主機的/目錄
        MaxConnPerIP 3 # 每IP只允許3個並發連接
        NoIPLimit image/* # 對圖片不做IP限制
    </Location>
    <Location /mp3> # 所有主機的/mp3目錄
        MaxConnPerIP 1 # 每IP只允許一個連接請求
        OnlyIPLimit audio/mpeg video # 該限制只對視頻和音頻格式的文件
    </Location>
</IfModule>
局部限制,你也可以在虛擬主機的配置文件里設置IP限制,方法是完全一樣:
<VirtualHost xx.xxx.xx.xx>
    ServerAdmin chenlf@chinalinuxpub.com
    DocumentRoot /home/my
    ServerName www.my.com
    <IfModule mod_limitipconn.c>
        <Location /> # 所有虛擬主機的/目錄
            MaxConnPerIP 5 # 每IP只允許3個並發連接
            NoIPLimit image/* # 對圖片不做IP限制
        </Location>
        <Location /mp3> # 所有主機的/mp3目錄
            MaxConnPerIP 2 # 每IP只允許一個連接請求
            OnlyIPLimit audio/mpeg video # 該限制只對視頻和音頻格式的文件
        </Location>
    </IfModule>
    ErrorLog /home/my/logs/error_log
    CustomLog /home/my/logs/access_log common
</VirtualHost>
此外必須將 apache 的 ExtendedStatus 設置為ON。
在httpd.conf找到 # ExtendedStatus On 去掉前面的注釋即可。

好了,全部配置結束,重起apache就可以生效了。

http://blog.penner.cn/2005/04/17/restrict-connect-number-from-every-virtualhost-under-apache.html

查看 Apache並發請求數及其TCP連接狀態

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 2000
MaxRequestsPerChild 10000
查看httpd進程數(即prefork模式下Apache能夠處理的並發請求數):
Linux命令:
ps -ef | grep httpd | wc -l
返回結果示例:
1388
表示 Apache能夠處理1388個並發請求,這個值Apache可根據負載情況自動調整,我這組服務器中每台的峰值曾達到過2002。
查看Apache的並發請求數及其TCP連接狀態:
Linux命令:
netstat -n | awk ‘/^tcp/ { S[$NF]} END {for(a in S) print a, S[a]}’
(這條語句是從新浪互動社區事業部技術總監王老大那兒獲得的,非常不錯)
返回結果示例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待處理的請求數;ESTABLISHED表示正常數據傳輸狀態;TIME_WAIT表示處理完畢,等待超時結束的請求數。
關於TCP狀態的變遷,可以從下圖形象地看出:
狀態:描述
CLOSED:無連接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個連接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個連接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM