国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

eBPF 入門實(shí)踐教程十五:使用 USDT 捕獲用戶態(tài) Java GC 事件耗時(shí)

這篇具有很好參考價(jià)值的文章主要介紹了eBPF 入門實(shí)踐教程十五:使用 USDT 捕獲用戶態(tài) Java GC 事件耗時(shí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

eBPF (擴(kuò)展的伯克利數(shù)據(jù)包過(guò)濾器) 是一項(xiàng)強(qiáng)大的網(wǎng)絡(luò)和性能分析工具,被廣泛應(yīng)用在 Linux 內(nèi)核上。eBPF 使得開(kāi)發(fā)者能夠動(dòng)態(tài)地加載、更新和運(yùn)行用戶定義的代碼,而無(wú)需重啟內(nèi)核或更改內(nèi)核源代碼。這個(gè)特性使得 eBPF 能夠提供極高的靈活性和性能,使其在網(wǎng)絡(luò)和系統(tǒng)性能分析方面具有廣泛的應(yīng)用。此外,eBPF 還支持使用 USDT (用戶級(jí)靜態(tài)定義跟蹤點(diǎn)) 捕獲用戶態(tài)的應(yīng)用程序行為。

在我們的 eBPF 入門實(shí)踐教程系列的這一篇,我們將介紹如何使用 eBPF 和 USDT 來(lái)捕獲和分析 Java 的垃圾回收 (GC) 事件的耗時(shí)。

USDT 介紹

USDT 是一種在應(yīng)用程序中插入靜態(tài)跟蹤點(diǎn)的機(jī)制,它允許開(kāi)發(fā)者在程序的關(guān)鍵位置插入可用于調(diào)試和性能分析的探針。這些探針可以在運(yùn)行時(shí)被 DTrace、SystemTap 或 eBPF 等工具動(dòng)態(tài)激活,從而在不重啟應(yīng)用程序或更改程序代碼的情況下,獲取程序的內(nèi)部狀態(tài)和性能指標(biāo)。USDT 在很多開(kāi)源軟件,如 MySQL、PostgreSQL、Ruby、Python 和 Node.js 等都有廣泛的應(yīng)用。

用戶層面的追蹤機(jī)制:用戶級(jí)動(dòng)態(tài)跟蹤和 USDT

在用戶層面進(jìn)行動(dòng)態(tài)跟蹤,即用戶級(jí)動(dòng)態(tài)跟蹤(User-Level Dynamic Tracing)允許我們對(duì)任何用戶級(jí)別的代碼進(jìn)行插樁。比如,我們可以通過(guò)在 MySQL 服務(wù)器的 dispatch_command() 函數(shù)上進(jìn)行插樁,來(lái)跟蹤服務(wù)器的查詢請(qǐng)求:

# ./uprobe 'p:cmd /opt/bin/mysqld:_Z16dispatch_command19enum_server_commandP3THDPcj +0(%dx):string'
Tracing uprobe cmd (p:cmd /opt/bin/mysqld:0x2dbd40 +0(%dx):string). Ctrl-C to end.
  mysqld-2855  [001] d... 19957757.590926: cmd: (0x6dbd40) arg1="show tables"
  mysqld-2855  [001] d... 19957759.703497: cmd: (0x6dbd40) arg1="SELECT * FROM numbers"
[...]

這里我們使用了 uprobe 工具,它利用了 Linux 的內(nèi)置功能:ftrace(跟蹤器)和 uprobes(用戶級(jí)動(dòng)態(tài)跟蹤,需要較新的 Linux 版本,例如 4.0 左右)。其他的跟蹤器,如 perf_events 和 SystemTap,也可以實(shí)現(xiàn)此功能。

許多其他的 MySQL 函數(shù)也可以被跟蹤以獲取更多的信息。我們可以列出和計(jì)算這些函數(shù)的數(shù)量:

# ./uprobe -l /opt/bin/mysqld | more
account_hash_get_key
add_collation
add_compiled_collation
add_plugin_noargs
adjust_time_range
[...]
# ./uprobe -l /opt/bin/mysqld | wc -l
21809

這有 21,000 個(gè)函數(shù)。我們也可以跟蹤庫(kù)函數(shù),甚至是單個(gè)的指令偏移。

用戶級(jí)動(dòng)態(tài)跟蹤的能力是非常強(qiáng)大的,它可以解決無(wú)數(shù)的問(wèn)題。然而,使用它也有一些困難:需要確定需要跟蹤的代碼,處理函數(shù)參數(shù),以及應(yīng)對(duì)代碼的更改。

用戶級(jí)靜態(tài)定義跟蹤(User-level Statically Defined Tracing, USDT)則可以在某種程度上解決這些問(wèn)題。USDT 探針(或者稱為用戶級(jí) “marker”)是開(kāi)發(fā)者在代碼的關(guān)鍵位置插入的跟蹤宏,提供穩(wěn)定且已經(jīng)過(guò)文檔說(shuō)明的 API。這使得跟蹤工作變得更加簡(jiǎn)單。

使用 USDT,我們可以簡(jiǎn)單地跟蹤一個(gè)名為 mysql:query__start 的探針,而不是去跟蹤那個(gè)名為 _Z16dispatch_command19enum_server_commandP3THDPcj 的 C++ 符號(hào),也就是 dispatch_command() 函數(shù)。當(dāng)然,我們?nèi)匀豢梢栽谛枰臅r(shí)候去跟蹤 dispatch_command() 以及

