2016-12-20 186 views
1

我對Nginx有一些性能問題。Nginx性能問題

我有一個Nginx服務器坐在4個node.js應用程序前面。節點應用程序不會做任何事情,它只是通過expressJS堆棧循環,並且不訪問任何外部數據庫源等。

我正在使用ApacheBench來獲取我的應用程序如何執行的基準。當我在我的upstream規則中使用單個服務器時,我會得到一個恆定的1000 req/s吞吐量。例如:

upstream cp_backend { 
    server 10.134.14.128:5000; 
    keepalive 32; 
} 

返回1000 req/s。當我添加第二個節點的應用程序(第二個服務器上運行),例如:

upstream cp_backend { 
    server 10.134.14.128:5000; 
    server 10.134.34.226:5000; 
    keepalive 32; 
} 

我看到周圍2000 req/s吞吐量(如預期)。

但是,只要我添加了2個以上的後端服務器,應用程序就不再線性縮放。例如:

upstream cp_backend { 
    server 10.134.14.128:5000; 
    server 10.134.34.226:5000; 
    server 10.134.26.172:5000; 
    keepalive 32; 
} 

只返回約2500 req/s,而不是3000預期。同理:

upstream cp_backend { 
    server 10.134.14.128:5000; 
    server 10.134.34.226:5000; 
    server 10.134.26.172:5000; 
    server 10.134.26.178:5000; 
    keepalive 32; 
} 

預期只有返回有關3000 req/s,而不是4000

給一些更多的背景。我測試了在這些相同服務器上運行的另一個(非nodeJS)應用程序,我能夠獲得17k req/s以上的版本,所以我知道Nginx和我的測試機器能夠達到這些數字。值得一提的是,在17k測試中,content-length實際上比節點應用更大。

每個節點應用程序都在具有自己資源的獨立VM上運行。當使用像top這樣的簡單工具時,我沒有看到任何主要的瓶頸。另外,我知道在使用單個上游服務器時,node.js VM能夠達到1000 req/s。似乎它是一個nginx瓶頸,因爲當通過nginx直接訪問它們中的任何一個時,我可以獲得1000請求/秒。如果我知道每個節點應用程序都能夠使用1000 req/s,爲什麼我不能使用4 upstream服務器實現4k req/s

任何關於使用良好分析軟件的建議?

回答

0

由於您尚未指定任何診斷或正在開發的硬件類型,因此您無法獲得非常好的答案。

我認爲這是某種資源短缺,由於您的硬件。你可能是最大化你的CPU或飽和你的網絡連接。

每個Node應用程序都有它自己的線程,但是如果其中兩個線程在同一個內核上運行,那麼它們可能會影響到彼此的性能。即使每個應用程序都在自己的核心上運行,也可能會使公交車飽和。

如果網絡飽和,這隻意味着您的應用正在爭奪帶寬,應該給予更好的網絡隔離。

最後,運行ApacheBench的計算機可能正在努力跟上。

在所有情況下,找到自己的一些硬件分析器,看看你的硬件在做什麼,因爲你的服務器顯然更強大,並且縮放得很好。

+0

感謝您的回覆。每個節點應用程序都在自己的核心上運行,因爲每個節點應用程序都有自己的專用VM。正如您在我的示例中看到的,每個節點應用程序都有自己的IP地址。 – cookandy

+0

正如您在我的示例中看到的,每個節點應用程序都有自己的IP地址。如果是網絡,我不希望在同一臺服務器上運行具有不同應用程序(具有較大內容長度)的17k請求/秒... – cookandy

+0

您可以爲虛擬化環境中的每個應用程序指定不同的IP。你沒有清楚你的任何細節。 – Soviut

1

需要詳細瞭解每個節點上的CPU和內存使用情況,以瞭解包括nginx代理服務器在內的瓶頸。

雖然,在代理中連接2個以上的上游服務器時,最好使用'least_conn'參數。這將確保服務器負載分配相等,而不是那個時候負載最輕的服務器。

你將從 http://nginx.org/en/docs/http/load_balancing.html

更多信息,您可能需要調整Nginx的爲好。 http://clouditops.blogspot.in/2016/11/improve-nginx-performance.html