,MaxRequestsPerChild 1000,
“,,这将限制每个子进程处理的请求数量,当达到指定数量时,子进程将自动退出。令Apache中沉睡的无用进程自动退出的方法
在Apache服务器运行过程中,特别是使用Prefork模式时,系统会在启动时创建一些worker进程来准备接收请求,这些worker进程在完成准备工作后进入block模式的监听状态,等待请求的到来,当请求高峰期过后,如果额外的worker进程数量超过了MaxSpareServers的限制,Apache会发出信号让这些进程退出,这些进程可能正处于沉睡状态,不会主动读取退出信号,为了唤醒它们并使其退出,Apache会向自己发送一个OPTIONS请求。
具体步骤
1、发送退出状态字:Apache会首先发送一个退出状态字(GRACEFUL_CHAR !)给这些worker进程,代码如下:
“`c
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进程不会去读这些状态字,因为它们还在沉睡。
2、发送OPTIONS请求:为了唤醒这些沉睡中的进程,Apache会向自己发送一个OPTIONS请求,代码如下:
“`c
static apr_status_t dummy_connection(ap_pod_t *pod) {
//…有省略
/* Create the request string. We include a UserAgent so that administrators can track down the cause of the oddlooking requests in their logs. */
srequest = apr_pstrcat(p, "OPTIONS * HTTP/1.0r
UserAgent: ", ap_get_server_banner(), " (internal dummy connection)r
r
", NULL);
//…有省略
}
“`
这些进程在处理完当前请求(OPTIONS请求)后,会发现主进程已经发出退出信号,于是它们就会进行清理工作并自我退出。
3、处理请求后的退出检查:在worker进程处理完请求后,会检查是否需要退出,代码如下:
“`c
static void child_main(int child_num_arg) {
//…有省略
while (!die_now && !shutdown_pending) {
//…有省略
if (ap_mpm_pod_check(pod) == APR_SUCCESS) { /* selected as idle? */
die_now = 1;
}
//…有省略
}
}
“`
FAQs
1、问:为什么需要通过发送OPTIONS请求来唤醒沉睡的进程?
答:因为沉睡的进程不会主动读取退出信号,所以需要通过发送OPTIONS请求来唤醒它们,使它们能够处理退出信号并完成自我清理和退出。
2、问:如何查看Apache的worker进程是否成功退出?
答:可以通过查看Apache的日志文件(如Access Log和Error Log)来确认worker进程是否已经成功退出,你会看到类似“OPTIONS * HTTP/1.0”的访问日志条目,表示worker进程正在处理内部请求并准备退出。
3、问:如何优化Apache的配置以减少无用进程的产生?
答:可以通过调整MaxSpareServers、MinSpareServers和MaxClients等参数来优化Apache的配置,降低MaxSpareServers的值可以减少备用进程的数量,从而减少无用进程的产生,合理设置MaxClients参数可以确保在高峰期有足够的worker进程来处理请求,而在低谷期则不会产生过多的闲置进程。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1098747.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复