精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊最近給 Node.js 提交的幾個PR

開發 前端
Node.js 在 12.7.0 版本里已經支持收集 HTTP Server 處理請求的耗時。在這個基礎上,我做的事情主要是支持收集發送一個 HTTP Request 到收到響應所需要的耗時。

最近因為工作中碰到的一些問題,希望給 Node.js 提交一些代碼來解決我碰到的問題,一共提交了 4 個 PR,目前一個已經在 17.8.0 中發布,一個剛合到主干,一個等 reviewer 回復,一個等 31 號 tsc 開會討論。總的來說,提交的代碼并不復雜,但是的確解決了我的問題,同時我覺得也是開發者需要的一些功能。下面介紹一下這幾個 PR 做的事情。

1.通過 perf_hooks 收集 HTTP 模塊的耗時

了解 HTTP Server 處理一個請求的耗時和發送一個 HTTP Request 到收到響應所需要的耗時是很多開發者都需要的,這些數據可以幫助我們了解我們服務的性能和網絡鏈路的情況。沒有 Node.js 的支持,開發者如果想收集這個數據會非常麻煩,每個開發者都需要實現開始請求前,記錄開始時間,拿到響應后記錄結束時間這些入侵業務邏輯的重復代碼,而 SDK 的提供者,則需要劫持 http 模塊來實現這樣的功能。Node.js 在 12.7.0 版本里已經支持收集 HTTP Server 處理請求的耗時。在這個基礎上,我做的事情主要是支持收集發送一個 HTTP Request 到收到響應所需要的耗時。具體實現如下。

ClientRequest.prototype._finish = function _finish() {
if (hasObserver('http')) {
this[kClientRequestStatistics] = {
startTime: process.hrtime(),
type: 'HttpClient',
};
}

};

首先在請求發送完畢后開始計時,如果開發者在通過 perf_hooks 收集 http 模塊的數據,那么就開始記錄請求的開始時間。然后收到 HTTP 響應并解析完請求行和請求頭時記錄結束時間。

function parserOnIncomingClient(res, shouldKeepAlive) {
emitStatistics(req[kClientRequestStatistics]);

}


function emitStatistics(statistics) {
if (!hasObserver('http') || statistics == null) return;
const startTime = statistics.startTime;
const diff = process.hrtime(startTime);
const entry = new InternalPerformanceEntry(
statistics.type,
'http',
startTime[0] * 1000 + startTime[1] / 1e6,
diff[0] * 1000 + diff[1] / 1e6,
undefined,
);
enqueue(entry);

}

最后通過 perf_hooks 機制通知用戶。接下來通過一個例子看看如何使用。

const { PerformanceObserver } = require('perf_hooks');

const http = require('http');

const obs = new PerformanceObserver((items) => {

items.getEntries().forEach((item) => {
console.log(item);
});

});

obs.observe({ entryTypes: ['http'] });



const PORT = 8080;

http.createServer((req, res) => {
res.end('ok');}).listen(PORT, () => {
http.get(`http://127.0.0.1:${PORT}`);

});

在上面的例子中我們可以通過 perf_hooks 模塊收集到兩個數據,分布是 server 處理請求的耗時和 client 經歷的耗時。

2.通過 perf_hooks 收集 TCP 連接和 DNS 解析的耗時

第一個 PR 合進去后,我覺得后續應該有很多地方可以通過 perf_hooks 機制進行數據的收集。接下來做的事情就是通過 perf_hooks 收集 TCP 連接和 DNS 解析的耗時。做性能分析和監控的時候,這部分的數據也是開發者感興趣的。這次實現了兩個通用的方式來處理一些公共的邏輯,希望后續其他地方收集數據的時候也可以復用。

function startPerf(target, key, context = {}) {
if (hasObserver(context.type)) {
target[key] = {
...context,
startTime: process.hrtime(),
};
}

}


