1、OOM 报警:内存走漏?

某天下午,线上的服务监控宣告报警:在同一个服务下,组织的许多容器中,某一个容器出现 OOM 问题。

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

上图是容器维度的资源运用率监控图。能够看到红色的内存运用率曲线,逐axios和ajax差异步升高将近到 100% 后又活络降至 0%。这是由于触发 OOM 后容器自动重启。而在重启后,容器的的内存运用率仍在缓慢上升。

该容器分chrome直接下载配的资源为 1 核 1G,其容器内只作业一个 Nodejschrome插件 进程。作业的 Nodejs 进程在某段时刻axios封装的监监控控曲线如下:

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

能够看到,堆内存运用率也是逐步攀升,CPU 运用率则较为安稳。其与容器维度的监控摄像头监控表现一同。从容器与 Node运营处理js 进程的曲线上来看,十分像是 Nodejs 服监控怎样衔接手机务内存走漏的问监控怎样联接手机题。

2、运用堆内存快照,排查堆内存问题

既然是内存问题axios是什么,我很快想到要经过堆监控设备流程内存快照(Heap Snapshot)来排查。该服务运用了快手内部自研的 KNode 作业时来组织服务,因此可chrome直接下载以在线上按需实时axios二次封装地打出堆快照,并在线查看:axioios14.4.2值得更新吗s跨域

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

Heapsnaphost 中各项的意监控体系义以及怎样查看,假定不了解能够看 Chrome Devtools 的阐明文档。

不过或许是由于堆快照是一个切面数据,一同,打印这张快照时堆内存运用率也不是太高(大约为 20%),所以在开始看了堆快照后,问题条理不太直接。遇到这个运营是做什么的问题,还有一个运营处理好办法,便是做两个时刻点的快照 Dif监控怎样联接手机f。

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

v8 会给每个堆内存政策分配一个 ID。因此能够在 Haxios封装eap 运用率较低和较高两个chrome时刻点,分别打印对应的堆快照,经过这个相关 ID,就能够对比出这段时刻内新增和回收开释的堆内存政策。而 Chrome Devtools 自身也支撑堆快照的 comparison 展示。

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

上图展示了在堆运营助理内存从 20% 涨到 50% 后新央求而没有被 GC 的政策(Objectchrome官方下载 Allocated)。结合之前的堆快照(切面数据)和上面的 com运营是运营的薪酬一般是多少做什么的parison 数据(Diff 数据),能够发现,红框中的ios体系这两类政策十分超卓。也便是 GetAddrInfoReqWrapSocket运营总监

Socket 和网络联接相关,归于比较广的规划。由于我将目光放在了 GetAdrrInfoReqWrap 上。依据之前对 Nodejs 的了解,我知道这是和 DNS 查询相关的 JS 层 wrapper 政策。当然,假ios14桌面布局图片设咱们不知道这个政策,也能够经过查阅 Noaxios怎样读dejs 源码来了解到它的功用。翻开堆快照中的政策,看下详细信息:

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

从快照中政策运营是做什么的的详细信息看,chrome手机版其 hostname 比较监控怎样联接手机松懈,所以感觉是和容器内整个 DNS 查询有关。

3、从其运营是做什么的作业内容是什么他 Nodejs 监控项监控设备流监控摄像头软件app下载,来看这个问题

假定运营助理是 DNS 查询的问题,必定也会直监控器什么牌子最好清晰度高运营助理影响到 HTTP 相关的监控项。而状况也的确如此。从 Nodejs 进程建议的 HTTP 央求的监控来看,有问题的容器,每分钟能运营是做什么的作业内容是什么结束的央求数只ios14.4.1更新了什么有 3 次(如下图):

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

运营助理营助理的作业内容chrome安卓下载一个服务下的正常容器内,每个 Nodejaxioss 进程每分钟能够正常发送跨过 150 个 HTios体系TP 央求(如下图):

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

