令Apache中沉睡的无用进程自动退出的方法

 更新时间:2015年06月19日 09:25:46   作者:Laruence  
这篇文章主要介绍了令Apache中沉睡的无用进程自动退出的方法,利用OPTIONS请求得以实现清理完成任务后的进程,需要的朋友可以参考下

在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;
            }
    //...有省略
       }
    //...有省略
    }

于是, 它就做完清理工作, 然后自我消亡了~~~

相关文章

  • Linux下如何创建SFTP账号

    Linux下如何创建SFTP账号

    这篇文章主要介绍了Linux下如何创建SFTP账号问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Centos 5下配置https服务器的方法

    Centos 5下配置https服务器的方法

    Centos 5下配置https服务器的步骤,需要的朋友可以参考下。
    2010-07-07
  • Apache虚拟主机的配置和泛域名解析实现代码

    Apache虚拟主机的配置和泛域名解析实现代码

    Apache虚拟主机的配置和泛域名解析实现代码,需要的朋友可以参考下
    2012-03-03
  • Vmvare虚拟机给ubuntu根目录分区介绍

    Vmvare虚拟机给ubuntu根目录分区介绍

    大家好,本篇文章主要讲的是Vmvare虚拟机给ubuntu根目录分区介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Linux中如何查看usb设备信息

    Linux中如何查看usb设备信息

    这篇文章主要介绍了Linux中如何查看usb设备信息问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • CentOS 7 安装 MySQL 5.6遇到的各种问题小结

    CentOS 7 安装 MySQL 5.6遇到的各种问题小结

    在一测试服务器(CentOS Linux release 7.2.1511)上安装MySQL 5.6(5.6.19 MySQL Community Server)时遇到了很多奇葩问题,今天小编给大家总结了关于entOS 7 安装 MySQL 5.6遇到的各种问题,需要的朋友一起看看吧
    2016-11-11
  • 使用 Apache 反向代理的设置技巧

    使用 Apache 反向代理的设置技巧

    这篇文章主要介绍了如何使用 Apache 设置反向代理,该模块使用ProxyApache 配置文件中的 -prefixed 指令进行配置。我们接下来会设置这些,需要的朋友可以参考下
    2022-01-01
  • centos8 安装 nginx的详细教程(图文)

    centos8 安装 nginx的详细教程(图文)

    Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,这篇文章主要介绍了centos8 安装 nginx ,需要的朋友可以参考下
    2019-11-11
  • Linux删除目录下的文件的10种方法小结

    Linux删除目录下的文件的10种方法小结

    本文是脚本之家小编给大家收藏整理的Linux删除目录下的文件的10种方法,文中还给大家提到了Linux 删除文件夹和文件的命令,具体内容详情大家参考下本文
    2018-04-04
  • ssh自动备份主机文件的脚本

    ssh自动备份主机文件的脚本

    ssh自动备份主机文件的脚本,需要的朋友可以参考下。
    2011-08-08

最新评论