350 lines
13 KiB
Diff
350 lines
13 KiB
Diff
From 72946403263a0ac056a65f85fd19736d200c8aa4 Mon Sep 17 00:00:00 2001
|
|
From: wo_cow <niuqianqian@huawei.com>
|
|
Date: Tue, 22 Nov 2022 15:40:11 +0800
|
|
Subject: [PATCH] fix bugs for ksliprobe pgsliprobe stackprobe
|
|
|
|
---
|
|
src/common/common.h | 1 +
|
|
src/common/util.c | 19 +++++
|
|
.../ebpf.probe/src/ksliprobe/ksliprobe.bpf.c | 4 +
|
|
.../ebpf.probe/src/pgsliprobe/pgsliprobe.c | 74 +++++++++----------
|
|
.../src/pgsliprobe/pgsliprobe_bpf.h | 7 +-
|
|
.../src/stackprobe/conf/stackprobe.conf | 2 +-
|
|
.../src/stackprobe/stack_bpf/memleak.bpf.c | 11 +--
|
|
.../extends/ebpf.probe/src/stackprobe/svg.c | 31 +++++++-
|
|
.../pg_stat.probe/pg_stat_probe.py | 8 +-
|
|
src/probes/system_infos.probe/system_procs.c | 2 +-
|
|
10 files changed, 105 insertions(+), 54 deletions(-)
|
|
|
|
diff --git a/src/common/common.h b/src/common/common.h
|
|
index 4ce6a81..49496c4 100644
|
|
--- a/src/common/common.h
|
|
+++ b/src/common/common.h
|
|
@@ -168,6 +168,7 @@ unsigned short ntohs(unsigned short netshort);
|
|
/* get uprobe func offset */
|
|
int get_func_offset(char *proc_name, char *func_name, char *bin_file_path);
|
|
|
|
+char *get_cur_date(void);
|
|
char *get_cur_time(void);
|
|
|
|
void ip_str(unsigned int family, unsigned char *ip, unsigned char *ip_str, unsigned int ip_str_size);
|
|
diff --git a/src/common/util.c b/src/common/util.c
|
|
index 65e5d4d..dbe5f75 100644
|
|
--- a/src/common/util.c
|
|
+++ b/src/common/util.c
|
|
@@ -21,6 +21,25 @@
|
|
#include <stdarg.h>
|
|
#include "common.h"
|
|
|
|
+char *get_cur_date(void)
|
|
+{
|
|
+ /* return date str, ex: 2021/5/17 */
|
|
+ static char tm[TM_STR_LEN] = {0};
|
|
+ struct tm *tmp_ptr = NULL;
|
|
+ time_t t;
|
|
+
|
|
+ (void)time(&t);
|
|
+
|
|
+ tmp_ptr = localtime(&t);
|
|
+ (void)snprintf(tm,
|
|
+ TM_STR_LEN,
|
|
+ "%d-%d-%d",
|
|
+ (1900 + tmp_ptr->tm_year),
|
|
+ (1 + tmp_ptr->tm_mon),
|
|
+ tmp_ptr->tm_mday);
|
|
+ return tm;
|
|
+}
|
|
+
|
|
char *get_cur_time(void)
|
|
{
|
|
/* return time str, ex: 2021/5/17 19:56:03 */
|
|
diff --git a/src/probes/extends/ebpf.probe/src/ksliprobe/ksliprobe.bpf.c b/src/probes/extends/ebpf.probe/src/ksliprobe/ksliprobe.bpf.c
|
|
index bf653f0..6fa64ab 100644
|
|
--- a/src/probes/extends/ebpf.probe/src/ksliprobe/ksliprobe.bpf.c
|
|
+++ b/src/probes/extends/ebpf.probe/src/ksliprobe/ksliprobe.bpf.c
|
|
@@ -374,6 +374,10 @@ static __always_inline void process_rd_msg(u32 tgid, int fd, const char *buf, co
|
|
|
|
#ifndef KERNEL_SUPPORT_TSTAMP
|
|
csd->start_ts_nsec = ts_nsec;
|
|
+#else
|
|
+ if (csd->start_ts_nsec == 0) {
|
|
+ csd->start_ts_nsec = ts_nsec;
|
|
+ }
|
|
#endif
|
|
csd->status = SAMP_READ_READY;
|
|
|
|
diff --git a/src/probes/extends/ebpf.probe/src/pgsliprobe/pgsliprobe.c b/src/probes/extends/ebpf.probe/src/pgsliprobe/pgsliprobe.c
|
|
index 9171985..6b75f06 100644
|
|
--- a/src/probes/extends/ebpf.probe/src/pgsliprobe/pgsliprobe.c
|
|
+++ b/src/probes/extends/ebpf.probe/src/pgsliprobe/pgsliprobe.c
|
|
@@ -180,7 +180,6 @@ static void *msg_event_receiver(void *arg)
|
|
}
|
|
|
|
poll_pb(pb, params.period * 1000);
|
|
-
|
|
stop = 1;
|
|
return NULL;
|
|
}
|
|
@@ -380,6 +379,7 @@ int main(int argc, char **argv)
|
|
{
|
|
int err, ret;
|
|
FILE *fp = NULL;
|
|
+ int init = 0;
|
|
struct bpf_link_hash_t *item, *tmp;
|
|
|
|
err = args_parse(argc, argv, ¶ms);
|
|
@@ -409,15 +409,6 @@ int main(int argc, char **argv)
|
|
goto init_err;
|
|
}
|
|
|
|
- load_args(GET_MAP_FD(pgsli_kprobe, args_map), ¶ms);
|
|
- err = init_conn_mgt_process(GET_MAP_FD(pgsli_kprobe, output));
|
|
- if (err != 0) {
|
|
- fprintf(stderr, "Init connection management process failed.\n");
|
|
- goto init_err;
|
|
- }
|
|
-
|
|
- printf("pgsliprobe probe successfully started!\n");
|
|
-
|
|
while (!stop) {
|
|
sleep(params.period);
|
|
if (noDependLibssl) {
|
|
@@ -426,37 +417,46 @@ int main(int argc, char **argv)
|
|
|
|
set_bpf_link_inactive();
|
|
if (add_bpf_link_by_search_pids() != SLI_OK) {
|
|
- if (noDependLibssl) {
|
|
- continue;
|
|
+ if (!noDependLibssl) {
|
|
+ goto init_err;
|
|
}
|
|
- goto init_err;
|
|
- }
|
|
-
|
|
- // attach to libssl
|
|
- H_ITER(head, item, tmp) {
|
|
- if (item->v.pid_state == PID_ELF_TOBE_ATTACHED) {
|
|
- UBPF_ATTACH_ONELINK(pgsli_uprobe, SSL_read, item->v.elf_path, SSL_read,
|
|
- item->v.bpf_link_read, ret);
|
|
- if (ret <= 0) {
|
|
- fprintf(stderr, "Can't attach function SSL_read at elf_path %s.\n", item->v.elf_path);
|
|
- goto init_err;
|
|
- }
|
|
- UBPF_RET_ATTACH_ONELINK(pgsli_uprobe, SSL_read, item->v.elf_path, SSL_read,
|
|
- item->v.bpf_link_read_ret, ret);
|
|
- if (ret <= 0) {
|
|
- fprintf(stderr, "Can't attach ret function SSL_read at elf_path %s.\n", item->v.elf_path);
|
|
- goto init_err;
|
|
+ } else {
|
|
+ // attach to libssl
|
|
+ H_ITER(head, item, tmp) {
|
|
+ if (item->v.pid_state == PID_ELF_TOBE_ATTACHED) {
|
|
+ UBPF_ATTACH_ONELINK(pgsli_uprobe, SSL_read, item->v.elf_path, SSL_read,
|
|
+ item->v.bpf_link_read, ret);
|
|
+ if (ret <= 0) {
|
|
+ fprintf(stderr, "Can't attach function SSL_read at elf_path %s.\n", item->v.elf_path);
|
|
+ goto init_err;
|
|
+ }
|
|
+ UBPF_RET_ATTACH_ONELINK(pgsli_uprobe, SSL_read, item->v.elf_path, SSL_read,
|
|
+ item->v.bpf_link_read_ret, ret);
|
|
+ if (ret <= 0) {
|
|
+ fprintf(stderr, "Can't attach ret function SSL_read at elf_path %s.\n", item->v.elf_path);
|
|
+ goto init_err;
|
|
+ }
|
|
+ UBPF_ATTACH_ONELINK(pgsli_uprobe, SSL_write, item->v.elf_path, SSL_write,
|
|
+ item->v.bpf_link_write, ret);
|
|
+ if (ret <= 0) {
|
|
+ fprintf(stderr, "Can't attach function SSL_write at elf_path %s.\n", item->v.elf_path);
|
|
+ goto init_err;
|
|
+ }
|
|
+ item->v.pid_state = PID_ELF_ATTACHED;
|
|
}
|
|
- UBPF_ATTACH_ONELINK(pgsli_uprobe, SSL_write, item->v.elf_path, SSL_write,
|
|
- item->v.bpf_link_write, ret);
|
|
- if (ret <= 0) {
|
|
- fprintf(stderr, "Can't attach function SSL_write at elf_path %s.\n", item->v.elf_path);
|
|
- goto init_err;
|
|
- }
|
|
- item->v.pid_state = PID_ELF_ATTACHED;
|
|
}
|
|
+ clear_invalid_bpf_link();
|
|
+ }
|
|
+ if (init == 0) {
|
|
+ load_args(GET_MAP_FD(pgsli_kprobe, args_map), ¶ms);
|
|
+ err = init_conn_mgt_process(GET_MAP_FD(pgsli_kprobe, output));
|
|
+ if (err != 0) {
|
|
+ fprintf(stderr, "Init connection management process failed.\n");
|
|
+ goto init_err;
|
|
+ }
|
|
+ printf("pgsliprobe probe successfully started!\n");
|
|
+ init = 1;
|
|
}
|
|
- clear_invalid_bpf_link();
|
|
}
|
|
|
|
init_err:
|
|
diff --git a/src/probes/extends/ebpf.probe/src/pgsliprobe/pgsliprobe_bpf.h b/src/probes/extends/ebpf.probe/src/pgsliprobe/pgsliprobe_bpf.h
|
|
index a2e85b2..a3dfc5d 100644
|
|
--- a/src/probes/extends/ebpf.probe/src/pgsliprobe/pgsliprobe_bpf.h
|
|
+++ b/src/probes/extends/ebpf.probe/src/pgsliprobe/pgsliprobe_bpf.h
|
|
@@ -156,7 +156,7 @@ static __always_inline void periodic_report(u64 ts_nsec, struct conn_data_t *con
|
|
if (ts_nsec > conn_data->last_report_ts_nsec &&
|
|
ts_nsec - conn_data->last_report_ts_nsec >= period) {
|
|
// rtt larger than period is considered an invalid value
|
|
- if (conn_data->latency.rtt_nsec < period && conn_data->max.rtt_nsec < period) {
|
|
+ if (conn_data->latency.rtt_nsec < period * 2 && conn_data->max.rtt_nsec < period * 2) {
|
|
struct msg_event_data_t msg_evt_data = {0};
|
|
msg_evt_data.tgid = conn_key->tgid;
|
|
msg_evt_data.fd = conn_key->fd;
|
|
@@ -224,10 +224,13 @@ static __always_inline void process_rdwr_msg(int fd, const char *buf, int count,
|
|
}
|
|
csd->req_cmd = cmd;
|
|
|
|
+#ifndef KERNEL_SUPPORT_TSTAMP
|
|
+ csd->start_ts_nsec = ts_nsec;
|
|
+#else
|
|
if (csd->start_ts_nsec == 0) {
|
|
csd->start_ts_nsec = ts_nsec;
|
|
}
|
|
-
|
|
+#endif
|
|
csd->status = SAMP_READ_READY;
|
|
} else { // MSG_WRITE
|
|
if (csd->status == SAMP_READ_READY) {
|
|
diff --git a/src/probes/extends/ebpf.probe/src/stackprobe/conf/stackprobe.conf b/src/probes/extends/ebpf.probe/src/stackprobe/conf/stackprobe.conf
|
|
index f0b3c29..a2edd5d 100644
|
|
--- a/src/probes/extends/ebpf.probe/src/stackprobe/conf/stackprobe.conf
|
|
+++ b/src/probes/extends/ebpf.probe/src/stackprobe/conf/stackprobe.conf
|
|
@@ -12,7 +12,7 @@ flame_name =
|
|
oncpu = true;
|
|
offcpu = false;
|
|
io = false;
|
|
- memleak = true;
|
|
+ memleak = false;
|
|
};
|
|
|
|
application =
|
|
diff --git a/src/probes/extends/ebpf.probe/src/stackprobe/stack_bpf/memleak.bpf.c b/src/probes/extends/ebpf.probe/src/stackprobe/stack_bpf/memleak.bpf.c
|
|
index e855401..fe2f22b 100644
|
|
--- a/src/probes/extends/ebpf.probe/src/stackprobe/stack_bpf/memleak.bpf.c
|
|
+++ b/src/probes/extends/ebpf.probe/src/stackprobe/stack_bpf/memleak.bpf.c
|
|
@@ -109,20 +109,12 @@ struct bpf_map_def SEC("maps") mmap_allocs = {
|
|
};
|
|
|
|
struct bpf_map_def SEC("maps") brk_allocs = {
|
|
- .type = BPF_MAP_TYPE_HASH,
|
|
+ .type = BPF_MAP_TYPE_LRU_HASH,
|
|
.key_size = sizeof(u32), // tgid
|
|
.value_size = sizeof(struct brk_info_t),
|
|
.max_entries = 1000000,
|
|
};
|
|
|
|
-// allocated memory for the process
|
|
-struct bpf_map_def SEC("maps") combined_allocs = {
|
|
- .type = BPF_MAP_TYPE_HASH,
|
|
- .key_size = sizeof(struct stack_id_s),
|
|
- .value_size = sizeof(struct combined_alloc_info_t),
|
|
- .max_entries = 1000,
|
|
-};
|
|
-
|
|
static __always_inline u64 get_real_start_time()
|
|
{
|
|
struct task_struct* task = (struct task_struct*)bpf_get_current_task();
|
|
@@ -185,7 +177,6 @@ static inline void update_statistics(void *ctx, char stackmap_cur, s64 count, st
|
|
}
|
|
}
|
|
|
|
-
|
|
static inline int alloc_exit(void *ctx, u64 addr) {
|
|
u32 tgid = bpf_get_current_pid_tgid() >> INT_LEN;
|
|
struct pid_addr_t pa = {0};
|
|
diff --git a/src/probes/extends/ebpf.probe/src/stackprobe/svg.c b/src/probes/extends/ebpf.probe/src/stackprobe/svg.c
|
|
index db43aab..78a1cb0 100644
|
|
--- a/src/probes/extends/ebpf.probe/src/stackprobe/svg.c
|
|
+++ b/src/probes/extends/ebpf.probe/src/stackprobe/svg.c
|
|
@@ -156,10 +156,33 @@ static int __create_svg_files(struct stack_svg_s* svg_files, u32 period)
|
|
return 0;
|
|
}
|
|
|
|
+int __mkdir_with_svg_date(const char *svg_dir, char *svg_date_dir, size_t size)
|
|
+{
|
|
+ size_t len = strlen(svg_dir);
|
|
+ const char *day = get_cur_date();
|
|
+ if (len <= 1 || len + strlen(day) + 1 >= size) {
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
+ (void)snprintf(svg_date_dir, size, "%s/%s", svg_dir, day);
|
|
+ if (access(svg_date_dir, F_OK) != 0) {
|
|
+ FILE *fp;
|
|
+ char command[COMMAND_LEN] = {0};
|
|
+ (void)snprintf(command, COMMAND_LEN, "/usr/bin/mkdir -p %s", svg_date_dir);
|
|
+ fp = popen(command, "r");
|
|
+ if (fp != NULL) {
|
|
+ (void)pclose(fp);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int stack_get_next_svg_file(struct stack_svgs_s* svgs, char svg_file[], size_t size, int en_type)
|
|
{
|
|
int next;
|
|
char svg_name[PATH_LEN];
|
|
+ char svg_date_dir[PATH_LEN] = {0};
|
|
|
|
if (svgs->svg_files.files == NULL) {
|
|
return -1;
|
|
@@ -176,11 +199,15 @@ static int stack_get_next_svg_file(struct stack_svgs_s* svgs, char svg_file[], s
|
|
svgs->svg_files.files[next] = NULL;
|
|
}
|
|
|
|
+ if (__mkdir_with_svg_date(svgs->svg_dir, svg_date_dir, PATH_LEN) < 0) {
|
|
+ return -1;
|
|
+ }
|
|
+
|
|
svg_name[0] = 0;
|
|
- (void)snprintf(svg_name, PATH_LEN, "%s_%s.svg", svg_params[en_type].file_name, get_cur_time());
|
|
+ (void)snprintf(svg_name, PATH_LEN, "%s.svg", get_cur_time());
|
|
|
|
svg_file[0] = 0;
|
|
- (void)snprintf(svg_file, size, "%s/%s", svgs->svg_dir, svg_name);
|
|
+ (void)snprintf(svg_file, size, "%s/%s", svg_date_dir, svg_name);
|
|
__rm_svg(svg_file);
|
|
|
|
svgs->svg_files.files[next] = strdup(svg_file);
|
|
diff --git a/src/probes/extends/python.probe/pg_stat.probe/pg_stat_probe.py b/src/probes/extends/python.probe/pg_stat.probe/pg_stat_probe.py
|
|
index 45f80b5..fe8f955 100644
|
|
--- a/src/probes/extends/python.probe/pg_stat.probe/pg_stat_probe.py
|
|
+++ b/src/probes/extends/python.probe/pg_stat.probe/pg_stat_probe.py
|
|
@@ -121,5 +121,11 @@ if __name__ == "__main__":
|
|
|
|
while True:
|
|
time.sleep(g_period)
|
|
- get_metrics()
|
|
+ try:
|
|
+ get_metrics()
|
|
+ except Exception as e:
|
|
+ print("[pg_stat_probe]get metrics failed. Err:" + str(e))
|
|
+ stop_conns()
|
|
+
|
|
+
|
|
|
|
diff --git a/src/probes/system_infos.probe/system_procs.c b/src/probes/system_infos.probe/system_procs.c
|
|
index 6812bbc..0e1f8a4 100644
|
|
--- a/src/probes/system_infos.probe/system_procs.c
|
|
+++ b/src/probes/system_infos.probe/system_procs.c
|
|
@@ -31,7 +31,7 @@
|
|
#define PROC_START_TIME_CMD "/usr/bin/cat /proc/%s/stat | awk '{print $22}'"
|
|
#define PROC_CMDLINE_CMD "/proc/%s/cmdline"
|
|
#define PROC_FD "/proc/%s/fd"
|
|
-#define PROC_FD_CNT_CMD "/usr/bin/ls -l /proc/%s/fd | wc -l"
|
|
+#define PROC_FD_CNT_CMD "/usr/bin/ls -l /proc/%s/fd 2>/dev/null | wc -l 2>/dev/null"
|
|
#define PROC_IO "/proc/%s/io"
|
|
#define PROC_IO_CMD "/usr/bin/cat /proc/%s/io"
|
|
#define PROC_SMAPS "/proc/%s/smaps_rollup"
|
|
--
|
|
2.28.0.windows.1
|
|
|