其他 21,000 個(gè) mysqld 函數(shù),但只有當(dāng) USDT 探針無(wú)法解決問(wèn)題的時(shí)候我們才需要這么做。

在 Linux 中的 USDT,無(wú)論是哪種形式的靜態(tài)跟蹤點(diǎn),其實(shí)都已經(jīng)存在了幾十年。它最近由于 Sun 的 DTrace 工具的流行而再次受到關(guān)注,這使得許多常見(jiàn)的應(yīng)用程序,包括 MySQL、PostgreSQL、Node.js、Java 等都加入了 USDT。SystemTap 則開(kāi)發(fā)了一種可以消費(fèi)這些 DTrace 探針的方式。

你可能正在運(yùn)行一個(gè)已經(jīng)包含了 USDT 探針的 Linux 應(yīng)用程序,或者可能需要重新編譯(通常是 --enable-dtrace)。你可以使用 readelf 來(lái)進(jìn)行檢查,例如對(duì)于 Node.js:

# readelf -n node
[...]
Notes at offset 0x00c43058 with length 0x00000494:
  Owner                 Data size   Description
  stapsdt              0x0000003c   NT_STAPSDT (SystemTap probe descriptors)
    Provider: node
    Name: gc__start
    Location: 0x0000000000bf44b4, Base: 0x0000000000f22464, Semaphore: 0x0000000001243028
    Arguments: 4@%esi 4@%edx 8@%rdi
[...]
  stapsdt              0x00000082       NT_STAPSDT (SystemTap probe descriptors)
    Provider: node
    Name: http__client__request
    Location: 0x0000000000bf48ff, Base: 0x0000000000f22464, Semaphore: 0x0000000001243024
    Arguments: 8@%rax 8@%rdx 8@-136(%rbp) -4@-140(%rbp) 8@-72(%rbp) 8@-80(%rbp) -4@-144(%rbp)
[...]

這就是使用 --enable-dtrace 重新編譯的 node,以及安裝了提供 “dtrace” 功能來(lái)構(gòu)建 USDT 支持的 systemtap-sdt-dev 包。這里顯示了兩個(gè)探針:node:gc__start(開(kāi)始進(jìn)行垃圾回收)和 node:http__client__request。

在這一點(diǎn)上,你可以使用 SystemTap 或者 LTTng 來(lái)跟蹤這些探針。然而,內(nèi)置的 Linux 跟蹤器,比如 ftrace 和 perf_events,目前還無(wú)法做到這一點(diǎn)(盡管 perf_events 的支持正在開(kāi)發(fā)中)。

Java GC 介紹

