<div dir="ltr"><div>Hi,</div><div><br></div><div>For testing quick termination during high loads, while running with valgrind, it might be useful to be able to extend the amount of time nginx allows child processes to wrap up before sending SIGKILL.</div><div>For ngx_pagespeed, the current hard-coded default of 1 second seems to be just short of what we need to be able to reliably test just this scenario, so I've made a patch so we can run with different values for with and without valgrind. </div><div>Would the following patch be acceptable?</div><div><br></div><div>Kind regards,</div><div><br></div><div>Otto</div><div><br></div><div><br></div><div># HG changeset patch</div><div># User Otto van der Schaaf <<a href="mailto:oschaaf@we-amp.com">oschaaf@we-amp.com</a>></div><div># Date 1427138606 -3600</div><div>#      Mon Mar 23 20:23:26 2015 +0100</div><div># Node ID 92c9d38d7677b5f646112cde94dc40d834d5ef74</div><div># Parent  b6eb6ec4fbd9807d75de071fffb000c4f3a5c57d</div><div>Add configuration option for the timeout for childs handling SIGTERM.</div><div><br></div><div>Adds a configuration option (child_terminate_timeout) to allow tweaking</div><div>the amount of time nginx allows child processes before sending SIGKILL.</div><div>This is helpful for testing termination with higher loads under valgrind,</div><div>as the hard-coded default (1000 ms) might not always be enough.</div><div><br></div><div>diff -r b6eb6ec4fbd9 -r 92c9d38d7677 src/core/nginx.c</div><div>--- a/src/core/nginx.c  Mon Mar 23 21:09:19 2015 +0300</div><div>+++ b/src/core/nginx.c  Mon Mar 23 20:23:26 2015 +0100</div><div>@@ -125,6 +125,13 @@</div><div>       offsetof(ngx_core_conf_t, rlimit_sigpending),</div><div>       NULL },</div><div> </div><div>+    { ngx_string("child_terminate_timeout"),</div><div>+      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,</div><div>+      ngx_conf_set_msec_slot,</div><div>+      0,</div><div>+      offsetof(ngx_core_conf_t, child_terminate_timeout),</div><div>+      NULL },</div><div>+</div><div>     { ngx_string("working_directory"),</div><div>       NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,</div><div>       ngx_conf_set_str_slot,</div><div>@@ -955,6 +962,7 @@</div><div>     ccf->rlimit_nofile = NGX_CONF_UNSET;</div><div>     ccf->rlimit_core = NGX_CONF_UNSET;</div><div>     ccf->rlimit_sigpending = NGX_CONF_UNSET;</div><div>+    ccf->child_terminate_timeout = NGX_CONF_UNSET_MSEC;</div><div> </div><div>     ccf->user = (ngx_uid_t) NGX_CONF_UNSET_UINT;</div><div>     ccf->group = (ngx_gid_t) NGX_CONF_UNSET_UINT;</div><div>@@ -985,6 +993,7 @@</div><div> </div><div>     ngx_conf_init_value(ccf->worker_processes, 1);</div><div>     ngx_conf_init_value(ccf->debug_points, 0);</div><div>+    ngx_conf_init_value(ccf->child_terminate_timeout, 1000);</div><div> </div><div> #if (NGX_HAVE_CPU_AFFINITY)</div><div> </div><div>diff -r b6eb6ec4fbd9 -r 92c9d38d7677 src/core/ngx_cycle.h</div><div>--- a/src/core/ngx_cycle.h      Mon Mar 23 21:09:19 2015 +0300</div><div>+++ b/src/core/ngx_cycle.h      Mon Mar 23 20:23:26 2015 +0100</div><div>@@ -85,6 +85,7 @@</div><div>      ngx_int_t                rlimit_sigpending;</div><div>      off_t                    rlimit_core;</div><div> </div><div>+     ngx_msec_t               child_terminate_timeout;</div><div>      int                      priority;</div><div> </div><div>      ngx_uint_t               cpu_affinity_n;</div><div>diff -r b6eb6ec4fbd9 -r 92c9d38d7677 src/os/unix/ngx_process_cycle.c</div><div>--- a/src/os/unix/ngx_process_cycle.c   Mon Mar 23 21:09:19 2015 +0300</div><div>+++ b/src/os/unix/ngx_process_cycle.c   Mon Mar 23 20:23:26 2015 +0100</div><div>@@ -189,7 +189,7 @@</div><div> </div><div>             sigio = ccf->worker_processes + 2 /* cache processes */;</div><div> </div><div>-            if (delay > 1000) {</div><div>+            if (delay > ccf->child_terminate_timeout) {</div><div>                 ngx_signal_worker_processes(cycle, SIGKILL);</div><div>             } else {</div><div>                 ngx_signal_worker_processes(cycle,</div></div>