windows 2003+IIS6中優(yōu)化fastcgi配置文件fcgiext.ini,減少php-cgi.exe進(jìn)程數量和所占內存大小
本來(lái)聽(tīng)說(shuō)fastcgi比isapi好就在服務(wù)器中裝上了,配置環(huán)境為windows 2003+IIS6+fastcgi(FCGI)+PHP5.2.17,經(jīng)過(guò)與很長(cháng)一段時(shí)間觀(guān)察,發(fā)現工作在FastCGI模式下的PHP會(huì )占用越來(lái)越多的內存,訪(fǎng)問(wèn)量稍微多點(diǎn)php-cgi進(jìn)程就多了N個(gè),同樣情況下能比原來(lái)用isapi模式的時(shí)候多出幾百M,我的服務(wù)器內存只有2G傷不起啊。
我在網(wǎng)上搜索了一下,發(fā)現還有不少人面臨同樣的問(wèn)題。來(lái)自PHP官方的一個(gè)比較正式的解釋是:php-cgi進(jìn)程并沒(méi)有內存泄漏,php-cgi會(huì )在每個(gè)請求結束的時(shí)候回收腳本使用的全部?jì)却?,但是并不?huì )釋放給操作系統,而是繼續持有以應對下一次PHP請求。這樣做大概是為了減少內存碎片化或者解決從系統申請內存之后又釋放回操作系統所需要的時(shí)間不可控問(wèn)題??墒侨绻既灰淮蜳HP請求使用了諸如ftp或者zlib這樣的大內存操作,那么將導致一大塊系統內存被php-cgi持續占有,不能被利用。
解決這個(gè)問(wèn)題的辦法是在web服務(wù)器配置中優(yōu)化fastcgi配置文件參數。
在C:\WINDOWS\system32\inetsrv\fcgiext.ini 文件中可以設定php-cgi進(jìn)程相關(guān)參數,如:
[Types]
php = PHP
[PHP]
ExePath=C:\php-5.3.8-nts-Win32-VC9-x86\php-cgi.exe
maxInstances=100
InstanceMaxRequests=10000
EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000
RequestTimeout=600
ActivityTimeout=900
在上面的配置中:
ExePath 指定了FastCGI解析程序的路徑,
instanceMaxRequests 指定了每個(gè)實(shí)例可以處理的最大請求數,
maxInstances 指定可以啟動(dòng)的最大實(shí)例數目,
EnvironmentVars 創(chuàng )建了一個(gè)環(huán)境變量 PHP_FCGI_MAX_REQUESTS ,默認值設為10000,
requestTimeout 指定了請求的超時(shí)時(shí)間為600秒,
activityTimeout 指定了活動(dòng)會(huì )話(huà)超時(shí)時(shí)間為900秒。
一下是建議值:
maxInstances=
把這個(gè)值改小
512M 內存的改maxInstances=50
1G 內存的改maxInstances=80
2G 內存的改maxInstances=140
再修改
InstanceMaxRequests=
把這個(gè)值改小
512M 內存的改InstanceMaxRequests=200
1G 內存的改InstanceMaxRequests=300
2G 內存的改InstanceMaxRequests=500
改完, 重啟IIS。
instanceMaxRequests PHP_FCGI_MAX_REQUESTS 這兩個(gè)參數決定了一個(gè)php-cgi進(jìn)程被創(chuàng )建出來(lái)之后,最多接受的PHP請求數,在lighttpd中默認配置是10000。也就是說(shuō)這個(gè)php-cgi進(jìn)程每接受10000次PHP請求后會(huì )終止,釋放所有內存,并重新被管理進(jìn)程啟動(dòng)。如果把它降低,比如改成100,那么php-cgi重啟的周期會(huì )大大縮短,偶然的高內存操作造成的問(wèn)題影響時(shí)間也會(huì )縮短。
maxInstances 這個(gè)參數指定可以啟動(dòng)的最大實(shí)例數目,即php-cgi.exe進(jìn)程的數目。如果把它降低,比如改成100,那么在任務(wù)管理器的進(jìn)程中最多只有php-cgi.exe進(jìn)程,php-cgi.exe所占用的總內存將大大減少。
我現在用的服務(wù)器為windows 2003操作系統,4G內存,一個(gè)php-cgi.exe程序占用7-25M內存,我把maxInstances值調為300,減少了php-cgi.exe進(jìn)程的總數量,占用內存也減小了,反應速度比以前快了不少,至少調整到多少,可根據您的站點(diǎn)訪(fǎng)問(wèn)量來(lái)決定。
在WIN2008的IIS7上使用FASTCGI調用PHP-CGI.EXE,默認只有4個(gè)進(jìn)程,這樣對于大流量的網(wǎng)站為說(shuō),進(jìn)程數不足帶來(lái)的進(jìn)程排隊現象十分嚴重,解決方案如下。
32位系統 http://www.iis.net/Downloads/files/AdminPack/TP2/AdminPack_x86.msi
64位系統 http://www.iis.net/Downloads/files/AdminPack/TP2/AdminPack_amd64.msi
下載如下工具,安裝后,如下圖。
添加
PHP_FCGI_MAX_REQUESTS = 10000
添加后,不用重啟IIS,就能在進(jìn)程管理器看到效果。
似乎并沒(méi)有達到設定的值,不過(guò)瀏覽網(wǎng)站明顯感覺(jué)到性能的提示。
內存占用~~ 其實(shí)微軟的系統有一個(gè)不好處在于, 服務(wù)器的內存占用,要盡量讓服務(wù)去使用,而并不像客戶(hù)端使用一樣,留足夠多的內存給用戶(hù)的應用程序。
我在這里要提醒大家注意的是以下兩個(gè)參數值得設置:
InstanceMaxRequests:fastcgi進(jìn)程(php-fcgi.exe)能處理的最大請求數,超過(guò)了就要回收,默認是200
PHP_FCGI_MAX_REQUESTS:php自身控制的最大請求數,默認是500
既然要用fastcgi去運行cgi,那肯定是不想php自身去限制最大請求數??!
所以,一定要保證InstanceMaxRequests小于 或 等于 PHP_FCGI_MAX_REQUESTS,這樣php自身永遠沒(méi)有機會(huì )去回收進(jìn)程。
可以看micorsoft說(shuō)的:
Make sure that FastCGI always recycles Php-cgi.exe processes before native PHP recycling starts. The configuration property instanceMaxRequests controls the FastCGI process-recycling behavior. This property specifies how many requests FastCGI will process before recycling. PHP also has a similar process-recycling functionality that is controlled by the environment variable PHP_FCGI_MAX_REQUESTS. By setting instanceMaxRequests to a value that is smaller than or equal to PHP_FCGI_MAX_REQUESTS, you can make sure that the native PHP process-recycling logic will never start.
使用iis服務(wù)器中經(jīng)常會(huì )出現php-cgi.exe進(jìn)程過(guò)多,導致CPU占用100%,最終造成網(wǎng)站運行過(guò)慢甚至卡死的情況,重啟iis會(huì )好一會(huì ),過(guò)一段時(shí)間久出現這種情況,為什么會(huì )出現這種情況呢,應該怎么解決呢,開(kāi)始的時(shí)候我一直手動(dòng)結束php-cgi程序,雖然可以臨時(shí)解決問(wèn)題,但是不是長(cháng)久之計,我百度了下,出現該問(wèn)題一般為程序方面問(wèn)題,如程序采用fastcgi方式運行PHP,而程序設置的StartProcesses又偏大,如6甚至更大。下面是我整理的對php-cgi.ext過(guò)多引起服務(wù)器cup%的解決方法,希望對大家有幫助;大多數情況是發(fā)生在第四項上;
解決參考:
1.檢查系統盤(pán)空間。查看系統臨時(shí)文件是否過(guò)多,mysql數據庫的臨時(shí)文件默認存到了c:/windows/temp,導致累積了幾萬(wàn)甚至上百萬(wàn)的小文件,壓垮系統盤(pán)。
del *.* 刪除所有文件
如果上面的命令不夠強悍,可以使用下面的代碼
del /f /q /s tmp\*.*
2.PHP是一種廣泛使用的動(dòng)態(tài)腳本語(yǔ)言,不過(guò)在IIS中并沒(méi)有內置對PHP語(yǔ)言的支持,因此如果需要使用PHP,必須自行安裝。PHP可以安裝為CGI模式或者ISAPI模式,由于ISAPI模式具有更高的性能,因此我建議大家使用ISAPI模式。
3.如能修改程序,建議將程序配置文件中的StartProcesses值縮到2,看是否改善。
4.看是否服務(wù)器有問(wèn)題攻擊現象。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站