一同,ios14.4.2值得更新吗异常容器中的 Nodejs 发送结束一个 HTTP 央求的均匀耗时跨过了 800 秒(&chrome浏ios体系览器gt;13分钟)。而正监控摄像头常状况下内网服务之间的 HTTP 央求耗时一般都在几十毫秒,慢的也不太会跨过几百毫秒。

此外,假定查看 Nodejs 的 Actios14.4.1更新了什么ive Handle 的数量监控家用长途手机,也是处于一个继续上涨chrome插件的状态。

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

这儿的 Active Hanaxios是什么dle 是指 libuv 中的 Handle,与其相似的还有一个叫 Request 的概念。它是 libuv 中的抽象概念,用来指代 libuv 中某项操作的政策,监控眼营助理的作业内容例如定时器、设备 IO 等。Nodejs 进程中的 Active Handle 数量继续上涨往往是有问题的,它chrome什么意思axios原理阐明 Nodejs 要处理的东西“积压axios二次封装”地越来越多。

因此,根柢怀疑便是 DNS 查询的问题导致央求积压,chrome官方下载然后导致了该缺陷。

4、缺监控怎样设备点供认与修运营助理

经过上面监控体系的分析,根柢监控眼能够供认和 DNS 查询脱不了关连。由于在服务组织的许多容器中,只有这一个有ios退款 OOM 问题,所以我分别登进一个健康容器和这ios14桌面布局图片个问题容器,实施以下 JS 代码来供认 DNS 查询状况(chro监控摄像头me本文隐去了实践域名):

conschrome手机版ole.chrome官方下载time('dns');
require('dns').lookup('xxx.xxxx.xxx', () =>运营是什么意思 {
console监控怎样装置.timeEnd('dns');
});

这儿需求提chrome浏览器安卓版下载一下。Nodejs 封装了两类 D运营总监NS 查询的办法,一监控眼类便是上面用到的 d运营是做什么的作业内容是什么ns.lookup();另一个便是 dns.resolve()dns.运营总监reios下载solve*()。这儿之所以在查验代码中运用 dns.lookup监控怎样设备()ios模拟器 办法,是由于运营总监chrome直接下载运用 No监控dejs 中内置 http 模块的 http.request() 央求时,默许运用的便是该办法,而不是 dnschrome什么意思.resolve()

项目运用了 axios,而其在 Nodejs 环境下运用的是 http.requestaxios二次封装()axios怎样读 办法来建议 HTTP 央求。http.request() 会调用监控怎样衔接手机 net 模块中的 createConnection 办法来建立联接。net 模块创立联接时,默许的 looios下载kup 办法便是 dns.lookup()

function lookupAndConnect(self, options) {
// ...
const lookup = options.lookup || dns.lookup;
defaultTriggerAsyncIdScope(self[async_id_symbol], function() {
lookup(host, dnsopts, funct监控ion emitLookup(err, iios14桌面布局图片p, addressType) {
sios14elf.emchrome官方下载it('lookup', err, ip,ios14桌面布局图片 addrchrome手机版ios下载essTychrome什么意思pe, host);
// ...
});
});iOS
}

当然,lookup 办法是能够设置的,例如能够传入 dns.resolve() 或许自定义的办法。下图便是 Nodejs 官方文档中的阐明截图:

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

回到该缺陷。查验代码作业后,正axios央求常容器(下图左)的 DNS 查询耗时为 33 毫秒;缺陷容器的耗时为 5000 毫秒,差异极大。

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

那么是什么导致的耗时差异呢?

dns.lookup() 办法会运用体系的 /etc/resolvaxios.conf 配备文件。该文件中会设置 nameaxios同步恳求chrome什么意思server 的地址、超时时刻、重试次数、rotate 战略等。经过对比正常容器和缺陷容ios是什么意思器,发现了配备差异:

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

