簡體   English   中英

Node 是否使用 100% CPU?

[英]Is Node using 100% CPU?

我對正在運行的節點進程所看到的內容有些困惑。 主機上的docker stats顯示容器正在使用超過 100% 的 CPU。 這讓我認為節點進程正在最大化 CPU。 當我在主機上運行top並看到節點進程使用超過 100% 的 CPU 時,這一點得到了證實。

當我跳入 docker 容器時,我看到該節點僅使用了 54% 的 CPU,並且處理在兩個內核之間進行了拆分。 由於 Node 是單線程的,我期待看到一個核心達到最大值,另一個核心為 0。

我找到了這個 QA,看起來操作系統可能正在內核之間移動進程(對我來說是新聞)。 這個單 Node.JS 應用程序是否使用多核?

你能幫我解釋一下結果嗎? 節點是否已被最大化? 或者由於容器中的進程顯示為 54% 的使用率,go 可以達到 100% 嗎? 為什么節點容器中的頂部顯示節點的使用率為 54%,但兩個內核的使用率為 45% + 46%。 除了單節點進程,容器中沒有運行任何東西。 我沒有使用集群,盡管我包含的可能是 package。

我在問這一切,因為我試圖了解我是否應該擴展這個 ECS 實例,或者節點是否可以處理更多。

Node.JS: 15.1.0
EC2 Instance: c5.large
NestJS: 7.3.1

在此處輸入圖像描述

不一樣的top

您所看到的(可能)是由於top的口味不同。

我會大膽猜測並說您的 Docker 圖像可能基於 Alpine? Alpine 中top的命令是busybox 它報告每個進程的 CPU 使用率占可用 CPU總數的百分比 (nCPUs * 100%)。

這與大多數其他風格的top不同,后者將每個進程的 CPU 使用率報告為單個CPU 的百分比。

兩個頂部都顯示相同的東西:每個 CPU 的使用率約為 50%

上面的兩個top截圖實際上顯示了同一件事: node進程正在使用大約 50% 的 2 個 CPU。

測試理論

我們可以使用以下方法對此進行測試:

# This will max out 1 cpu of the system
docker run --name stress --rm -d alpine sh -c 'apk add stress-ng && stress-ng --cpu 1'

# This shows the busybox top with usage as ratio of total CPUs
# press 'c' in top to see the per-CPU info at the top
docker exec -it stress top

# This will install and run procps top, with usage as a ratio of single CPU
docker exec -it stress sh -c 'apk add procps && /usr/bin/top'

兩個不同 cpu 使用監視器中的 cpu 使用屏幕截圖

在上面的截圖中,我們可以看到兩種不同風格的top 它們報告的 CPU 使用率相同,但上面的報告為“100% CPU”(作為單個核心的百分比),而較低的報告為 6%(1/16 核心 = 6.25%)。

這告訴我們有關node的 CPU 使用率的什么信息?

Node 是單線程的,不能使用超過 100% 的 CPU。 ...有點。 在底層,Node 使用libuv ,它確實在孤島中運行線程。 例如,這就是 Node 接收 IO 操作的異步事件的方式。 這些線程確實使用 CPU,並且可以將您的 CPU 使用率推高到 100% 以上。 一些包也被編寫為Node 的附加組件,這些包也使用線程。

環境變量UV_THREADPOOL_SIZE限制了可以同時運行的 libuv 控制的線程的最大數量。 在運行節點之前將其設置為更大的數字(默認值為 4)可能會消除瓶頸。

如果您正在執行一些 CPU 密集型操作,請考慮使用cluster工作線程編寫您自己的附加組件或生成單獨的進程來進行計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM