日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

node获取服务器cpu信息,听说你不知道如何监控Node服务的内存?

發(fā)布時(shí)間:2024/7/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node获取服务器cpu信息,听说你不知道如何监控Node服务的内存? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

剛開(kāi)始,先拋出一個(gè)問(wèn)題:

你知道你們生產(chǎn)環(huán)境的 Node 服務(wù)平時(shí)占用內(nèi)存多少嗎?或者說(shuō)是多少量級(jí)?

山月在面試 Node 候選人時(shí),這個(gè)問(wèn)題足夠篩掉一半的自稱Node精通者,不過(guò)沒(méi)有回答上來(lái),我往往會(huì)再補(bǔ)充一個(gè)問(wèn)題,以免漏掉優(yōu)秀的無(wú)線上經(jīng)驗(yàn)的候選人:

如何知道某個(gè)進(jìn)程消耗多少內(nèi)存?

當(dāng)使用 Node 在生產(chǎn)環(huán)境作為服務(wù)器語(yǔ)言時(shí),并發(fā)量過(guò)大或者代碼問(wèn)題造成 OOM (out of memory) 或者 CPU 滿載這些都是服務(wù)器中常見(jiàn)的問(wèn)題,此時(shí)通過(guò)監(jiān)控 CPU 及內(nèi)存,再結(jié)合日志及 Release 就很容易發(fā)現(xiàn)問(wèn)題。

本章將介紹如何監(jiān)控本地環(huán)境及生產(chǎn)環(huán)境的內(nèi)存變化

一個(gè) Node 應(yīng)用實(shí)例

所以,如何動(dòng)態(tài)監(jiān)控一個(gè) Node 進(jìn)程的內(nèi)存變化呢?

以下是一個(gè) Node Server 的示例,并且是一個(gè)有內(nèi)存泄漏問(wèn)題的示例,并且是山月在生產(chǎn)環(huán)境定位了很久的問(wèn)題的精簡(jiǎn)版。

那次內(nèi)存泄漏問(wèn)題中,導(dǎo)致單個(gè)容器中的內(nèi)存從原先的 400M 暴漲到 700M,在 800M 的容器資源限制下偶爾會(huì)發(fā)生 OOM,導(dǎo)致重啟。一時(shí)沒(méi)有定位到問(wèn)題 (發(fā)現(xiàn)問(wèn)題過(guò)遲,半個(gè)月前的時(shí)序數(shù)據(jù)已被吞沒(méi),于是未定位到 Release),于是把資源限制上調(diào)到 1000M。后發(fā)現(xiàn)是由 ctx.request 掛載了數(shù)據(jù)庫(kù)某個(gè)大字段而致const Koa = require('koa')

const app = new Koa()

function getData () {

return Array.from(Array(1000)).map(x => 10086)

}

app.use(async (ctx, next) => {

ctx.data = getData()

await next()

})

app.use(ctx => {

ctx.body = 'hello, world'

})

app.listen(3200, () => console.log('Port: 3200'))

進(jìn)程內(nèi)存監(jiān)控

一些問(wèn)題需要在本地及測(cè)試環(huán)境得到及時(shí)扼殺,來(lái)避免在生產(chǎn)環(huán)境造成更大的影響。那么了解在本地如何監(jiān)控內(nèi)存就至關(guān)重要。

pidstat 是 sysstat 系列 linux 性能調(diào)試工具的一個(gè)包,竟然用它來(lái)調(diào)試 linux 的性能問(wèn)題,包括內(nèi)存,網(wǎng)絡(luò),IO,CPU 等。

這不僅適用于 node,而且適用于一切進(jìn)程,包括 python,java 以及 go

# -r: 指輸出內(nèi)存指標(biāo)

# -p: 指定 pid

# 1: 每一秒輸出一次

# 100: 輸出100次

$ pidstat -r -p pid 1 100

而在使用 pidstat 之前,需要先找到進(jìn)程的 pid

如何找到 Node 進(jìn)程的 pid

在 node 中可以通過(guò) process.pid 來(lái)找到進(jìn)程的 pid

> process.pid

16425