缺陷容器中(上图右)有个 nameserver 配备为了 10.62.38.ios退款17(正chromaxios原理e浏览器安卓版下载常容器是 10.6.6.6axios二次封chrome)。而 10.62.38.1运营是什么意思7 这个 nameserver监控摄像头 之前出现了问题,现已被替换掉了。可是在根底运营的薪酬一般是多少途径批量刷配备的操运营总监chrome插件作中,缺陷容器所属的宿主chrome安卓下载机或许丢掉或许失利了。chromebook定位到详细原因后,chrome联系了司内的容器化组织/运营途径的ios最好玩的手游同学,修改该配备后后缺陷就处理了。

5、总结

这个问题弯曲的点在于:其运营监控表象初看像是内存走漏,axios原理运营是什么意思而一般来说内存走漏都是代码 bug 导致的。但这个缺陷其实并非如此,实践是宿主机axios原理 DNS nameserver 的配备问chrome浏览器安卓版下载题。

原因大致便是,由于 Nodejs 中 DNS 查询axios二次封装耗时过长导致了央求堆积,上游服务与 Nodejs运营是做什么的 建立的联接也不会开释。所以在整个央求的生命周期中「监控他人微信聊天记录持有」的政策未被开释,堆内存中政策chrome官方下载不断增多,然后看起来像监控装置流程是「内存走漏」。


加餐:聊聊 N监控体系odejs 中 Dios8备忘录NS 查询与央求堆积

上面仍是只一个大概的分析和定位。在这一节会查验能更深化一些,将缺陷现象和 Node运营处理j运营是做什么的作业内容是什么s 结束细节联系起来。

关于 Nodejs 中 DNS 查询缺陷导致的服务不响应的问题,之前现已有文章论说了相似的问题:

  • node中央求超时的一些坑
  • NodeJS 中 DNS 查询的坑 & DNS cache 分析

下面再查验简略解释一下。

运用 http 模块的 http.request() 办法默许会运监控dns.ios14.4.1更新了什么lookup()Chrome 作为 DNS 查询的办法(这个在上中文也现已提到监控摄像头了)。axios面试题dns.lookup() 经过 binding 会调用到 Gaxios面试题etAddr运营商Info()监控体系监控家用长途手机

void GetAddrInfo(const Fu监控眼nctionCios14.4.2值得更新吗allbackInfo<Value&chromebookgt;&ios退款 args) {
// ...
int errChrome = req_wrap-&Chromegt;Dispatch(uv_getaddrinfo,
AfteraxiosGetAddrInfo,
*hochrome插件stname,
nullptrchromebook,ios模拟器
&监控装置流程hints);
if (err == 0)
// Release ownership of the pointe运营r allowing the ownership to be transferred
USE(raxios跨域eq_wrap.release()监控摄像头);监控体系
args.GetReturnValue().Set(axios原理err);
}

其间最重要的调用的便是 uv_getaddrinfo(),它会将 uv__getaddrinfo_work 提交运营是做什么的作运营助理的作业内容业内容是什么到线程池的作业任务中:

uv__work_submit(loop,
&ios下载rechrome手机版q->wios8备忘录oios模拟器rk_req,
UV__WORK_SLOW_IO,
uv__getaddrinfo_work,
uv__getaddrinfo_done);

运营是什么意思 uv__getaios14ddrinfo_work() 中就会运用 getaddrinfo 函数来做 DNS 查询:

staChrometic void uv__getaddrinfoiOS_work(strchrome安卓下载uct uv__w监控体系ork* w) {
uv_getaddrinfo_t* req;
int运营的薪酬一般是多少 err;
req = container_of(w,监控家用长途手机 uv_getaddrinfo_t, work_req);axios二次封装
err = getaddrinfo(req->host运营助理name,chrome安卓下载 req->service, req->hin运营的薪酬一般是多少ts,监控眼 &req->addrinfo);
req->retcode = uv__getaddios14rinfo_trchrome浏览器安卓版下载anslate_erroaxio运营s是什么r(err);
}

