偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

剛開始,先拋出一個(gè)問題:

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

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

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

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

本章將介紹如何監(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)存泄漏問題的示例,并且是山月在生產(chǎn)環(huán)境定位了很久的問題的精簡(jiǎn)版。

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

  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')) 

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

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

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

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

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

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

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

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

  1. > process.pid  
  2. 16425 

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

  1.  通過多余的參數(shù)結(jié)合 ps 定位進(jìn)程
  2.  通過端口號(hào)結(jié)合 lsof 定位進(jìn)程 
  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. # 第二種方法:通過端口號(hào)定位 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 服務(wù)的 pid 為 31796,為了可以觀察到內(nèi)存的動(dòng)態(tài)變化,再施加一個(gè)壓力測(cè)試 

  1. $ ab -c 10000 -n 1000000 http://localhost:3200/  
  1. # -r: 指輸出內(nèi)存指標(biāo)  
  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時(shí)20分39秒     0     11401      0.00      0.00  566768  19800   0.12  node  
  9. 19時(shí)20分40秒     0     11401      0.00      0.00  566768  19800   0.12  node  
  10. 19時(shí)20分41秒     0     11401   9667.00      0.00  579024  37792   0.23  node  
  11. 19時(shí)20分42秒     0     11401  11311.00      0.00  600716  59988   0.37  node  
  12. 19時(shí)20分43秒     0     11401   5417.82      0.00  611420  70900   0.44  node  
  13. 19時(shí)20分44秒     0     11401   3901.00      0.00  627292  85928   0.53  node  
  14. 19時(shí)20分45秒     0     11401   1560.00      0.00  621660  81208   0.50  node  
  15. 19時(shí)20分46秒     0     11401   2390.00      0.00  623964  83696   0.51  node  
  16. 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?!?/p>

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

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

此時(shí)可以使用 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)境對(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)圖如下: 

 

❝    以上圖片取自以下文章

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

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

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

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

總結(jié)

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

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

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

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

 

責(zé)任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

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

2009-12-10 09:37:43

2022-10-13 11:48:37

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

2021-02-01 23:23:39

FiddlerCharlesWeb

2021-10-17 13:10:56

函數(shù)TypeScript泛型

2020-08-11 11:20:49

Linux命令使用技巧

2015-06-19 13:54:49

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2021-12-29 11:38:59

JS前端沙箱

2012-11-23 10:57:44

Shell

2023-10-23 09:48:00

2022-11-04 08:19:18

gRPC框架項(xiàng)目

2020-09-15 08:35:57

TypeScript JavaScript類型

2018-12-06 09:12:58

2017-12-15 13:44:22

2022-12-07 08:16:50

Vue 3技巧數(shù)組
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)