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

刚开始,先抛出一个问题:

你知道你们生产环境的 Node 服务平时占用内存多少吗?或者说是多少量级?

山月在面试 Node 候选人时,这个问题足够筛掉一半的自称Node精通者,不过没有回答上来,我往往会再补充一个问题,以免漏掉优秀的无线上经验的候选人:

如何知道某个进程消耗多少内存?

当使用 Node 在生产环境作为服务器语言时,并发量过大或者代码问题造成 OOM (out of memory) 或者 CPU 满载这些都是服务器中常见的问题,此时通过监控 CPU 及内存,再结合日志及 Release 就很容易发现问题。

本章将介绍如何监控本地环境及生产环境的内存变化

一个 Node 应用实例

所以,如何动态监控一个 Node 进程的内存变化呢?

以下是一个 Node Server 的示例,并且是一个有内存泄漏问题的示例,并且是山月在生产环境定位了很久的问题的精简版。

那次内存泄漏问题中,导致单个容器中的内存从原先的 400M 暴涨到 700M,在 800M 的容器资源限制下偶尔会发生 OOM,导致重启。一时没有定位到问题 (发现问题过迟,半个月前的时序数据已被吞没,于是未定位到 Release),于是把资源限制上调到 1000M。后发现是由 ctx.request 挂载了数据库某个大字段而致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'))

进程内存监控

一些问题需要在本地及测试环境得到及时扼杀,来避免在生产环境造成更大的影响。那么了解在本地如何监控内存就至关重要。

pidstat 是 sysstat 系列 linux 性能调试工具的一个包,竟然用它来调试 linux 的性能问题,包括内存,网络,IO,CPU 等。

这不仅适用于 node,而且适用于一切进程,包括 python,java 以及 go

# -r: 指输出内存指标

# -p: 指定 pid

# 1: 每一秒输出一次

# 100: 输出100次

$ pidstat -r -p pid 1 100

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

如何找到 Node 进程的 pid

在 node 中可以通过 process.pid 来找到进程的 pid

> process.pid

16425

虽然通过写代码可以找到 pid,但是具有侵入性,不太实用。那如何通过非侵入的手段找到 pid 呢?有两种办法

1. 通过多余的参数结合 ps 定位进程

2. 通过端口号结合 lsof 定位进程

$ node index.js shanyue

# 第一种方法:通过多余的参数快速定位 pid

$ ps -ef | grep shanyue

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

# 第二种方法:通过端口号定位 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 监控内存

26bc10b94fcd7b686621838eeabdf21f.png

从以上代码中可以知道,node 服务的 pid 为 31796,为了可以观察到内存的动态变化,再施加一个压力测试

$ ab -c 10000 -n 1000000 http://localhost:3200/# -r: 指输出内存指标

# -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时20分39秒 0 11401 0.00 0.00 566768 19800 0.12 node

19时20分40秒 0 11401 0.00 0.00 566768 19800 0.12 node

19时20分41秒 0 11401 9667.00 0.00 579024 37792 0.23 node

19时20分42秒 0 11401 11311.00 0.00 600716 59988 0.37 node

19时20分43秒 0 11401 5417.82 0.00 611420 70900 0.44 node

19时20分44秒 0 11401 3901.00 0.00 627292 85928 0.53 node

19时20分45秒 0 11401 1560.00 0.00 621660 81208 0.50 node

19时20分46秒 0 11401 2390.00 0.00 623964 83696 0.51 node

19时20分47秒 0 11401 1764.00 0.00 625500 85204 0.52 node

对于输出指标的含义如下

RSS: Resident Set Size,常驻内存集,可理解为内存,这就是我们需要监控的内存指标

VSZ: virtual size,虚拟内存

从输出可以看出,「当施加了压力测试后,内存由 19M 涨到了 85M。」

使用 top 监控内存

pidstat 是属于 sysstat 下的 linux 性能工具,但在 mac 中,如何定位内存的变化?

此时可以使用 top/htop

$ htop -p 31796

d5c250a2361f02c316cea0fe421382da.png

