成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聽說你不知道如何監(jiān)控Node服務的內(nèi)存?

開發(fā) 前端
本章介紹了關于 Node 服務的內(nèi)存在本地環(huán)境及生產(chǎn)環(huán)境的監(jiān)控。

剛開始,先拋出一個問題:

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

山月在面試 Node 候選人時,這個問題足夠篩掉一半的自稱Node精通者,不過沒有回答上來,我往往會再補充一個問題,以免漏掉優(yōu)秀的無線上經(jīng)驗的候選人:

    ❝    如何知道某個進程消耗多少內(nèi)存?[1]    ❞

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

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

一個 Node 應用實例

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

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

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

  1. const Koa = require('koa')  
  2. const app = new Koa()  
  3. function getData () {  
  4.   return Array.from(Array(1000)).map(x => 10086) 
  5.  
  6. app.use(async (ctx, next) => {  
  7.   ctx.data = getData()  
  8.   await next()  
  9. })  
  10. app.use(ctx => {  
  11.   ctx.body = 'hello, world'  
  12. })  
  13. app.listen(3200, () => console.log('Port: 3200')) 

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

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

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

「這不僅試用與 node,而且適用于一切進程,包括 python,java 以及 go」 

  1. # -r: 指輸出內(nèi)存指標  
  2. # -p: 指定 pid  
  3. # 1: 每一秒輸出一次  
  4. # 100: 輸出100次  
  5. $ pidstat -r -p pid 1 100 

而在使用 pidstat 之前,需要先找到進程的 pid

如何找到 Node 進程的 pid

在 node 中可以通過 process.pid 來找到進程的 pid 

  1. > process.pid  
  2. 16425 

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

  1.  通過多余的參數(shù)結合 ps 定位進程
  2.  通過端口號結合 lsof 定位進程 
  1. $ node index.js shanyue  
  2. # 第一種方法:通過多余的參數(shù)快速定位 pid  
  3. $ ps -ef | grep shanyue  
  4. root     31796 23839  1 16:38 pts/5    00:00:00 node index.js shanyue  
  5. # 第二種方法:通過端口號定位 pid  
  6. lsof -i:3200  
  7. COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME  
  8. node    31796 root   20u  IPv6 235987334      0t0  TCP *:tick-port (LISTEN) 

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

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

  1. $ ab -c 10000 -n 1000000 http://localhost:3200/  
  1. # -r: 指輸出內(nèi)存指標  
  2. # -p: 指定 pid  
  3. # 1: 每一秒輸出一次  
  4. # 100: 輸出100次  
  5. $ pidstat -r -p 31796 1 100  
  6. Linux 3.10.0-957.21.3.el7.x86_64 (shuifeng)     2020年07月02日  _x86_64_        (2 CPU)  
  7.              UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command  
  8. 19時20分39秒     0     11401      0.00      0.00  566768  19800   0.12  node  
  9. 19時20分40秒     0     11401      0.00      0.00  566768  19800   0.12  node  
  10. 19時20分41秒     0     11401   9667.00      0.00  579024  37792   0.23  node  
  11. 19時20分42秒     0     11401  11311.00      0.00  600716  59988   0.37  node  
  12. 19時20分43秒     0     11401   5417.82      0.00  611420  70900   0.44  node  
  13. 19時20分44秒     0     11401   3901.00      0.00  627292  85928   0.53  node  
  14. 19時20分45秒     0     11401   1560.00      0.00  621660  81208   0.50  node  
  15. 19時20分46秒     0     11401   2390.00      0.00  623964  83696   0.51  node  
  16. 19時20分47秒     0     11401   1764.00      0.00  625500  85204   0.52  node 

對于輸出指標的含義如下

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

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

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

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

此時可以使用 top/htop 

  1. $ 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)境對于某個應用的內(nèi)存監(jiān)控本質上是 k8s 對于某個 workload/deployment 的內(nèi)存監(jiān)控」,關于內(nèi)存監(jiān)控 metric 的數(shù)據(jù)流向大致如下:

k8s -> metric server -> prometheus -> grafana

架構圖如下: 

 

❝    以上圖片取自以下文章

  •   Kubernetes Monitoring with Prometheus[2]
  •   Kubernetes monitoring architecture[3]    ❞

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

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

「這不僅僅適用于 node 服務,而且適用于一切 k8s 上的 workload」

總結

本章介紹了關于 Node 服務的內(nèi)存在本地環(huán)境及生產(chǎn)環(huán)境的監(jiān)控

  1.  本地使用 htop/top 或者 pidstat 監(jiān)控進程內(nèi)存
  2.  生產(chǎn)環(huán)境使用 k8s/metric-server/prometheus/grafana 監(jiān)控 node 整個應用的內(nèi)存

當監(jiān)控到某一服務發(fā)生內(nèi)存泄漏后,如何解決問題?因此接下來的文章將會講到

  1.  生產(chǎn)環(huán)境是如何監(jiān)控整個應用的內(nèi)存的
  2.  當生產(chǎn)環(huán)境發(fā)生 OOM 后,如何快速定位
  3.  真實生產(chǎn)環(huán)境若干 OOM 的示例定位 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2021-11-16 08:51:29

Node JavaScript變量類型

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2010-08-23 09:56:09

Java性能監(jiān)控

2011-09-15 17:10:41

2021-02-01 23:23:39

FiddlerCharlesWeb

2022-10-13 11:48:37

Web共享機制操作系統(tǒng)

2009-12-10 09:37:43

2021-10-17 13:10:56

函數(shù)TypeScript泛型

2012-11-23 10:57:44

Shell

2020-08-11 11:20:49

Linux命令使用技巧

2021-12-29 11:38:59

JS前端沙箱

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2015-06-19 13:54:49

2023-10-23 09:48:00

2020-09-15 08:35:57

TypeScript JavaScript類型

2022-11-04 08:19:18

gRPC框架項目

2018-12-06 09:12:58

2017-12-15 13:44:22

2021-06-03 08:05:46

VSCode 代碼高亮原理前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产电影一区二区在线观看 | 日韩成人中文字幕 | 久久69精品久久久久久久电影好 | 欧美色综合一区二区三区 | 激情一区 | 日本激情视频中文字幕 | 国产精品视频一二三区 | 国产一级精品毛片 | 欧美一区不卡 | 亚洲一区二区免费视频 | 秋霞在线一区二区 | 欧美精品在线视频 | 久久久99精品免费观看 | 日韩精品在线视频 | 成人精品一区二区三区 | 91精品国产91久久久久久三级 | 精品国产一区二区三区性色 | 伊人青青久久 | 一区二区三区国产好 | 日本电影韩国电影免费观看 | 成人综合伊人 | www.精品一区| 日韩欧美一区二区三区免费观看 | 日日夜夜影院 | 亚洲人成一区二区三区性色 | 精品国产乱码久久久久久影片 | 成人网在线观看 | 国产一区二区三区不卡av | 久久一区二区三区电影 | a级大片免费观看 | 久久久久国产一区二区三区不卡 | 精品视频一区二区三区在线观看 | 国产色播av在线 | 亚洲444kkkk在线观看最新 | 国产精品久久影院 | 天天操伊人 | 国产一区二区三区久久 | 欧美综合在线视频 | 亚洲久久在线 | 国产精品视频区 | 中文字幕在线观看av |