function stopPerf(target, key, context = {}) {
const ctx = target[key];
if (ctx && hasObserver(ctx.type)) {
const startTime = ctx.startTime;
const diff = process.hrtime(startTime);
const entry = new InternalPerformanceEntry(
ctx.name,
ctx.type,
startTime[0] * 1000 + startTime[1] / 1e6,
diff[0] * 1000 + diff[1] / 1e6,
{ ...ctx.detail, ...context.detail },
);
enqueue(entry);
}

}

這兩個方式的邏輯很簡單,startPerf 是記錄操作的開始時間,并且記錄一些上下文,然后在 stopPerf 中再記錄操作的結束時間并合并上下文,最后通過 perf_hooks 機制通知開發者。另外只有在開發者注冊了 perf_hooks 的觀察者時才會執行這些邏輯,這樣對不開啟該功能的開發者就不會有性能的損耗。有了這兩個方式后,收集數據就變得簡單,只需要找到開始和結束的點,加入對應的函數就行。

function internalConnect() {
if (addressType === 6 || addressType === 4) {
startPerf(self, kPerfHooksNetConnectContext, { type: 'net', name: 'connect', detail: { host: address, port } });
}

}

internalConnect 是發起 TCP 請求的函數,目前只收集 TCP 連接的耗時,我們知道 net 模塊還包括了 IPC 的實現,但是 IPC 是基于本機的,連接的耗時通常很快,收集這個數據沒有太大意義。另外只有連接成功的時候才會被收集。具體在 afterConnect 函數。

function afterConnect(status, handle, req, readable, writable) {
if (status === 0) {
stopPerf(self, kPerfHooksNetConnectContext);
}

}

接下來看一個使用的例子。

const { PerformanceObserver } = require('perf_hooks');

const net = require('net');

const obs = new PerformanceObserver((items) => {

items.getEntries().forEach((item) => {
console.log(item);
});

});

obs.observe({ entryTypes: ['net'] });

const PORT = 8080;

net.createServer((socket) => {
socket.destroy();}).listen(PORT, () => {
net.connect(PORT);

});

通過上面的代碼,我們就可以收集到 TCP 連接的耗時。這個 PR 中除了支持收集 TCP 耗時,還支持了 DNS 解析的耗時,包括 Promise 化的 API。原理類似,不再具體介紹,看一個使用例子就可以。

const { PerformanceObserver } = require('perf_hooks');

const dns = require('dns');

const obs = new PerformanceObserver((items) => {

items.getEntries().forEach((item) => {
console.log(item);
});

});

obs.observe({ entryTypes: ['dns'] });
dns.lookup('localhost', () => {});
dns.promises.resolve('localhost');

這個 PR 目前已經被合到主干,下個版本應該就可以使用。

3.通過 perf_hooks 收集同步文件 API 耗時

這個 PR 一開始不是很想提,同步 API 很多,而我要做的事情就是在這些 API 開始和結束的時候記錄具體的時間,reviewer 也提了這個問題。

  • While I have no specific objection to this, I do wonder what this provides that wrapping the sync calls in performance.timerify wouldn't provide?

不過這個 PR 也不是為了提而提,我們經常收到業務反饋說事件循環延遲告警,但是不知道具體什么原因。我們很容易能監控到事件循環延遲,但是卻很難知道具體的原因,因為情況太多了。而同步文件操作就是其中一種情況,所以我們希望收集這個數據。但是我們發現在開發者層面很難做到這個事情。如果我是業務同學,那么我需要在每個同步 API 的前面加統計代碼,如果我是監控 SDK 提供者,那么我只能劫持文件模塊的 API。無論哪種方式都不是優雅的解決方案。但是如何在 Node.js 內核支持的話,情況就不一樣了,雖然只是簡單地把代碼移到 Node.js 里面,但是卻能很好地解決問題,每次用戶調用同步 API 的時候,無論是業務同學還是監控 SDK 提供者都能非常簡單地通過 perf_hooks 機制拿到這些 API 的耗時數據。所以我回復 reviewer 我提這個 PR 的理由。

  • I think if Node.js core provide this, user just need to new a observer by perf_hooks for collecting the cost time of fs sync api. otherwise, all users need to write some same code to do this. And if i want to provide a sdk to do this, i need to hijack the fs api.

