php做的网站模板,合肥浦发建设集团网站,自助建站吧,泰安市违法建设网站刚开始#xff0c;先抛出一个问题#xff1a;你知道你们生产环境的 Node 服务平时占用内存多少吗#xff1f;或者说是多少量级#xff1f;山月在面试 Node 候选人时#xff0c;这个问题足够筛掉一半的自称Node精通者#xff0c;不过没有回答上来#xff0c;我往往会再补…刚开始先抛出一个问题你知道你们生产环境的 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 的性能问题包括内存网络IOCPU 等。这不仅适用于 node而且适用于一切进程包括 pythonjava 以及 go# -r: 指输出内存指标# -p: 指定 pid# 1: 每一秒输出一次# 100: 输出100次$ pidstat -r -p pid 1 100而在使用 pidstat 之前需要先找到进程的 pid如何找到 Node 进程的 pid在 node 中可以通过 process.pid 来找到进程的 pid process.pid16425虽然通过写代码可以找到 pid但是具有侵入性不太实用。那如何通过非侵入的手段找到 pid 呢有两种办法1. 通过多余的参数结合 ps 定位进程2. 通过端口号结合 lsof 定位进程$ node index.js shanyue# 第一种方法通过多余的参数快速定位 pid$ ps -ef | grep shanyueroot 31796 23839 1 16:38 pts/5 00:00:00 node index.js shanyue# 第二种方法通过端口号定位 pidlsof -i:3200COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnode 31796 root 20u IPv6 235987334 0t0 TCP *:tick-port (LISTEN)使用 pidstat 监控内存从以上代码中可以知道node 服务的 pid 为 31796为了可以观察到内存的动态变化再施加一个压力测试$ ab -c 10000 -n 1000000 http://localhost:3200/# -r: 指输出内存指标# -p: 指定 pid# 1: 每一秒输出一次# 100: 输出100次$ pidstat -r -p 31796 1 100Linux 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 Command19时20分39秒 0 11401 0.00 0.00 566768 19800 0.12 node19时20分40秒 0 11401 0.00 0.00 566768 19800 0.12 node19时20分41秒 0 11401 9667.00 0.00 579024 37792 0.23 node19时20分42秒 0 11401 11311.00 0.00 600716 59988 0.37 node19时20分43秒 0 11401 5417.82 0.00 611420 70900 0.44 node19时20分44秒 0 11401 3901.00 0.00 627292 85928 0.53 node19时20分45秒 0 11401 1560.00 0.00 621660 81208 0.50 node19时20分46秒 0 11401 2390.00 0.00 623964 83696 0.51 node19时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使用 htop 监控内存生产环境内存监控由于目前生产环境大都部署在 k8s「因此生产环境对于某个应用的内存监控本质上是 k8s 对于某个 workload/deployment 的内存监控」关于内存监控 metric 的数据流向大致如下:k8s - metric server - prometheus - grafana架构图如下最终能够在 grafana 中收集到某一应用的内存监控实时图:由于本部分设计内容过多我将在以下的章节中进行介绍这不仅仅适用于 node 服务而且适用于一切 k8s 上的 workload