雖然通過(guò)寫(xiě)代碼可以找到 pid,但是具有侵入性,不太實(shí)用。那如何通過(guò)非侵入的手段找到 pid 呢?有兩種辦法

1. 通過(guò)多余的參數(shù)結(jié)合 ps 定位進(jìn)程

2. 通過(guò)端口號(hào)結(jié)合 lsof 定位進(jìn)程

$ node index.js shanyue

# 第一種方法:通過(guò)多余的參數(shù)快速定位 pid

$ ps -ef | grep shanyue

root 31796 23839 1 16:38 pts/5 00:00:00 node index.js shanyue

# 第二種方法:通過(guò)端口號(hào)定位 pid

lsof -i:3200

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

node 31796 root 20u IPv6 235987334 0t0 TCP *:tick-port (LISTEN)

使用 pidstat 監(jiān)控內(nèi)存

從以上代碼中可以知道,node 服務(wù)的 pid 為 31796,為了可以觀察到內(nèi)存的動(dòng)態(tài)變化,再施加一個(gè)壓力測(cè)試

$ ab -c 10000 -n 1000000 http://localhost:3200/# -r: 指輸出內(nèi)存指標(biāo)

# -p: 指定 pid

# 1: 每一秒輸出一次

# 100: 輸出100次

$ pidstat -r -p 31796 1 100

Linux 3.10.0-957.21.3.el7.x86_64 (shuifeng) 2020年07月02日 _x86_64_ (2 CPU)

UID PID minflt/s majflt/s VSZ RSS %MEM Command

19時(shí)20分39秒 0 11401 0.00 0.00 566768 19800 0.12 node

19時(shí)20分40秒 0 11401 0.00 0.00 566768 19800 0.12 node

19時(shí)20分41秒 0 11401 9667.00 0.00 579024 37792 0.23 node

19時(shí)20分42秒 0 11401 11311.00 0.00 600716 59988 0.37 node

19時(shí)20分43秒 0 11401 5417.82 0.00 611420 70900 0.44 node

19時(shí)20分44秒 0 11401 3901.00 0.00 627292 85928 0.53 node

19時(shí)20分45秒 0 11401 1560.00 0.00 621660 81208 0.50 node

19時(shí)20分46秒 0 11401 2390.00 0.00 623964 83696 0.51 node

19時(shí)20分47秒 0 11401 1764.00 0.00 625500 85204 0.52 node

對(duì)于輸出指標(biāo)的含義如下

RSS: Resident Set Size,常駐內(nèi)存集,可理解為內(nèi)存,這就是我們需要監(jiān)控的內(nèi)存指標(biāo)

VSZ: virtual size,虛擬內(nèi)存

從輸出可以看出,「當(dāng)施加了壓力測(cè)試后,內(nèi)存由 19M 漲到了 85M。」

使用 top 監(jiān)控內(nèi)存

pidstat 是屬于 sysstat 下的 linux 性能工具,但在 mac 中,如何定位內(nèi)存的變化?

此時(shí)可以使用 top/htop

$ htop -p 31796

使用 htop 監(jiān)控內(nèi)存

生產(chǎn)環(huán)境內(nèi)存監(jiān)控

由于目前生產(chǎn)環(huán)境大都部署在 k8s,「因此生產(chǎn)環(huán)境對(duì)于某個(gè)應(yīng)用的內(nèi)存監(jiān)控本質(zhì)上是 k8s 對(duì)于某個(gè) workload/deployment 的內(nèi)存監(jiān)控」,關(guān)于內(nèi)存監(jiān)控 metric 的數(shù)據(jù)流向大致如下:

k8s -> metric server -> prometheus -> grafana

架構(gòu)圖如下:

最終能夠在 grafana 中收集到某一應(yīng)用的內(nèi)存監(jiān)控實(shí)時(shí)圖:

由于本部分設(shè)計(jì)內(nèi)容過(guò)多,我將在以下的章節(jié)中進(jìn)行介紹

這不僅僅適用于 node 服務(wù),而且適用于一切 k8s 上的 workload

總結(jié)

以上是生活随笔為你收集整理的node获取服务器cpu信息,听说你不知道如何监控Node服务的内存?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。