使用 htop 监控内存

生产环境内存监控

由于目前生产环境大都部署在 k8s,「因此生产环境对于某个应用的内存监控本质上是 k8s 对于某个 workload/deployment 的内存监控」,关于内存监控 metric 的数据流向大致如下:

k8s -> metric server -> prometheus -> grafana

架构图如下:

586849c168057b0a8d4dec268cd7a36e.png

e6e542b1e196743b26922e68b227640d.png

最终能够在 grafana 中收集到某一应用的内存监控实时图:

由于本部分设计内容过多,我将在以下的章节中进行介绍

这不仅仅适用于 node 服务,而且适用于一切 k8s 上的 workload

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调python返回图片_三个好习惯,帮你写好Python里的异常处理

如果你用 Python 编程,那么你就无法避开异常,因为异常在这门语言里无处不在。打个比方,当你在脚本执行时按 ctrlc 退出,解释器就会产生一个 KeyboardInterrupt 异常。而 KeyError、 ValueError、 TypeError 等更是日常编程里随处可…

easyui datatable ajax 加载数据,ASP.NET easyUI--datagrid 通过ajax请求ASP.NET后台数据的分页查询...

js前台对datagrid的定义代码,如下mygrid $(#mytable).datagrid({fit: true, //自动大小height: auto,rownumbers: true, //行号fitColumns: true,collapsible: true, //是否可折叠的loadMsg: 数据装载中......,singleSelect: true, //单行选取pagination: true //显…

如何调位置_如何知道手表是偷停还是真没动力了?看完之后你在家也能测

导读:石英表如果出现偷停情况,通常是这几个地方出现问题:一、线路板接触不良;二、电池未安装到位;三、电池电量不足;四、受力导致的电池接触不良等;解决方案:一、修复或更换线路板&a…

用ajax传值input file,获取 input type=file 标签的内容,并使用ajax进行请求到服务器...

数据结构:栈 顺序表方法和单链表方法(python版)#!/usr/bin/env python # -*- coding:utf-8 -*- class StackUnderflow(ValueError): pass #链表节点 class Node ...SQLServer中给表增加组合唯一约束将两个或者多个字段一起约束成一个唯一约束 alter table 表名 add …

一元三次方程重根判别式_如何求一元三次方程

我们知道,一元二次方程 的根可以通过求根公式 计算那一元三次方程的根如何求?进行百度的话,我们可以发现一元三次方程可以采用卡尔丹公式和盛金求根公式来计算。下面用最基础的代数方法来理解卡尔丹公式怎么来的。一元三次方程 1、为了解最初…

怎么安装aptdaemon模块_自己开发一个React Native 模块

大纲为什么需要 React Native Module如何创建一个 React Native的模块编写 Android Toast 功能模块如何调试 React Native 模块---------官方文档中未提及或者我没有找到,这里是我自己探索的npm 发布一个 React Native 模块(外链接)为什么需要…

语言ppt课件猜拳_八年级语文上册第22课 孟子三章讲解及课件下载

八年级语文上册【第一单元】八年级语文上册第1课《消息二则》讲解及PPT课件下载八年级语文上册第2课《首届诺贝尔奖颁发》讲解及PPT课件下载八年级语文上册第3课《“飞天”凌空》讲解及PPT课件下载八年级语文上册第4课《一着惊海天》讲解及PPT课件下载八年级语文上册第5课《国行…

读取txt原理_Mysql客户端任意文件读取学习

前言最近打了 DDCTF和 国赛,发现都考了一个知识点,也就是 MysqlLocalInfile客户端文件读取这个漏洞,下面来详细的学习一个这个漏洞。漏洞形成原因此漏洞形成的主要原因在于 LOAD DATA INFILE这个语法上。在官方文档中的介绍为:该L…

jar包 jdk 停_一文读懂jar包的小秘密

简介java程序员每天不是在创建jar包就是在创建jar包的路上,并且各种依赖引用都是以jar包的形式展示的。但是随着现代IDE的出现,我想很多程序员已经基本上很少直接和jar包打交道了。换句话说,他们已经不认识jar包了。那么jar包到底是什么呢&am…

逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门

Hello World!我是老乔,欢迎来到超智星球。在这里,每篇都学一个小知识。微号:超智星球 网站:http://chaozhixingqiu.com这期呢,还是计算机原理系列,上期最后讲到了自动制表机和IBM。本期接着讲计算机历史。#…

文本标点英文对齐_电脑健盘中的所有英文组合意思超值解释建议收藏

电脑键盘上所有英文键的意思1、Esc :取消和退出键2、Tab :表格键切换键3、Caps Lock :字母大小写切换键4、Shift :转换键5、Ctrl: 控制键,需要配合其他键或鼠标使用, 例如复制CtrIC6、Alt: 可选(切换)键,-般与其它键组合使用, 例如…

众辰变频器参数设定_变频器被加密了怎么办?这20个品牌都可以解密

1、西门子6SE70书本型变频器:设定密码打不开时,将P358和P359中数据改为相同即可。2、ABBACS600变频器:在16.03参数中输入密码“23032”,102.01参数设置为false,可以进入设定所有主控板参数。3、三菱740系列变频器&…

python expect_python--pexpect

大家好,最近工作比较忙,所以没时间来更新博客。趁着还没在下个版本来临之前,来这边再更新更新。是之前学习到的一些老知识点,就当来巩固一下了。开心QAQ今天给大家介绍的是--PexpectExpect 程序主要用于人机对话的模拟1.运行程序2.程序要求人的判断和输入3.Expect 通过关键字匹…

xlwings删除数据_xlwings如何删除行和列?

import xlwings as xwsht[2:2].delete()# 删除行sht[1:2, :].delete() # 区域切片的方法sht[B:B].delete()# 删除列sht[:, 1:2].delete()sht[B2].delete()# 删除单元格 (缺省默认右侧左移left,下侧上移up)sht[C2:D4].delete(up) # 删除区域sht[1:4, 2:4].delete(up)…

怎么实现注解_通透!一口气搞懂注解到底怎么用

日志脱敏场景简介在日志里我们的日志一般打印的是 model 的 Json string,比如有以下 model 类public class Request { /** * 用户姓名 */ private String name; /** * 身份证 */ private String idcard; /** * 手机号 *…

嵌套饼图_你真的了解matplotlib吗?---环形图

环形图简介环形图是饼图衍生出来的统计图形,可以看作是两个以上饼图的叠合。环形图与饼图类似,其实是有差别的。饼图是用圆形及圆内扇形的面积来表示数值大小的图形,主要用于表示总体中各组成部分所占的比例。与之对比,环形图中间…

slim 搭建rnn_使用Keras搭建cnn+rnn, BRNN,DRNN等模型

Keras api 提前知道:Normalize the activations of the previous layer at each batch, i.e. applies a transformation that maintains the mean activation close to 0 and the activation standard deviation close to 1.TimeDistributed, 总的来说TimeDistribut…

JAVA入门级教学之(零基础了解计算机)

JAVA小白入门级教学(零基础了解计算机基础知识) 多动手自己操作,一点一点积累 首先我们了解一下计算机的基础知识 1.计算机构成(基础): 硬件:CPU、内存、硬盘、鼠标、显示器、鼠标等&#x…

oppo 手机侧滑快捷菜单_关于oppo手机菜单键调出的方法,原来是这样的

用OPPO手机朋友们,今天来教大家如何调出手机菜单键。工具/材料OPPO手机操作方法01首先,在手机桌面上找到设置,点击进入。02进入设置找到【面部与密码】,并点击它。03然后点击【关闭密码】,要想设置手机菜单键&#xff…

JAVA入门级教学之(JAVA程序的加载和运行)

JAVA程序的加载和运行 多思考多动脑(边参考文章最后的示意图,边按步骤理解) 1.JAVA程序的加载和运行包括两个非常重要的阶段: 编译阶段运行阶段 2.我们先来了解一下什么是编译阶段: 首先,我们自己动手敲…