当前位置: 首页 > 科技观察

听说你不知道如何监控Node服务的内存?

时间:2023-03-14 15:24:23 科技观察

开头先问一个问题:?你知道你的生产环境中的Node服务通常占用多少内存吗?或者是什么数量级??山岳面试Node候选人的时候,这个问题足以筛选出一半自称Node精通,但没有回答的,我经常补充一个问题,以免错过优秀的无线体验候选人:?如何知道多少memoryaprocessconsumption?[1]?》当在生产环境中使用Node作为服务器语言时,并发量过大或代码问题导致OOM(内存不足)或CPU满载。这些都是服务器中常见的问题。这时候通过监控CPU和内存,结合日志和ReleaseQuestion就很容易发现。”本章将介绍如何为一个Node应用实例监控本地环境和生产环境的内存变化那么,如何动态监控一个Node进程的内存变化呢?下面是一个NodeServer的例子,是一个有内存泄漏问题的例子,是山月在生产环境定位了很久的问题的浓缩版。?在那次内存泄漏问题中,单个容器内存从原来的400M飙升到700M,在800M容器资源限制下偶发OOM,导致重启。暂时没有定位到问题(发现问题已经晚了,半个月前的时序数据已经被吞掉了,所以在Release中没有定位到),所以将资源限制提高到1000M。后来发现通过ctx.request?constKoa=require('koa')constapp=newKoa()functiongetData(){returnArray.from(Array(1000)).map(x=>10086)}app.use(async(ctx,next)=>{ctx.data=getData()awaitnext()})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-ppid1100在使用pidstat之前,需要找到进程的pid。如何找到Node进程的pid?在node中,可以通过process.pid>process.pid16425找到进程的pid,虽然可以通过写代码找到pid,但是具有侵入性,不太实用。那么如何通过非侵入的方式找到pid呢?通过冗余参数结合ps定位进程和通过端口号结合lsof定位进程有两种方法$nodeindex.jsshanyue#第一种方法:通过冗余参数快速定位pid$ps-ef|grepshanyueroot3179623839116:38pts/500:00:00nodeindex.jsshanyue#方法二:locatepidlsof-i:3200COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEnode31796root20uIPv62359873340t0TCP*:tick-port(LISTEN)使用pidstat监控内存从上面的代码我们可以知道node服务的pid是31796,在为了观察内存动态变化,然后进行压力测试$ab-c10000-n1000000http://localhost:3200/#-r:指输出内存索引#-p:指定pid#1:输出一次per第二#100:输出100次$pidstat-r-p317961100linux3.10.0-957.21.3.el7.x86_64(shuifeng)(shuifeng)7月2日,2020年_x86_64_(2cpu).00566768198000.12node19时20分41秒0114019667.000.00579024377920.23node19时20分42秒01140111311.000.00600716599880.37node19时20分43秒0114015417.820.00611420709000.44node19时20分44秒0114013901.000.00627292859280.53node19时20分45秒0114011560.000.00621660812080.50node1920:460114012390.000.00623964836960.51node19:20:470114011764.000。00625500852040.52node的输出指标含义如下RSS:ResidentSetSize,常驻内存集合,可以理解为内存,这是我们需要监控的内存指标VSZ:virtualsize,虚拟内存从输出可以看出,”当加压测试后,内存从19M增加到85M。”使用top监控内存。pidstat是sysstat下的linux性能工具,但是在mac中如何定位内存的变化呢?这时候可以在生产环境使用top/htop$htop-p31796来使用htop监控内存。由于目前的生产环境大多部署在k8s中,“所以生产环境中应用的内存监控本质上就是k8s做的一个workload/deployment内存监控”,内存监控指标的数据流向大致如下:->metricserver->prometheus->grafana架构图如下:?上图摘自以下文章KubernetesMonitoringwithPrometheus[2]Kubernetes监控架构[3]?最后放一张实时内存监控图一个应用可以在grafana中收集:由于这部分的设计内容太多,我将在后面的章节中介绍“这不仅适用于节点服务,也适用于k8s上的所有工作负载”总结本章介绍了本地环境和生产环境下Node服务内存的监控。在本地使用htop/top或pidstat来监控进程内存。生产环境使用k8s/metric-server/prometheus/grafana监控整个node应用的内存。当监控某个服务发生内存泄漏后,如何解决?因此,下篇文章会讲到生产环境如何监控整个应用的内存。生产环境发生OOM时,如何快速定位。几个OOM在真实生产环境中的定位示例