令Apache中沉睡的无用进程自动退出的方法
作者:Laruence 发布时间:2023-08-18 05:37:39
在Apache的Access Log中会看到很多如下的访问日志:
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模式下, 启动的时候,Apache就会fork出一些worker进程, 来准备接受请求, 这些worker进程,在完成准备工作以后, 就会进入block模式的监听沉睡中, 等待请求到来而被唤醒。
另外一方面, 在Prefork模式下, 当请求很多, 目前的worker进程数不够处理的时候, 就会额外再fork一些worker进程出来, 以满足当前的请求。
而在这些请求高峰过后, 如果额外fork出来的进程数大于了MaxSpareServers, Apache就会告诉这些worker进程退出, 那么问题就来了。
这些进程都在沉睡中啊, 怎么告诉他们, 并且让他们自我退出呢?
Apache会首先发送一个退出状态字(GRACEFUL_CHAR !)给这些Work进程:
static apr_status_t pod_signal_internal(ap_pod_t *pod)
{
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;
}
但此时, Worker进程不会去读这些状态字, 因为他们还在沉睡。
这个时候Apache就会发送一个OPTIONS请求给自己, 唤醒这些沉睡的进程:
static apr_status_t dummy_connection(ap_pod_t *pod)
{
//...有省略
/* 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);
//...有省略
}
这些进程在处理完当前请求以后(OPTIONS请求), 就会发现, oh, 主进程让我退出。
static void child_main(int child_num_arg)
{
//...有省略
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;
}
//...有省略
}
//...有省略
}
于是, 它就做完清理工作, 然后自我消亡了~~~


猜你喜欢
- 1、服务器必须支持URL重写。2、后台开启伪静态。3、栏目设置使用动态。4。添加文档时选择使用动态浏览。5。需要修改php文件include
- All-in-One的Mac平台WEB服务器4DWebSTARV是一款MAC平台的多功能服务器软件包,它包含了WEB,FTP,WebdAV和
- 今天我们来介绍Godaddy主机用户怎样使用Hosting Control Center的File Manager从托管帐户删除某个文档?
- 在上周日的WordCamp蒙特利尔会议中,WordPress创始人Matt Mullenweg回答了一系列问题,其中包括了WordPress
- WordPress系统本身,默认安装的情况下使用默认模板,实际上对搜索引擎并不友好,并没有针对搜索引擎进行很好的设计,下面我介绍一些方法可以
- 昨天参加“中国·西部电子商务高峰论坛”的国内外电子商务企业高层像商量好似的,每
- 第十七届万维网大会(WWW2008)结束招待晚宴在北京人民大会堂举行,昨晚,来自全球的互联网界精英悉数出席。百度总裁李彦宏在晚宴中致辞,并在
- baidu好象最近又在跳舞了,动作之大,动作之频繁,可以说是史无前例。我新上的站,第一天25页,第二天70页,第三天1页,另外一个站第一天2
- 我是2004年开始进入站长圈,几年下来,做了不下20个站,主题更是五花八门,往往是想到什么词热就不假思索的动手,手上的米更多,被K的,PR3
- 若觉得系统慢想换源的在另一篇文章有做整理https://blog.csdn.net/luguodehua/article/details/7
- 北京时间11月18日消息,据国外媒体报道,科技博客Techcrunch作者MG·斯格勒(MG Siegler)周二撰文
- 网站权重,是搜索引擎给网站(包括网页)赋予一定的权威值,对网站(含网页)权威的评估评价,一个网站权重越高,在搜索引擎所占的份量越大,在搜索引
- 一、AIDEAIDE(Advanced Intrusion Detection Environment)是一款针对文件和目录进行完整性对比检
- ../ 【站点上级目录】 //如果要使用后台的目录相关的功能需要有列出目录的权限 //0444 /&
- 很多人都使用BSP(博客托管服务)来托管自己的博客,在选择中国服务商的时候,需要考虑很多因素,其中第一重要的就应该是网站稳定性,毕竟,如果人
- 1、下载镜像docker pull selenium/hubdocker pull selenium/node-firefoxdocker
- var Ajaxs = new Array(); function Ajax(
- 没有流量的网站是失败的,倒不是说网站制作的失败,而是指网站运营的失败,所以如何做大流量,是每个站长都孜孜以求的。网站的流量推广,经验很重要,
- 前言本文是主要是记录CentOS 6.7系统下安装JDK7的过程记录,下面话不多说,来一起看看吧。方法如下:1、上Oracle官方下载最新的
- CNET科技资讯网 3月3日 北京报道(文/张丹):雅虎全球与微软的联姻获批,使得搜索市场谷歌一家独大的不利市场局面获得转机。然而雅虎这家拥