Java 作為一種高級(jí)編程語(yǔ)言,其自動(dòng)垃圾回收(GC)是其核心特性之一。Java GC 的目標(biāo)是自動(dòng)地回收那些不再被程序使用的內(nèi)存空間,從而減輕程序員在內(nèi)存管理方面的負(fù)擔(dān)。然而,GC 過(guò)程可能會(huì)引發(fā)應(yīng)用程序的停頓,對(duì)程序的性能和響應(yīng)時(shí)間產(chǎn)生影響。因此,對(duì) Java GC 事件進(jìn)行監(jiān)控和分析,對(duì)于理解和優(yōu)化 Java 應(yīng)用的性能是非常重要的。

在接下來(lái)的教程中,我們將演示如何使用 eBPF 和 USDT 來(lái)監(jiān)控和分析 Java GC 事件的耗時(shí),希望這些內(nèi)容對(duì)你在使用 eBPF 進(jìn)行應(yīng)用性能分析方面的工作有所幫助。

eBPF 實(shí)現(xiàn)機(jī)制

Java GC 的 eBPF 程序分為內(nèi)核態(tài)和用戶態(tài)兩部分,我們會(huì)分別介紹這兩部分的實(shí)現(xiàn)機(jī)制。

內(nèi)核態(tài)程序

/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
/* Copyright (c) 2022 Chen Tao */
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_core_read.h>
#include <bpf/usdt.bpf.h>
#include "javagc.h"

struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 100);
    __type(key, uint32_t);
    __type(value, struct data_t);
} data_map SEC(".maps");

struct {
    __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
    __type(key, int);
    __type(value, int);
} perf_map SEC(".maps");

__u32 time;

static int gc_start(struct pt_regs *ctx)
{
    struct data_t data = {};

    data.cpu = bpf_get_smp_processor_id();
    data.pid = bpf_get_current_pid_tgid() >> 32;
    data.ts = bpf_ktime_get_ns();
    bpf_map_update_elem(&data_map, &data.pid, &data, 0);
    return 0;
}

static int gc_end(struct pt_regs *ctx)
{
    struct data_t data = {};
    struct data_t *p;
    __u32 val;

    data.cpu = bpf_get_smp_processor_id();
    data.pid = bpf_get_current_pid_tgid() >> 32;
    data.ts = bpf_ktime_get_ns();
    p = bpf_map_lookup_elem(&data_map, &data.pid);
    if (!p)
        return 0;

    val = data.ts - p->ts;
    if (val > time) {
        data.ts = val;
        bpf_perf_event_output(ctx, &perf_map, BPF_F_CURRENT_CPU, &data, sizeof(data));
    }
    bpf_map_delete_elem(&data_map, &data.pid);
    return 0;
}

SEC("usdt")
int handle_gc_start(struct pt_regs *ctx)
{
    return gc_start(ctx);
}

SEC("usdt")
int handle_gc_end(struct pt_regs *ctx)
{
    return gc_end(ctx);
}

SEC("usdt")
int handle_mem_pool_gc_start(struct pt_regs *ctx)
{
    return gc_start(ctx);
}

SEC("usdt")
int handle_mem_pool_gc_end(struct pt_regs *ctx)
{
    return gc_end(ctx);
}

char LICENSE[] SEC("license") = "Dual BSD/GPL";

首先,我們定義了兩個(gè)映射(map):

  • data_map:這個(gè) hashmap 存儲(chǔ)每個(gè)進(jìn)程 ID 的垃圾收集開(kāi)始時(shí)間。data_t 結(jié)構(gòu)體包含進(jìn)程 ID、CPU ID 和時(shí)間戳。
  • perf_map:這是一個(gè) perf event array,用于將數(shù)據(jù)發(fā)送回用戶態(tài)程序。

然后,我們有四個(gè)處理函數(shù):gc_start、gc_end 和兩個(gè) USDT 處理函數(shù) handle_mem_pool_gc_starthandle_mem_pool_gc_end。這些函數(shù)都用 BPF 的 SEC("usdt") 宏注解,以便在 Java 進(jìn)程中捕獲到與垃圾收集相關(guān)的 USDT 事件。

gc_start 函數(shù)在垃圾收集開(kāi)始時(shí)被調(diào)用。它首先獲取當(dāng)前的 CPU ID、進(jìn)程 ID 和時(shí)間戳,然后將這些數(shù)據(jù)存入 data_map

