[PATCH 1 of 1 RFC] Better recheck of dead upstream servers

肖涵 xiaohanhoho at gmail.com
Wed Oct 5 14:34:19 UTC 2011


recently,i begain to use nginx.1.1.4 to test upstream keepalived,but i found
it olny i must set the keepalive_timeout  X (X>0),the upstream keepalive can
work , isn't it?
2011/9/27 Maxim Dounin <mdounin at mdounin.ru>

> # HG changeset patch
> # User Maxim Dounin <mdounin at mdounin.ru>
> # Date 1317126090 -14400
> # Node ID a0fc6910248f8f92ff8b7cc1465ba3fd8cd8c52d
> # Parent  a0228f0e9fe2ad166324a80bc915ad8ec1050dcc
> Better recheck of dead upstream servers.
>
> Previously nginx used to mark backend again as live as soon as fail_timeout
> passes (10s by default) since last failure.  On the other hand, detecting
> dead backend takes up to 60s (proxy_connect_timeout) in typical situation
> "backend is down and doesn't respond to any packets".  This resulted in
> suboptimal behaviour in the above situation (up to 23% of requests were
> directed to dead backend with default settings).
>
> More detailed description of the problem may be found here (in Russian):
> http://mailman.nginx.org/pipermail/nginx-ru/2011-August/042172.html
>
> Fix is to only allow one request after fail_timeout passes, and
> mark backend as "live" only if this request succeeds.
>
> Note that with new code backend will not be marked "live" unless "check"
> request is completed, and this may take a while in some specific workloads
> (e.g. streaming).  This is believed to be acceptable.
>
> diff --git a/src/http/modules/ngx_http_upstream_ip_hash_module.c
> b/src/http/modules/ngx_http_upstream_ip_hash_module.c
> --- a/src/http/modules/ngx_http_upstream_ip_hash_module.c
> +++ b/src/http/modules/ngx_http_upstream_ip_hash_module.c
> @@ -185,8 +185,8 @@ ngx_http_upstream_get_ip_hash_peer(ngx_p
>                     break;
>                 }
>
> -                if (now - peer->accessed > peer->fail_timeout) {
> -                    peer->fails = 0;
> +                if (now - peer->checked > peer->fail_timeout) {
> +                    peer->checked = now;
>                     break;
>                 }
>             }
> diff --git a/src/http/ngx_http_upstream_round_robin.c
> b/src/http/ngx_http_upstream_round_robin.c
> --- a/src/http/ngx_http_upstream_round_robin.c
> +++ b/src/http/ngx_http_upstream_round_robin.c
> @@ -443,8 +443,8 @@ ngx_http_upstream_get_round_robin_peer(n
>                             break;
>                         }
>
> -                        if (now - peer->accessed > peer->fail_timeout) {
> -                            peer->fails = 0;
> +                        if (now - peer->checked > peer->fail_timeout) {
> +                            peer->checked = now;
>                             break;
>                         }
>
> @@ -491,8 +491,8 @@ ngx_http_upstream_get_round_robin_peer(n
>                             break;
>                         }
>
> -                        if (now - peer->accessed > peer->fail_timeout) {
> -                            peer->fails = 0;
> +                        if (now - peer->checked > peer->fail_timeout) {
> +                            peer->checked = now;
>                             break;
>                         }
>
> @@ -663,15 +663,16 @@ ngx_http_upstream_free_round_robin_peer(
>         return;
>     }
>
> +    peer = &rrp->peers->peer[rrp->current];
> +
>     if (state & NGX_PEER_FAILED) {
>         now = ngx_time();
>
> -        peer = &rrp->peers->peer[rrp->current];
> -
>         /* ngx_lock_mutex(rrp->peers->mutex); */
>
>         peer->fails++;
>         peer->accessed = now;
> +        peer->checked = now;
>
>         if (peer->max_fails) {
>             peer->current_weight -= peer->weight / peer->max_fails;
> @@ -686,6 +687,14 @@ ngx_http_upstream_free_round_robin_peer(
>         }
>
>         /* ngx_unlock_mutex(rrp->peers->mutex); */
> +
> +    } else {
> +
> +        /* mark peer live if check passed */
> +
> +        if (peer->accessed < peer->checked) {
> +            peer->fails = 0;
> +        }
>     }
>
>     rrp->current++;
> diff --git a/src/http/ngx_http_upstream_round_robin.h
> b/src/http/ngx_http_upstream_round_robin.h
> --- a/src/http/ngx_http_upstream_round_robin.h
> +++ b/src/http/ngx_http_upstream_round_robin.h
> @@ -23,6 +23,7 @@ typedef struct {
>
>     ngx_uint_t                      fails;
>     time_t                          accessed;
> +    time_t                          checked;
>
>     ngx_uint_t                      max_fails;
>     time_t                          fail_timeout;
>
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20111005/679b9c26/attachment.html>


More information about the nginx-devel mailing list