我正在試驗 Node.js集群功能和PM2,這是我用于測驗的小腳本:
// server.js
import { createServer } from 'http'
const { pid } = process
const server = createServer((req, res) => {
res.end(`Hello from ${pid}`)
})
server.listen('8080', () => console.log(`Started at ${pid}`))
我使用wrk進行負載測驗:
wrk -c 200 -d 10 -t 4 http://localhost:8080
我使用 PM2 啟動server.js和 wrk 執行負載測驗,為每個測驗添加一個正在運行的服務實體。結果如下:
server.js with 1 instance --> Requests/sec: 46139.15
server.js with 2 instances --> Requests/sec: 89343.35
server.js with 3 instances --> Requests/sec: 124294.58
server.js with 4 instances --> Requests/sec: 137826.08
server.js with 5 instances --> Requests/sec: 134193.62
server.js with 12 instances --> Requests/sec: 123073.60
(所有操作都在我的本地機器上執行,這是一臺帶有 Intel i9-9900K(16 邏輯核心)@ 3.60GHz CPU 的 iMac)
可以看到,從 4 個實體開始,性能提升越來越小。并且從5個實體的實驗開始,性能反而下降(我可以確認此時網路負載沒有達到最大值,與1GB/s的網卡容量相比,只有65MB/s)。
另一個奇怪的行為是,隨著實體數量的增加,測驗時cpu使用率也增加,但性能如上文所述。
所以我的問題是:為什么當實體達到 5 時性能下降?似乎添加實體不再提高性能。
uj5u.com熱心網友回復:
由于您的服務器并沒有真正做太多 CPU 密集型的事情,因此您可能根本不受 CPU 限制(而且您的 CPU 使用率低也意味著這一點)。在達到 CPU 限制之前,您可能會受到網路限制或其他一些瓶頸。因此,當您添加超出某個級別的 CPU 時,您看不到任何好處。
如果您向請求處理程式添加一個 100 毫秒的自旋回圈以創建實際的 CPU 負載,您可能會看到非常不同的結果,并且添加更多的 CPU 應該會顯示出更多的好處。請記住,更多 CPU 僅在您實際受 CPU 限制時才有幫助。
另外,請記住,對于您的處理器,您有 8 個超執行緒的真實內核,看起來有 16 個內核,額外的 8 個實際上只是“更高效”的執行緒。如果您沒有進行大量執行緒背景關系切換,那么那些額外的 8 個虛擬 CPU 可能不會提供任何真正的好處。
并且,當客戶端負載在不同的主機上并且您實際使用網路發送/接收請求時,對您的服務器配置進行最準確的測驗。本地主機請求實際上并不通過網路。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389800.html
下一篇:SQLjoin性能操作順序