gc_end 函數(shù)在垃圾收集結(jié)束時(shí)被調(diào)用。它執(zhí)行與 gc_start 類似的操作,但是它還從 data_map 中檢索開(kāi)始時(shí)間,并計(jì)算垃圾收集的持續(xù)時(shí)間。如果持續(xù)時(shí)間超過(guò)了設(shè)定的閾值(變量 time),那么它將數(shù)據(jù)發(fā)送回用戶態(tài)程序。

handle_gc_starthandle_gc_end 是針對(duì)垃圾收集開(kāi)始和結(jié)束事件的處理函數(shù),它們分別調(diào)用了 gc_startgc_end。

handle_mem_pool_gc_starthandle_mem_pool_gc_end 是針對(duì)內(nèi)存池的垃圾收集開(kāi)始和結(jié)束事件的處理函數(shù),它們也分別調(diào)用了 gc_startgc_end。

最后,我們有一個(gè) LICENSE 數(shù)組,聲明了該 BPF 程序的許可證,這是加載 BPF 程序所必需的。

用戶態(tài)程序

用戶態(tài)程序的主要目標(biāo)是加載和運(yùn)行eBPF程序,以及處理來(lái)自內(nèi)核態(tài)程序的數(shù)據(jù)。它是通過(guò) libbpf 庫(kù)來(lái)完成這些操作的。這里我們省略了一些通用的加載和運(yùn)行 eBPF 程序的代碼,只展示了與 USDT 相關(guān)的部分。

第一個(gè)函數(shù) get_jvmso_path 被用來(lái)獲取運(yùn)行的Java虛擬機(jī)(JVM)的 libjvm.so 庫(kù)的路徑。首先,它打開(kāi)了 /proc/<pid>/maps 文件,該文件包含了進(jìn)程地址空間的內(nèi)存映射信息。然后,它在文件中搜索包含 libjvm.so 的行,然后復(fù)制該行的路徑到提供的參數(shù)中。

static int get_jvmso_path(char *path)
{
    char mode[16], line[128], buf[64];
    size_t seg_start, seg_end, seg_off;
    FILE *f;
    int i = 0;

    sprintf(buf, "/proc/%d/maps", env.pid);
    f = fopen(buf, "r");
    if (!f)
        return -1;

    while (fscanf(f, "%zx-%zx %s %zx %*s %*d%[^\n]\n",
            &seg_start, &seg_end, mode, &seg_off, line) == 5) {
        i = 0;
        while (isblank(line[i]))
            i++;
        if (strstr(line + i, "libjvm.so")) {
            break;
        }
    }

    strcpy(path, line + i);
    fclose(f);

    return 0;
}

接下來(lái),我們看到的是將 eBPF 程序(函數(shù) handle_gc_starthandle_gc_end)附加到Java進(jìn)程的相關(guān)USDT探針上。每個(gè)程序都通過(guò)調(diào)用 bpf_program__attach_usdt 函數(shù)來(lái)實(shí)現(xiàn)這一點(diǎn),該函數(shù)的參數(shù)包括BPF程序、進(jìn)程ID、二進(jìn)制路徑以及探針的提供者和名稱。如果探針掛載成功,bpf_program__attach_usdt 將返回一個(gè)鏈接對(duì)象,該對(duì)象將存儲(chǔ)在skeleton的鏈接成員中。如果掛載失敗,程序?qū)⒋蛴″e(cuò)誤消息并進(jìn)行清理。

    skel->links.handle_mem_pool_gc_start = bpf_program__attach_usdt(skel->progs.handle_gc_start, env.pid,
                                    binary_path, "hotspot", "mem__pool__gc__begin", NULL);
    if (!skel->links.handle_mem_pool_gc_start) {
        err = errno;
        fprintf(stderr, "attach usdt mem__pool__gc__begin failed: %s\n", strerror(err));
        goto cleanup;
    }

    skel->links.handle_mem_pool_gc_end = bpf_program__attach_usdt(skel->progs.handle_gc_end, env.pid,
                                binary_path, "hotspot", "mem__pool__gc__end", NULL);
    if (!skel->links.handle_mem_pool_gc_end) {
        err = errno;
        fprintf(stderr, "attach usdt mem__pool__gc__end failed: %s\n", strerror(err));
        goto cleanup;
    }

    skel->links.handle_gc_start = bpf_program__attach_usdt(skel->progs.handle_gc_start, env.pid,
                                    binary_path, "hotspot", "gc__begin", NULL);
    if (!skel->links.handle_gc_start) {
        err = errno;
        fprintf(stderr, "attach usdt gc__begin failed: %s\n", strerror(err));
        goto cleanup;
    }

    skel->links.handle_gc_end = bpf_program__attach_usdt(skel->progs.handle_gc_end, env.pid,
                binary_path, "hotspot", "gc__end", NULL);
    if (!skel->links.handle_gc_end) {
        err = errno;
        fprintf(stderr, "attach usdt gc__end failed: %s\n", strerror(err));
        goto cleanup;
    }