使用方式也非常簡單。

const { PerformanceObserver } = require('perf_hooks');

const fs = require('fs');

const obs = new PerformanceObserver((items) => {

items.getEntries().forEach((item) => {
console.log(item);
});

});

obs.observe({ entryTypes: ['fs'] });
fs.readFileSync(__filename);

這樣我們就可以知道 readFileSync 的耗時。但是這個 PR 目前還沒有 approve。我還是希望 Node.js 能支持這個能力。

4.暴露 V8 的 trace API

Node.js 目前實現了 trace_events 模塊,里面有部分 trace 數據是通過 V8 提供的 trace API 實現的,但是 Node.js 目前沒有暴露出來,我做的事情就是把這個 API 暴露出來,這樣的好處是開發者可以利用 V8 的 trace 機制產生 trace 數據,并且可以通過 Node.js 的 trace_events 模塊和 inspector 模塊收集這些數據。因為我之前開發了一個 tracepoint 的庫來做這個事情,但是相比來說在 Node.js 里支持會好很多。但是 Node.js 同學說在使用這個 API 時和 V8 團隊達成了協議不會對外暴露給開發者,需要 tsc 討論這個事情,下面是回復。

  • Not sure we should do this. I mean, I generally prefer this, but when we added that trace API it was with the agreement with the v8 team that we would not expose a public API for it since they might still want to make changes to the underlying mechanism and exposing the public apis would make that more difficult.

最近 tsc 會討論這個事情,希望能支持這個功能。

總結

給大型的開源項目提交 PR 是一個很 cool 但是其實也挺不容易的過程。首先需要了解提 PR 的整個流程,接著需要去了解相關模塊的具體實現邏輯,比如我最近把 trace 模塊和 perf_hooks 模塊研究了一遍,然后才能確定怎么修改代碼,修改完之后還需要寫對應的測試,以及不能影響其他邏輯,都完成后還需要按照 reviewer 的建議進行反復修改,你的想法能得到 reviewer 的同意也不容易,比如我之前也提過 keepalive 和 so_resueport 的 PR,不過因為平臺兼容性的問題沒有被合進去,因為 Libuv 定位的是跨平臺的庫。但是,如果你提交成功一次,了解了整個過程之后,以后就會節約很多時間。最后附上四個 PR 的地址,有興趣的同學也可以看下。

https://github.com/nodejs/node/pull/42345

https://github.com/nodejs/node/pull/42390

https://github.com/nodejs/node/pull/42421

https://github.com/nodejs/node/pull/42462

責任編輯:武曉燕 來源: heanarkh
相關推薦

2021-09-26 05:06:04

Node.js模塊機制

2021-11-06 18:40:27

js底層模塊

2022-03-26 16:51:27

Node.jstrace架構

2021-09-26 22:22:42

js模塊Node

2021-10-22 08:29:14

JavaScript事件循環

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2021-12-25 22:29:57

Node.js 微任務處理事件循環

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2025-07-21 01:00:00

UDP性能QPS

2011-11-02 09:04:15

Node.js

2019-07-09 14:50:15

Node.js前端工具

2015-06-23 15:27:53

HproseNode.js
點贊
收藏

51CTO技術棧公眾號