那么为什么会涉及到线程池概念ios下载呢?由于调用 getaddrinfo() 函数是一个同步调用,所以 l监控眼ibuv 会axios同步恳求经过线程池来结束 Nodejs 所需的异步 IO。线程池默许大小为 4,能够经过 UV_Tios体系HREADPOOL_SIZE 这个环境变量来配备,在 Nodejs v1axios二次封装4 中最大是 1024。

回到缺陷场景:

从正常进ios14程的监控数据看到,每分钟 Nodejs 进chrome直接下载程建议的央求大致为 150 个,也便是 1 秒 2.5 个。而在缺陷容器中,央求在 DNS 查询阶段就要耗时 5s。即便不考虑其他耗时也要 5s 才调发完一个央求。4 个线程均运营的薪酬一般是多少匀下来,也监控摄像头软件app下载便是 1 秒最多能处理 0.8 个央求。明显,2.5 要远大于 0.8,axios封装处理才谐和央求数量严峻不匹配监控体系。所以服务作业时刻越长,积压的央求数、联接数就越多。

到这axios是什么ios下载,还运营方式运营助理的作业内容有哪几种有几个问题能够再阐明下:

关于超时

关于 HTTP 央求,咱们一般会设置超时时刻。可是 Nodejs 建议的央求或许不会触发ios14.4.1更新了什么到超时,由监控家用长途手机此使得上游服务到 Nodejs 的联接不会及时断开。这是在运用 axios 时或许出现的问题。

由于 axio运营助理s 会依据 requset.setTimeout 来设置超时。之前的文章axios原理也分析过,它是不包括 DNS 查询时刻axios面试题的。从 Nodejs 官网文档中也能大致看出这个ios最好玩的手游意思。

【排障系列】DNS 查询导致的 Nodejs 服务疑似“内存走漏”问题

关于 DNS cache

Nodejs 自身不做 DNS 查询作监控摄像头用的缓存(一些评论也以为 cache 放在 userland 或许会合理些)。所以假定 getaddrinfo() 自身也没有 DNS cache(翻开 nscd 好像能够),Nodejs 就axios二次封装监控怎样装置chromebook每次运用域名做 httaxios面试题p 央求时,都会去央求运营形式有哪几种 DNS nam监控怎样装置eserver。上文缺陷中的状况便是如此。

当然axios怎样读,你也能够经过运用相似像 dnscache 这类包来做 monkey运营助理的作业内容 patch,在 JS 层为 DNS 查询监控他人微信聊天记录增加缓存;或许经过在 axios 中增加拦截器,运营结束缓监控存。不过运用缓存一定要chrome官方下载留神处理缓存过期chrome手机版的问题,能够运用 DNS server 回来的 TTL。不过有时这个值也不太可靠,或许会需求依据业务chromebooaxios同步恳求k运营是做什么的场景设置一个尽量小的值。总运营方式有哪几种归运用缓存一定要慎重!

关于 dns.resolve()/dns.resolve*()

监控文章之前的章节能够知道,dns.resolve(监控他人微信聊天记录)/dns.resolve*()dns.lookup() 的结束并不相chrome浏览器同。它们是依据 c-ares 结束的。

This is c-ares, anaxios和ajax差异 asy运营是什么意思nchronous resolver library. It is intended for applications which need to perform DNS qu运营方式有哪几种er监控眼ies without blocking运营助理, or need to perform multiple DNS queries in parallel.

http.request() 是支撑经过在chrome手机版 optionschrome安卓下载 中传入 lookup 配备来掩盖默许的 dns.looaxios怎样读kup 的。可是需求留神 dns.resolve()dns.looku监控家用长途手机p 存在的ios体系或许差异。

此外,它们ios14只是不用再运监控怎样联接手机用线程池,假定遇到像文中的缺陷,DNS 查询的耗时相同会很高,相同会有相似问题。

完。

往期【排障系列】文chrome安卓下载章:

  • npm script 实施”丢掉axios二次封装“ root 权限的问题
  • 记一次 Node gRPC 静态生成文件引发的问题