最后一個(gè)函數(shù) handle_event 是一個(gè)回調(diào)函數(shù),用于處理從perf event array收到的數(shù)據(jù)。這個(gè)函數(shù)會(huì)被 perf event array 觸發(fā),并在每次接收到新的事件時(shí)調(diào)用。函數(shù)首先將數(shù)據(jù)轉(zhuǎn)換為 data_t 結(jié)構(gòu)體,然后將當(dāng)前時(shí)間格式化為字符串,并打印出事件的時(shí)間戳、CPU ID、進(jìn)程 ID,以及垃圾回收的持續(xù)時(shí)間。

static void handle_event(void *ctx, int cpu, void *data, __u32 data_sz)
{
    struct data_t *e = (struct data_t *)data;
    struct tm *tm = NULL;
    char ts[16];
    time_t t;

    time(&t);
    tm = localtime(&t);
    strftime(ts, sizeof(ts), "%H:%M:%S", tm);
    printf("%-8s %-7d %-7d %-7lld\n", ts, e->cpu, e->pid, e->ts/1000);
}

安裝依賴

構(gòu)建示例需要 clang、libelf 和 zlib。包名在不同的發(fā)行版中可能會(huì)有所不同。

在 Ubuntu/Debian 上,你需要執(zhí)行以下命令:

sudo apt install clang libelf1 libelf-dev zlib1g-dev

在 CentOS/Fedora 上,你需要執(zhí)行以下命令:

sudo dnf install clang elfutils-libelf elfutils-libelf-devel zlib-devel

編譯運(yùn)行

在對(duì)應(yīng)的目錄中,運(yùn)行 Make 即可編譯運(yùn)行上述代碼:

$ make
$ sudo ./javagc -p 12345
Tracing javagc time... Hit Ctrl-C to end.
TIME     CPU     PID     GC TIME
10:00:01 10%     12345   50ms
10:00:02 12%     12345   55ms
10:00:03 9%      12345   47ms
10:00:04 13%     12345   52ms
10:00:05 11%     12345   50ms

完整源代碼:

  • https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/15-javagc

參考資料:

  • https://www.brendangregg.com/blog/2015-07-03/hacking-linux-usdt-ftrace.html
  • https://github.com/iovisor/bcc/blob/master/libbpf-tools/javagc.c

總結(jié)

通過(guò)本篇 eBPF 入門實(shí)踐教程,我們學(xué)習(xí)了如何使用 eBPF 和 USDT 動(dòng)態(tài)跟蹤和分析 Java 的垃圾回收(GC)事件。我們了解了如何在用戶態(tài)應(yīng)用程序中設(shè)置 USDT 跟蹤點(diǎn),以及如何編寫 eBPF 程序來(lái)捕獲這些跟蹤點(diǎn)的信息,從而更深入地理解和優(yōu)化 Java GC 的行為和性能。

此外,我們也介紹了一些關(guān)于 Java GC、USDT 和 eBPF 的基礎(chǔ)知識(shí)和實(shí)踐技巧,這些知識(shí)和技巧對(duì)于想要在網(wǎng)絡(luò)和系統(tǒng)性能分析領(lǐng)域深入研究的開(kāi)發(fā)者來(lái)說(shuō)是非常有價(jià)值的。

