成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一起聊一聊如何計算 Node.js GC 負載

開發(fā) 前端
操作系統(tǒng)本身會計算每隔線程的 CPU 耗時,所以我們可以通過系統(tǒng)獲取這個數(shù)據(jù),然后計算出線程的 CPU 負載。

在 Node.js 中,我們關注的比較的是 CPU 負載,但是在有 GC 的語言中,GC 負載也是需要關注的一個指標,因為 GC 過高會影響我們應用的性能。本文介紹關于 GC 負載的一些內容。

如何獲取 GC 耗時

操作系統(tǒng)本身會計算每隔線程的 CPU 耗時,所以我們可以通過系統(tǒng)獲取這個數(shù)據(jù),然后計算出線程的 CPU 負載。但是 GC 不一樣,因為 GC 是應用層的一個概念,操作系統(tǒng)是不會感知的,在 Node.js 里,具體來說,是在 V8 里,也沒有 API 可以直接獲取 GC 的耗時,但是 V8 提供了一些 GC 的鉤子函數(shù),我們可以借助這些鉤子函數(shù)來計算出 GC 的負載。其原理和 CPU 負載類似。V8 提供了以下兩個鉤子函數(shù),分別在 GC 開始和結束時會執(zhí)行。

Isolate::GetCurrent()->AddGCPrologueCallback();
Isolate::GetCurrent()->AddGCEpilogueCallback();

通過這兩個函數(shù),我們就可以得到每一次 GC 的耗時,再不斷累積就可以計算出 GC 的總耗時,從而計算出 GC 負載。下面看一下核心實現(xiàn)。

static void BeforeGCCallback(Isolate* isolate,
                             v8::GCType gc_type,
                             v8::GCCallbackFlags flags,
                             void* data) {
    GCLoad* gc_load = static_cast<GCLoad*>(data);
    if (gc_load->current_gc_type != 0) {
        return;
    }
    gc_load->current_gc_type = gc_type;
    gc_load->start_time = uv_hrtime();
}

static void AfterGCCallback(Isolate* isolate,
                            v8::GCType gc_type,
                            v8::GCCallbackFlags flags,
                            void* data) {
    GCLoad* gc_load = static_cast<GCLoad*>(data);
    if (gc_load->current_gc_type != gc_type) {
        return;
    }
    gc_load->current_gc_type = 0;
    gc_load->total_time += uv_hrtime() - gc_load->start_time;
    gc_load->start_time = 0;
}

void GCLoad::Start(const FunctionCallbackInfo<Value>& args) {
    GCLoad* obj = ObjectWrap::Unwrap<GCLoad>(args.Holder());
    Isolate::GetCurrent()->AddGCPrologueCallback(BeforeGCCallback, static_cast<void*>(obj));
    Isolate::GetCurrent()->AddGCEpilogueCallback(AfterGCCallback, static_cast<void*>(obj));
}

可以看到思路很簡單,就是注冊兩個 GC 鉤子函數(shù),然后在 GC 開始鉤子中記錄開始時間,然后在 GC 結束鉤子中記錄結束時間,并算出一次 GC 的耗時,再累加起來,這樣就可以得到任意時刻 GC 的總耗時,但是拿到總耗時如何計算出 GC 負載呢?

如何計算 GC 負載

負載 = 過去一段時間內的消耗 / 過去的一段時間值,看看如何計算 GC 負載。

class GCLoad {
    lastTime;
    lastTotal;
    binding = null;
    start() {
        if (!this.binding) {
            this.binding = new binding.GCLoad();
            this.binding.start();
        }
    }
    stop() {
        if (this.binding) {
            this.binding.stop();
            this.binding = null;
        }
    }
    load() {
        if (this.binding) {
            const { lastTime, lastTotal } = this;
            const now = process.hrtime();
            const total = this.binding.total();
            this.lastTime = now;
            this.lastTotal = total;
            if (lastTime && lastTotal) {
                const cost = total - lastTotal;
                const interval = (now[0] - lastTime[0]) * 1e6 + (now[1] - lastTime[1]) / 1e3;
                return cost / interval;
            }
        }
    }
    total() {
        if (this.binding) {
            return this.binding.total();
        }
    }
}

計算算法也很簡單,就是記錄上次的時間和 GC 耗時,然后下次需要記錄某個時刻的 GC 負載時,就拿當前的耗時減去上次的耗時,并拿當前的時間減去上次的時間,然后得到過去一段時間內的耗時和過去的時間大小,一處就得到 GC 負載了。

使用

下面看看如何使用。

const { GCLoad } = require('..');
const gcLoad = new GCLoad();
gcLoad.start();
setInterval(() => {
    for (let i = 0; i < 1000; i++) {
        new Array(100);
    }
    gc();
    console.log(gcLoad.load());
}, 3000);

執(zhí)行上面代碼會(node --expose-gc demo.js) 在我電腦上輸出如下。

0.004235378248715853
0.004100483670865412
0.0017808558192331187
0.002371772559838465
0.0024768595957239477

這樣就可以得到了應用的 GC 負載。

完整代碼參考 https://github.com/theanarkh/nodejs-native-gc-load。

責任編輯:姜華 來源: 編程雜技
相關推薦

2023-09-29 08:58:38

2023-08-14 08:38:26

反射reflect結構體

2024-02-06 08:58:23

開源項目my-tv

2021-08-07 07:56:59

Node邏輯對象

2022-08-26 00:35:31

Java工作流系統(tǒng)

2022-08-22 09:20:05

Kubernetes工作負載管理

2022-10-08 11:33:56

邊緣計算云計算

2020-07-16 14:40:23

大數(shù)據(jù)計算框架

2021-10-12 23:45:43

NodeJs事件

2023-02-07 06:42:24

Pulsar負載均衡

2020-12-29 05:33:40

TomcatSpringBoot代碼

2022-02-16 10:25:36

邊緣計算數(shù)據(jù)中心網絡

2018-05-16 08:58:04

用戶畫像存儲

2020-11-05 09:27:48

JavaScript開發(fā)技術

2020-05-22 08:16:07

PONGPONXG-PON

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2018-06-07 13:17:12

契約測試單元測試API測試

2023-03-05 18:40:39

iptables防火墻軟件

2018-11-30 12:48:36

SDS故障硬件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 51ⅴ精品国产91久久久久久 | 狠狠干影院 | 欧美在线a| av片在线播放 | 亚洲综合区 | 美国一级黄色片 | 国产精品久久久久久久久久东京 | 亚洲一区精品在线 | 99精品视频一区二区三区 | 欧美黑人一级爽快片淫片高清 | 一区二区三区久久久 | 成人免费视频播放 | 久久久做| 嫩草黄色影院 | 国产亚洲成av人在线观看导航 | 水蜜桃亚洲一二三四在线 | 欧美成年黄网站色视频 | 午夜精品视频 | 欧美一级小视频 | 久久亚洲精品国产精品紫薇 | 久久性 | 欧美多人在线 | 黑人一级片视频 | 亚洲精品一区二区网址 | 国产毛片视频 | 精品国产91久久久久久 | 夜夜骑首页 | 欧美国产日韩在线观看成人 | 日韩中文字幕在线观看视频 | 91一区二区| 奇米四色在线观看 | 欧美日韩国产一区二区 | 国产综合久久 | 成人免费在线观看 | 欧美 日韩 国产 成人 在线 91 | 激情欧美日韩一区二区 | 亚洲天堂中文字幕 | 天天干视频| 免费观看黄网站 | 人人鲁人人莫人人爱精品 | 瑟瑟免费视频 |