令A(yù)pache中沉睡的無(wú)用進(jìn)程自動(dòng)退出的方法
在Apache的Access Log中會(huì)看到很多如下的訪問(wèn)日志:
127.0.0.1 - - [05/May/2011:10:54:07 +0800] "OPTIONS * HTTP/1.0" 200 -
127.0.0.1 - - [05/May/2011:10:54:08 +0800] "OPTIONS * HTTP/1.0" 200 -
127.0.0.1 - - [05/May/2011:10:54:09 +0800] "OPTIONS * HTTP/1.0" 200 -
127.0.0.1 - - [05/May/2011:10:54:10 +0800] "OPTIONS * HTTP/1.0" 200 -
在Apache Prefork模式下, 啟動(dòng)的時(shí)候,Apache就會(huì)fork出一些worker進(jìn)程, 來(lái)準(zhǔn)備接受請(qǐng)求, 這些worker進(jìn)程,在完成準(zhǔn)備工作以后, 就會(huì)進(jìn)入block模式的監(jiān)聽(tīng)沉睡中, 等待請(qǐng)求到來(lái)而被喚醒。
另外一方面, 在Prefork模式下, 當(dāng)請(qǐng)求很多, 目前的worker進(jìn)程數(shù)不夠處理的時(shí)候, 就會(huì)額外再fork一些worker進(jìn)程出來(lái), 以滿足當(dāng)前的請(qǐng)求。
而在這些請(qǐng)求高峰過(guò)后, 如果額外fork出來(lái)的進(jìn)程數(shù)大于了MaxSpareServers, Apache就會(huì)告訴這些worker進(jìn)程退出, 那么問(wèn)題就來(lái)了。
這些進(jìn)程都在沉睡中啊, 怎么告訴他們, 并且讓他們自我退出呢?
Apache會(huì)首先發(fā)送一個(gè)退出狀態(tài)字(GRACEFUL_CHAR !)給這些Work進(jìn)程:
{
apr_status_t rv;
char char_of_death = '!';
apr_size_t one = 1;
rv = apr_file_write(pod->pod_out, &char_of_death, &one);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf,
"write pipe_of_death");
}
return rv;
}
但此時(shí), Worker進(jìn)程不會(huì)去讀這些狀態(tài)字, 因?yàn)樗麄冞€在沉睡。
這個(gè)時(shí)候Apache就會(huì)發(fā)送一個(gè)OPTIONS請(qǐng)求給自己, 喚醒這些沉睡的進(jìn)程:
{
//...有省略
/* Create the request string. We include a User-Agent so that
* adminstrators can track down the cause of the odd-looking
* requests in their logs.
*/
srequest = apr_pstrcat(p, "OPTIONS * HTTP/1.0\r\nUser-Agent: ",
ap_get_server_banner(),
" (internal dummy connection)\r\n\r\n", NULL);
//...有省略
}
這些進(jìn)程在處理完當(dāng)前請(qǐng)求以后(OPTIONS請(qǐng)求), 就會(huì)發(fā)現(xiàn), oh, 主進(jìn)程讓我退出。
{
//...有省略
while (!die_now && !shutdown_pending) {
//...有省略
//1. listen
//2. accept
//3. process request
/* Check the pod and the generation number after processing a
* connection so that we'll go away if a graceful restart occurred
* while we were processing the connection or we are the lucky
* idle server process that gets to die.
*/
if (ap_mpm_pod_check(pod) == APR_SUCCESS) { /* selected as idle? */
die_now = 1;
}
//...有省略
}
//...有省略
}
于是, 它就做完清理工作, 然后自我消亡了~~~
相關(guān)文章
Apache虛擬主機(jī)的配置和泛域名解析實(shí)現(xiàn)代碼
Apache虛擬主機(jī)的配置和泛域名解析實(shí)現(xiàn)代碼,需要的朋友可以參考下2012-03-03
Vmvare虛擬機(jī)給ubuntu根目錄分區(qū)介紹
大家好,本篇文章主要講的是Vmvare虛擬機(jī)給ubuntu根目錄分區(qū)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
CentOS 7 安裝 MySQL 5.6遇到的各種問(wèn)題小結(jié)
在一測(cè)試服務(wù)器(CentOS Linux release 7.2.1511)上安裝MySQL 5.6(5.6.19 MySQL Community Server)時(shí)遇到了很多奇葩問(wèn)題,今天小編給大家總結(jié)了關(guān)于entOS 7 安裝 MySQL 5.6遇到的各種問(wèn)題,需要的朋友一起看看吧2016-11-11