如果您希望學(xué)習(xí)更多關(guān)于 eBPF 的知識(shí)和實(shí)踐,可以訪問(wèn)我們的教程代碼倉(cāng)庫(kù) https://github.com/eunomia-bpf/bpf-developer-tutorial 以獲取更多示例和完整的教程。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-470387.html

到了這里,關(guān)于eBPF 入門實(shí)踐教程十五:使用 USDT 捕獲用戶態(tài) Java GC 事件耗時(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 玩轉(zhuǎn)區(qū)塊鏈-java TRC20USDT 轉(zhuǎn)賬實(shí)踐

    otc、ctc。。??捎?1.轉(zhuǎn)帳usdt 2.轉(zhuǎn)帳 trx 3.查詢交易狀態(tài)

    2024年02月08日
    瀏覽(23)
  • Swift Combine 通過(guò)用戶輸入更新聲明式 UI 從入門到精通十五

    Swift Combine 通過(guò)用戶輸入更新聲明式 UI 從入門到精通十五

    Combine 系列 Swift Combine 從入門到精通一 Swift Combine 發(fā)布者訂閱者操作者 從入門到精通二 Swift Combine 管道 從入門到精通三 Swift Combine 發(fā)布者publisher的生命周期 從入門到精通四 Swift Combine 操作符operations和Subjects發(fā)布者的生命周期 從入門到精通五 Swift Combine 訂閱者Subscriber的生命周

    2024年02月20日
    瀏覽(25)
  • 系統(tǒng)架構(gòu)設(shè)計(jì)師教程(十五)面向服務(wù)架構(gòu)設(shè)計(jì)理論與實(shí)踐

    面向服務(wù)的體系結(jié)構(gòu) (Service-Oriented Architecture, SOA) 是一種應(yīng)用框架,它將業(yè)務(wù)應(yīng)用劃分為獨(dú)立的業(yè)務(wù)功能和流程(服務(wù)),并通過(guò)定義良好的接口和契約將這些服務(wù)聯(lián)系起來(lái)。SOA 提供了業(yè)務(wù)流程的靈活性,使企業(yè)能夠更快速地發(fā)展、降低總體擁有成本,并改善對(duì)準(zhǔn)確信息的訪

    2024年01月25日
    瀏覽(89)
  • 【實(shí)戰(zhàn)】 八、用戶選擇器與項(xiàng)目編輯功能(下) —— React17+React Hook+TS4 最佳實(shí)踐,仿 Jira 企業(yè)級(jí)項(xiàng)目(十五)

    學(xué)習(xí)內(nèi)容來(lái)源:React + React Hook + TS 最佳實(shí)踐-慕課網(wǎng) 相對(duì)原教程,我在學(xué)習(xí)開(kāi)始時(shí)(2023.03)采用的是當(dāng)前最新版本: 項(xiàng) 版本 react react-dom ^18.2.0 react-router react-router-dom ^6.11.2 antd ^4.24.8 @commitlint/cli @commitlint/config-conventional ^17.4.4 eslint-config-prettier ^8.6.0 husky ^8.0.3 lint-staged ^13.1.2 p

    2024年02月15日
    瀏覽(25)
  • 基于 eBPF 的 Kubernetes 可觀測(cè)實(shí)踐

    基于 eBPF 的 Kubernetes 可觀測(cè)實(shí)踐

    可觀測(cè)是為了解決問(wèn)題,所以在聊可觀測(cè)之前,應(yīng)先對(duì)問(wèn)題排查的普適原則進(jìn)行了解。 問(wèn)題排查的原則 以排查系統(tǒng)問(wèn)題為例,要理解系統(tǒng),要先關(guān)注基礎(chǔ)知識(shí),理解編程語(yǔ)言基本的計(jì)算機(jī)科學(xué)知識(shí),關(guān)注系統(tǒng)大圖比如架構(gòu)部署和重大流程,要關(guān)注運(yùn)行細(xì)節(jié),要對(duì)核心功能的

    2024年01月19日
    瀏覽(20)
  • VPN入門教程:基本概念、使用方法及思科模擬器實(shí)踐

    VPN入門教程:基本概念、使用方法及思科模擬器實(shí)踐

    數(shù)據(jù)來(lái)源 ????????本文僅用于信息安全的學(xué)習(xí),請(qǐng)遵守相關(guān)法律法規(guī),嚴(yán)禁用于非法途徑。若觀眾因此作出任何危害網(wǎng)絡(luò)安全的行為,后果自負(fù),與本人無(wú)關(guān)。 VPN可以實(shí)現(xiàn)在不安全的網(wǎng)絡(luò)上,安全的傳輸數(shù)據(jù),類似專網(wǎng) VPN只是一個(gè)技術(shù),使用PKI技術(shù),來(lái)保證數(shù)據(jù)的安全三

    2024年02月08日
    瀏覽(25)
  • eBPF內(nèi)核技術(shù)在滴滴云原生的落地實(shí)踐

    eBPF內(nèi)核技術(shù)在滴滴云原生的落地實(shí)踐

    將滴滴技術(shù)設(shè)為“ 星標(biāo)?? ” 第一時(shí)間收到文章更新 導(dǎo)讀 eBPF是Linux內(nèi)核革命性技術(shù),能夠安全高效地?cái)U(kuò)展內(nèi)核能力,應(yīng)用廣泛,尤其是在云原生可觀測(cè)性領(lǐng)域的應(yīng)用已經(jīng)成為行業(yè)熱點(diǎn)。在滴滴云原生環(huán)境中,eBPF技術(shù)進(jìn)行了業(yè)務(wù)實(shí)踐和內(nèi)源共建,HuaTuo eBPF 平臺(tái)快速落地并取

    2024年02月12日
    瀏覽(22)
  • windows日志捕獲工具-DebugView使用教程

    windows日志捕獲工具-DebugView使用教程

    debugview 是一款捕獲windows桌面系統(tǒng)程序中由TRACE(debug版本)和OutputDebugString輸出的信息。 1、雙擊打開(kāi)DebugView.exe工具,看到如下界面: 其中這里 Include代表過(guò)濾想要的,一般不會(huì)找自己想要的日志就設(shè)置成星號(hào)*,表示顯示所有日志。 Exclude就是過(guò)濾掉不想要的

    2023年04月21日
    瀏覽(17)
  • eBPF系列之:DeepFlow 擴(kuò)展協(xié)議解析實(shí)踐(MongoDB協(xié)議與Kafka協(xié)議)

    eBPF系列之:DeepFlow 擴(kuò)展協(xié)議解析實(shí)踐(MongoDB協(xié)議與Kafka協(xié)議)

    原文:https://blog.mickeyzzc.tech/posts/ebpf/deepflow-agent-proto-dev MongoDB 目前使用廣泛,但是缺乏有效的可觀測(cè)能力。DeepFlow 在可觀測(cè)能力上是很優(yōu)秀的解決方案,但是卻缺少了對(duì) MongoDB 協(xié)議的支持。該文是為 DeepFlow 擴(kuò)展了 MongoDB 協(xié)議解析,增強(qiáng) MongoDB 生態(tài)的可觀測(cè)能力,簡(jiǎn)要描述了從

    2024年01月21日
    瀏覽(22)
  • 【抓包工具】實(shí)戰(zhàn):WireShark 捕獲過(guò)濾器的超全使用教程

    【抓包工具】實(shí)戰(zhàn):WireShark 捕獲過(guò)濾器的超全使用教程

    目錄 一、應(yīng)用場(chǎng)景 二、「捕獲選項(xiàng)」彈框界面 (1)選項(xiàng)卡:Input ① 接口 ② 流量 ③ 鏈路層 ④ 混雜 ⑤ 捕獲長(zhǎng)度(B) ⑥ 緩沖區(qū)(MB) ⑦?監(jiān)控模式 ⑧ 捕獲過(guò)濾器 (2)選項(xiàng)卡:輸出 (3)選項(xiàng)卡:選項(xiàng) 三、捕獲過(guò)濾表達(dá)式 (1)語(yǔ)法說(shuō)明 (2)限定符 (3)運(yùn)算符 (4)特

    2023年04月18日
    瀏覽(63)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包