色域天天综合网| 粉嫩av一区二区三区粉嫩| 亚洲美女福利视频网站| 无码人妻丰满熟妇区毛片| av黄色在线观看| 韩国午夜理伦三级不卡影院| 欧美激情日韩图片| 成人无码www在线看免费| 欧美xxx视频| 亚洲另类春色国产| 久久青青草综合| 中文字幕码精品视频网站| 欧美99在线视频观看| 日韩电影网在线| 91视频这里只有精品| 超碰在线99| 18成人在线视频| 免费在线一区二区| 亚洲av无码国产精品永久一区| 亚洲综合三区| 欧美精品久久久久久久| 五月天精品在线| 你懂的在线观看一区二区| 欧美色图免费看| 成人黄色av片| 亚洲国产精品精华素| 欧美激情一区二区在线| 国产伦精品一区二区三区视频黑人| 中文字幕有码视频| 久久九九电影| 91av在线播放| 久操视频免费在线观看| 天天射成人网| 中文字幕精品久久| 一本色道久久综合亚洲精品图片| 综合欧美亚洲| 91精品国产综合久久精品图片| 任你操这里只有精品| 麻豆免费在线| 五月天丁香久久| 成人小视频在线观看免费| 91在线直播| 国产欧美一区二区在线观看| 免费国产一区二区| 亚洲三区在线观看无套内射| 成人免费高清在线| 91免费人成网站在线观看18| 亚洲图片视频小说| 蜜桃视频一区二区三区| 国产91免费看片| 亚洲婷婷综合网| 亚洲免费播放| 91精品国产91久久久久久| 精品97人妻无码中文永久在线| 97久久夜色精品国产| 中文字幕无线精品亚洲乱码一区 | 91女神在线观看| 亚洲电影有码| 欧美亚洲一区二区三区四区| 午夜dv内射一区二区| 日日夜夜天天综合| 在线精品国精品国产尤物884a| 免费午夜视频在线观看| 成人亚洲欧美| 欧美丝袜丝交足nylons| jizz18女人| 国产精品一区免费在线 | 欧美一级片免费| 成人av免费观看| 韩日午夜在线资源一区二区| 日韩电影免费| 国产日韩一级二级三级| 亚洲欧洲精品在线观看| 黄色一级片在线观看| 亚洲乱码国产乱码精品精的特点| 国产视频在线观看网站| 国产美女精品写真福利视频| 日韩欧美在线免费| 91激情视频在线| 四虎国产精品成人免费影视| 日韩精品一区二区三区四区视频 | 日韩中文字幕| 精品国产91乱码一区二区三区| 少妇熟女视频一区二区三区 | 日韩免费av一区二区三区| 啊v视频在线| 亚洲精品成人精品456| 国产精品一线二线三线| 日韩久久一区二区三区| 欧美精品在线视频| 无码人妻精品一区二区三| 亚洲+变态+欧美+另类+精品| 在线视频欧美性高潮| 免费在线观看国产精品| 米奇777在线欧美播放| 91九色蝌蚪国产| 亚洲三级黄色片| 最新日韩av在线| 你真棒插曲来救救我在线观看| 成人开心激情| 精品噜噜噜噜久久久久久久久试看| 黄色片视频免费观看| 久久综合电影| 91精品国产91久久久久久久久| 亚洲天堂视频网| 99精品久久只有精品| 亚洲一区在线免费| 欧美aa免费在线| 日韩一区二区视频在线观看| 日韩人妻无码精品综合区| 欧美jjzz| 国产精品午夜视频| 无码精品人妻一区二区| 亚洲女爱视频在线| www.激情小说.com| 久久香蕉精品香蕉| 欧美精品亚州精品| 亚洲av无码不卡| aaa亚洲精品| 成人午夜免费剧场| 本网站久久精品| 日韩经典中文字幕| 精品一区二区三区人妻| 精品在线观看视频| 日韩国产欧美一区| 深夜成人在线| 精品成人在线观看| 欧美三级日本三级| 久久99久久精品| 天堂资源在线亚洲视频| 韩漫成人漫画| 亚洲男人的天堂在线播放| 国产一级视频在线播放| 国产一区二区在线视频| 一区二区三区四区五区精品 | 强迫凌虐淫辱の牝奴在线观看| 伊人久久大香线蕉精品组织观看| 国产精品亚洲欧美导航| 男人的天堂在线视频| 婷婷亚洲久悠悠色悠在线播放| 香蕉视频xxxx| 自拍偷拍欧美专区| 亚洲自拍中文字幕| 超碰在线网址| 日韩欧美成人一区| 久久久久久久久久91| 国产在线精品一区二区夜色| 在线精品亚洲一区二区| 日日夜夜综合| 久久天堂电影网| 精品久久久免费视频| 亚洲女同女同女同女同女同69| 亚洲第一区第二区第三区| 天天综合国产| 91黄在线观看| 国产精品69xx| 亚洲精品乱码久久久久久按摩观| 女人十八岁毛片| 久久综合久久久久88| 欧美日韩在线免费播放| 欧美日韩国产传媒| 国产欧美日韩精品专区| 日本在线视频观看| 欧美一级淫片007| 精品无码av在线| 91丨porny丨国产| 色综合天天色综合| 亚洲欧美偷拍自拍| 国产二区不卡| 自拍视频在线看| 国产一区二区三区直播精品电影| 波多野结衣绝顶大高潮| 18成人在线观看| 涩视频在线观看| 亚洲欧美激情诱惑| 亚洲免费视频一区| 成人网av.com/| 欧美黑人性视频| 亚洲欧美日韩精品永久在线| 色哦色哦哦色天天综合| 日韩精品久久久久久久的张开腿让| 精品一区二区三区的国产在线播放 | 日韩成人一级| 国产精品一二三在线| 老司机精品影院| 精品福利视频一区二区三区| 日韩特级黄色片| 国产精品你懂的在线| a级大片免费看| 久久xxxx精品视频| youjizz.com亚洲| 林ゆな中文字幕一区二区| 国产精品入口免费视频一| 男人添女人下部高潮视频在线观看| 日韩精品视频三区| 一级特黄aaa大片在线观看| 亚洲国产一区视频| 高清国产在线观看| 成人不卡免费av| 最新中文字幕2018| 日韩五码在线| 一区在线电影| 网曝91综合精品门事件在线| 91精品国产自产在线观看永久| 17videosex性欧美| 久久精品国产2020观看福利| 亚洲 美腿 欧美 偷拍| 欧美肥胖老妇做爰| 日本视频网站在线观看| 亚洲自拍另类综合| 任我爽在线视频| 久久蜜桃av一区精品变态类天堂 | 国产真实老熟女无套内射| 日本不卡免费一区| 好吊色欧美一区二区三区四区| 涩涩涩久久久成人精品| 日韩av电影免费观看高清| 欧美videossex另类| 日韩在线观看免费网站| 色吊丝在线永久观看最新版本| 欧美一级黄色录像| 在线免费观看高清视频| 色域天天综合网| 日韩三级免费看| 亚洲自拍偷拍综合| 澳门黄色一级片| 综合久久久久综合| eeuss中文字幕| 国产欧美精品一区二区色综合| 看全色黄大色黄女片18| 国产成人久久精品77777最新版本| 91极品视频在线观看| 日欧美一区二区| 青青视频在线播放| 亚洲精品人人| 欧美久久在线观看| av在线播放中文字幕| 五月激激激综合网色播| 国产精选在线观看91| 欧美激情不卡| 国产精品日韩久久久久| 日韩电影av| 91成人在线视频| 免费h视频在线观看| 欧美高清无遮挡| 91三级在线| 美女啪啪无遮挡免费久久网站| 亚洲s色大片| 中文字幕av一区中文字幕天堂| 国产视频三级在线观看播放| 亚洲男女性事视频| 精品999视频| 在线观看不卡av| 午夜老司机在线观看| 久久精品小视频| 国产黄色小视频在线| 久久精视频免费在线久久完整在线看| 日本高清在线观看wwwww色| 日日摸夜夜添一区| 国产精品一卡二卡三卡 | 黄色录像a级片| 91蜜桃免费观看视频| 国产手机在线观看| 中文一区在线播放| av网站在线不卡| 国产寡妇亲子伦一区二区三区四区| 国产专区在线播放| 欧美理论电影大全| 国产成人午夜视频| 欧美三级蜜桃2在线观看| 欧美激情视频网| 加勒比海盗1在线观看免费国语版| 精品99在线观看| 日韩 国产 欧美| 在线视频三区| 国产欧美日韩免费观看| 欧美三级视频在线播放| 国产在线观看成人| 欧美性生活大片免费观看网址 | 自拍视频在线观看一区二区| 天天做夜夜爱爱爱| 亚洲一二三区在线观看| 五月天婷婷久久| 欧美在线不卡一区| 国产黄色片网站| 日韩电影网在线| 日本三级视频在线播放| 久久久久久999| 欧美人与性动交xxⅹxx| 91久久国产精品| 亚洲精品无吗| 男人的天堂成人| 亚洲一区欧美二区| 日本高清一区二区视频| av一区二区三区在线| 日韩一级片在线免费观看| 亚洲综合一区二区三区| 一级片在线免费播放| 日韩欧美国产1| 精品电影在线| 欧美激情亚洲综合一区| 成人做爰视频www网站小优视频| 成人免费黄色网| 嫩草影视亚洲| 欧美黄网在线观看| 久久综合九色| 久久久无码人妻精品无码| 中文字幕av资源一区| 日本一级黄色录像| 91精品国产综合久久久久久| 日本在线视频1区| 久久国产色av| 国产成人久久精品麻豆二区| 精品国产一区二区三区四区vr| 久久精品国产大片免费观看| 91成人在线观看喷潮教学| 久久 天天综合| 一级黄色性视频| 亚洲福利一区二区三区| 国产免费不卡av| 中文欧美日本在线资源| 欧美激情网站| 国产高清一区视频| 欧美成人69av| 亚洲天堂伊人网| 国产精品色噜噜| 亚洲av无码不卡| 亚洲图片欧美午夜| 性xxxxfreexxxxx欧美丶| 99热在线国产| 午夜久久99| 色婷婷激情视频| 国产精品久久国产精麻豆99网站| 亚洲av无码不卡| 亚洲欧洲午夜一线一品| 原纱央莉成人av片| 精品久久久久久一区| 欧美午夜影院| 69久久精品无码一区二区| 综合色中文字幕| 国产精品毛片一区视频播 | 日本欧美一区二区三区不卡视频| 欧美日韩国产中字| 天堂在线观看av| 97精品国产91久久久久久| 久久影院资源站| 老太脱裤子让老头玩xxxxx| 成人av网站免费观看| 亚洲精品在线观看av| 欧美白人最猛性xxxxx69交| 在线免费观看污| caoporn国产精品免费公开| 国产精品九九| 性色av蜜臀av浪潮av老女人| 亚洲国产综合色| 性插视频在线观看| 欧洲中文字幕国产精品| 国产精品手机在线播放| 久久国产色av免费观看| 国产精品视频麻豆| 国产孕妇孕交大片孕| 美女撒尿一区二区三区| 亚洲一区二区三区中文字幕在线观看 | 免费国产羞羞网站视频| 高清欧美性猛交xxxx黑人猛交| 久久99精品久久久久久欧洲站| 国产一区二区三区精彩视频| 久久精品亚洲精品国产欧美kt∨ | 日韩欧美亚洲国产另类| 好看的中文字幕在线播放| 激情久久av| 视频一区视频二区在线观看| 成人做爰视频网站| 精品少妇一区二区| 在线看片福利| 亚洲视频在线观看日本a| 国产精品一区在线观看乱码| 国产无套内射又大又猛又粗又爽| 日韩国产高清视频在线| 国产精品毛片久久久久久久久久99999999| 亚洲午夜精品一区二区三区| 国产福利91精品一区二区三区| 午夜精品久久久久久久久久久久久蜜桃| 亚洲精品中文字幕有码专区| 欧美黑粗硬大| 草b视频在线观看| 亚洲国产精华液网站w| 精品国产亚洲av麻豆| 5566成人精品视频免费| 97精品视频| 狠狠人妻久久久久久综合蜜桃| 欧美日韩国产免费一区二区| 欧美24videosex性欧美| 神马影院我不卡| 成人综合激情网| 伊人久久一区二区| 欧美精品激情在线观看| 97精品视频在线看| 日本黄色片在线播放| 欧美酷刑日本凌虐凌虐|