On Wed, May 30, 2018 at 07:52:10PM -0400, larsn wrote: > День добрый. > Столкнулся с высоким потреблением CPU при добавлении в конфиге апстримов > директивы zone. > Как было до > > upstream backend { > server server1:8080 weight=860; > server server2:8080 weight=860; > server server3:8080 weight=860; > ..... > } > > Как стало после > > upstream backend { > zone upstream_backend 1m; > server server1:8080 weight=860; > server server2:8080 weight=860; > server server3:8080 weight=860; > ..... > } > > При значительной нагрузке потребление CPU взлетает неимоверно. > Стоит отметить, что upstream серверов в данной группе достаточно много. > Около 2000 штук. > Может ли это быть связано с rw локами шаренной памяти?
Интересует вывод "uname -a", "cat /proc/cpuinfo", "nginx -V". Сколько рабочих процессов в nginx? Какой балансировщик в upstream backend? Просьба протестировать Вашу конфигурацию с одним из балансировщиков ip_hash или hash (неконсистентный), патч ниже должен помочь: # HG changeset patch # User Ruslan Ermilov <r...@nginx.com> # Date 1527775383 -10800 # Thu May 31 17:03:03 2018 +0300 # Node ID 927cb2e79ea0ab79dae171325f3203601bbd0962 # Parent 760df963f0e03ff300cf1bc1a81d4745730457b0 Upstream: improved peer selection concurrency for hash and ip_hash. diff --git a/src/http/modules/ngx_http_upstream_hash_module.c b/src/http/modules/ngx_http_upstream_hash_module.c --- a/src/http/modules/ngx_http_upstream_hash_module.c +++ b/src/http/modules/ngx_http_upstream_hash_module.c @@ -176,7 +176,7 @@ ngx_http_upstream_get_hash_peer(ngx_peer ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, "get hash peer, try: %ui", pc->tries); - ngx_http_upstream_rr_peers_wlock(hp->rrp.peers); + ngx_http_upstream_rr_peers_rlock(hp->rrp.peers); if (hp->tries > 20 || hp->rrp.peers->single) { ngx_http_upstream_rr_peers_unlock(hp->rrp.peers); @@ -228,6 +228,8 @@ ngx_http_upstream_get_hash_peer(ngx_peer goto next; } + ngx_http_upstream_rr_peer_lock(hp->rrp.peers, peer); + ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, "get hash peer, value:%uD, peer:%ui", hp->hash, p); @@ -250,6 +252,8 @@ ngx_http_upstream_get_hash_peer(ngx_peer next: + ngx_http_upstream_rr_peer_unlock(hp->rrp.peers, peer); + if (++hp->tries > 20) { ngx_http_upstream_rr_peers_unlock(hp->rrp.peers); return hp->get_rr_peer(pc, &hp->rrp); @@ -268,6 +272,7 @@ ngx_http_upstream_get_hash_peer(ngx_peer peer->checked = now; } + ngx_http_upstream_rr_peer_unlock(hp->rrp.peers, peer); ngx_http_upstream_rr_peers_unlock(hp->rrp.peers); hp->rrp.tried[n] |= m; 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 @@ -161,7 +161,7 @@ ngx_http_upstream_get_ip_hash_peer(ngx_p /* TODO: cached */ - ngx_http_upstream_rr_peers_wlock(iphp->rrp.peers); + ngx_http_upstream_rr_peers_rlock(iphp->rrp.peers); if (iphp->tries > 20 || iphp->rrp.peers->single) { ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); @@ -201,6 +201,8 @@ ngx_http_upstream_get_ip_hash_peer(ngx_p ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, "get ip hash peer, hash: %ui %04XL", p, (uint64_t) m); + ngx_http_upstream_rr_peer_lock(iphp->rrp.peers, peer); + if (peer->down) { goto next; } @@ -220,6 +222,8 @@ ngx_http_upstream_get_ip_hash_peer(ngx_p next: + ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); + if (++iphp->tries > 20) { ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); return iphp->get_rr_peer(pc, &iphp->rrp); @@ -238,6 +242,7 @@ ngx_http_upstream_get_ip_hash_peer(ngx_p peer->checked = now; } + ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); iphp->rrp.tried[n] |= m; _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru