专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »web服务器 » 创建长效机制:Apache中预创建Preforking MPM机制剖析( 2) »正文

创建长效机制:Apache中预创建Preforking MPM机制剖析( 2)

来源: 发布时间:星期三, 2009年9月2日 浏览:4次 评论:0
6.3.3.3主服务进程管理
6.3.3.3.1主服务进程概述
所有MPM都是从ap_mpm_run开始执行对此预创建MPM也不例外 ap_mpm_run通常由代码
6.3.3.3.2主服务进程概述
ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)
{
    index;
    reing_children_to_start;
    apr_status_t rv;
 
    ap_log_pid(pconf, ap_pid_fname);
对于所有Apache MPM而言其应该首先完成工作就是在文件pidfile中记录进程ID启动和终止Apache默认脚本通常会读取pidfile文件从中查找所有记录进程然后逐个终止它因此如果不进行记录启动这些进程可能无法通过脚本进行终止这项操作进行越快越好
   first_server_limit= server_limit;
    (changed_limit_at_restart) {
        ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
                     "WARNING: Attempt to change ServerLimit "
                     "ignored during restart");
        changed_limit_at_restart = 0;
    }
理解上面这段代码关键在于理解两个变量first_server_limit和changed_limit_at_restart作用
server_limit变量用以记录服务器内允许同时存在子服务进程数目用过通过配置文件中 ServerLimit指令可以修改这个值当每次Apache启动时候通过读取配置文件这个指令参数值最终保存到了server_limit变量中并影响服务器进程产生由于当Apache重新启动(restart)时候也会读取配置文件因此如果服务器重新启动的前修改了配置文件中 ServerLimit指令参数那么毫无疑问这种变化Apache重启时候肯定会看到那么Apache该如何处理这种变化呢?是使用新 server_limit还是使用原有server_limit?Apache做法是不允许在重启时候修改server_limit值即使你修改了Apache也会忽略
为了能够检查出这种修改在Apache第次启动时候ServerLimit值就被记录在 first_server_limit变量中在整个Apache运行期间即使重新启动这个值也不会变化 first_server_limit=server_limit就是保存
按正常处理策略对于每次重启后都应该把server_limit和first_server_limit值进行比较判断是否发生变化如果发生变化就给出警告但是上面代码中并没有这种比较那么比较在哪儿发生呢?钥匙在 change_limit_at_restart变量上当重新启动后读取配置文件时候遇到ServerLimit指令会 _server_limit处理该指令中会将指令参数后面值和first_server_limit进行比较:
    tmp_server_limit;
    tmp_server_limit = atoi(arg);//ServerLimit指令后参数值
    (first_server_limit &&tmp_server_limit != server_limit) {
        changed_limit_at_restart = 1;
        NULL;
    }
    server_limit = tmp_server_limit;
从上面代码中可以看出changed_limit_at_restart反映了ServerLimit在重启期间是否发生了更改对于这种更改Apache并不理会只是简单警告并将changed_limit_at_restart设置为零这样下次重启就不要进行判断了
    /* Initialize cross-process accept lock */
    ap_lock_fname = apr_psprf(_pconf, "%s.%" APR_PID_T_FMT,
                                 ap_server_root_relative(_pconf, ap_lock_fname),
                                 ap_my_pid);
 
    rv = apr_proc_mutex_create(&accept_mutex, ap_lock_fname,
                               ap_accept_lock_mech, _pconf);
    (rv != APR_SUCCESS) {
        ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
                     "Couldn't create accept lock (%s) (%d)",
                     ap_lock_fname, ap_accept_lock_mech);
        mpm_state = AP_MPMQ_STOPPING;
        1;
    }
 
# APR_USE_SYSVSEM_SERIALIZE
    (ap_accept_lock_mech APR_LOCK_DEFAULT ||
        ap_accept_lock_mech APR_LOCK_SYSVSEM) {
#
    (ap_accept_lock_mech APR_LOCK_SYSVSEM) {
#end
        rv = unixd__proc_mutex_perms(accept_mutex);
        (rv != APR_SUCCESS) {
            ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s,
                         "Couldn't permissions _disibledevent=>                         "check User and Group directives");
            mpm_state = AP_MPMQ_STOPPING;
            1;
        }
    }

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: