2016-10-31 317 views
1

我正在負載測試有docker容器中運行nginx和postgrest的t2.micro框。 Nginx在postgrest之前充當代理。 如果我直接到上游(postgrest)我得到一個不錯的圖形(約900/RPS峯) 如果我的經歷,nginx的,我得到這樣的圖形nginx反向代理的吞吐量週期性下降,它可能是什麼?

enter image description here

的CPU是不是最大值(僅約50%)

這是使用的nginx配置。所有被評論的內容都已經嘗試過,沒有任何影響。我也玩過worker_connections的價值觀和相關的東西。 這種週期性下降是由什麼引起的?

 
    worker_processes 2; 

    #worker_rlimit_nofile    2048; 
    events { 
     # multi_accept     on; 
     worker_connections    1024; 
     use        epoll; 
    } 
    http { 
     resolver 127.0.0.11 ipv6=off; 
     include mime.types; 
     #tcp_nodelay      off; 
     #tcp_nopush      on; 
     upstream postgrest { 
      server postgrest:3000; 
      keepalive 64; 
     } 
     server { 
      listen  80; 
      server_name localhost; 
      charset utf-8; 

      location /rest/ { 
       default_type application/json; 
       #proxy_buffering off; 
       proxy_pass http://postgrest/; # Reverse proxy to your PostgREST 
      } 
     } 
    } 
+0

的延遲曲線圖也很有趣,它停留在10ms左右,直到首次下降,則跳轉到1s左右,大多保持在那裏,鏡像位吞吐量圖,但它不來回到10ms。 也沒有錯誤,每個請求是200 OK –

+0

一個新的發展。如果我使容器使用主機網絡,則性能會更差,下降幾乎爲0. 任何人都知道如何比較主機與網橋模式的網絡設置,以查看哪些參數不同? –

回答

1

罪魁禍首是(默認)內核tcp設置。 當通過該系統使用了所有的本地端口的nginx代理會那麼一切都停止了,直到舊的TCP連接,可以完全關閉(他們在TIME_WAIT 60秒)(下降) 調整這些設置後,問題

#tcp settings 
net.core.somaxconn 
net.ipv4.tcp_fin_timeout 
net.ipv4.tcp_tw_reuse 
net.ipv4.ip_local_port_range 

#nginx configs 
proxy_set_header Connection ""; 
proxy_http_version 1.1; 

以下文章詳細介紹了究竟發生了什麼,調整的參數。

https://engineering.gosquared.com/optimising-nginx-node-js-and-networking-for-heavy-workloads