Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

整合工具,并整理厂库 #548

Merged
merged 42 commits into from
Oct 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
eb4ad95
modify test_proc.c
zhangzihengya Sep 11, 2023
dab09f8
Merge branch 'linuxkerneltravel:develop' into develop
zhangzihengya Sep 14, 2023
eeef808
Update README.md
zhangzihengya Sep 14, 2023
f6536cc
Update lifecycle_image.bpf.c
zhangzihengya Sep 14, 2023
105adf6
Update test_proc.c
zhangzihengya Sep 16, 2023
ee659ee
Merge branch 'linuxkerneltravel:develop' into develop
zhangzihengya Sep 21, 2023
8126e68
add keytime_image
zhangzihengya Sep 21, 2023
dca348f
Merge branch 'develop' of github.com:zhangzihengya/lmp into develop
zhangzihengya Sep 21, 2023
709ffac
rm text.txt
zhangzihengya Sep 21, 2023
0726cca
Merge branch 'linuxkerneltravel:develop' into develop
zhangzihengya Sep 24, 2023
0101fe0
Merge branch 'linuxkerneltravel:develop' into develop
zhangzihengya Sep 26, 2023
40a1888
add libbpf_sar
zhangzihengya Sep 26, 2023
9388e55
Update system_cpu.yml
zhangzihengya Sep 26, 2023
ca34bf2
Update libbpf_sar.c
zhangzihengya Sep 26, 2023
f14f044
Update system_cpu.yml
zhangzihengya Sep 26, 2023
49d4e43
Update system_cpu.yml
zhangzihengya Sep 26, 2023
675330e
Update libbpf_sar.c
zhangzihengya Sep 26, 2023
6dad0a1
Update system_cpu.yml
zhangzihengya Sep 26, 2023
33363cf
Update libbpf_sar.c
zhangzihengya Sep 26, 2023
8260551
Update libbpf_sar.c
zhangzihengya Sep 26, 2023
6b5c6bb
Update keytime_image.c
zhangzihengya Sep 26, 2023
a09c40b
Update keytime_image.h
zhangzihengya Sep 26, 2023
d5e0488
md libbpf_sar.c
zhangzihengya Sep 26, 2023
d848541
Merge branch 'linuxkerneltravel:develop' into develop
zhangzihengya Sep 27, 2023
345cb16
modify detail
zhangzihengya Sep 27, 2023
1adc62a
Update README.md
zhangzihengya Sep 28, 2023
8ff713e
Update README.md
zhangzihengya Sep 28, 2023
b730219
Update README.md
zhangzihengya Oct 6, 2023
1c3e7ed
add proc_image
zhangzihengya Oct 10, 2023
474a90d
modify proc_image detail
zhangzihengya Oct 15, 2023
2fbeecc
modify README.md
zhangzihengya Oct 15, 2023
bae1e09
Merge branch 'develop' of github.com:zhangzihengya/lmp into develop
zhangzihengya Oct 15, 2023
c5152dc
Update libbpf_sar.h
zhangzihengya Oct 15, 2023
2a362c3
Update eBPF_proc_image.yml
zhangzihengya Oct 15, 2023
01b841d
Update keytime_image.h
zhangzihengya Oct 15, 2023
5e37378
Update lifecycle_image.h
zhangzihengya Oct 15, 2023
d690338
Update lock_image.h
zhangzihengya Oct 15, 2023
0291918
Update newlife_image.h
zhangzihengya Oct 15, 2023
961cedb
Update README.md
zhangzihengya Oct 15, 2023
882bd65
Update README.md
zhangzihengya Oct 15, 2023
b327f0c
Update proc_image.c
zhangzihengya Oct 15, 2023
4fcdb0b
Update README.md
zhangzihengya Oct 19, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .github/workflows/eBPF_proc_image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,33 +28,33 @@ jobs:

- name: Run lifecycle_image
run: |
cd eBPF_Supermarket/eBPF_proc_image
cd eBPF_Supermarket/eBPF_proc_image/tools
make lifecycle_image
sudo ./lifecycle_image -t 1

- name: Run lock_image
run: |
cd eBPF_Supermarket/eBPF_proc_image
cd eBPF_Supermarket/eBPF_proc_image/tools
make lock_image
sudo ./lock_image -t 1

- name: Run newlife_image
run: |
cd eBPF_Supermarket/eBPF_proc_image
cd eBPF_Supermarket/eBPF_proc_image/tools
make newlife_image
sudo ./newlife_image -t 1

- name: Run keytime_image
run: |
cd eBPF_Supermarket/eBPF_proc_image
cd eBPF_Supermarket/eBPF_proc_image/tools
make keytime_image
sudo ./keytime_image -t 1

- name: Run proc_offcpu_time
- name: Run proc_image
run: |
cd eBPF_Supermarket/eBPF_proc_image/proc_offcpu_time
make
sudo ./proc_offcpu_time -t 1
cd eBPF_Supermarket/eBPF_proc_image
make proc_image
sudo ./proc_image -t 1

- name: Run mutex_test
run: |
Expand Down
2 changes: 1 addition & 1 deletion eBPF_Supermarket/CPU_Subsystem/libbpf_sar/libbpf_sar.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@
//
// author: [email protected]
//
// eBPF map for libbpf sar
// eBPF map for libbpf sar
8 changes: 2 additions & 6 deletions eBPF_Supermarket/eBPF_proc_image/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ INCLUDES := -I$(OUTPUT) -I../../../libbpf/include/uapi -I$(dir $(VMLINUX)) -I$(L
CFLAGS := -g -Wall
ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS)

APPS = lifecycle_image lock_image newlife_image keytime_image
APPS = proc_image

CARGO ?= $(shell which cargo)
ifeq ($(strip $(CARGO)),)
Expand All @@ -54,10 +54,6 @@ APPS += $(BZS_APPS)
ALL_LDFLAGS += -lrt -ldl -lpthread -lm
endif

COMMON_OBJ = \
$(OUTPUT)/trace_helpers.o \
$(OUTPUT)/uprobe_helpers.o \

# Get Clang's default includes on this system. We'll explicitly add these dirs
# to the includes list when compiling with `-target bpf` because otherwise some
# architecture-specific dirs will be "missing" on some architectures/distros -
Expand Down Expand Up @@ -148,7 +144,7 @@ $(patsubst %,$(OUTPUT)/%.o,$(BZS_APPS)): $(LIBBLAZESYM_OBJ)
$(BZS_APPS): $(LIBBLAZESYM_OBJ)

# Build application binary
$(APPS): %: $(OUTPUT)/%.o $(COMMON_OBJ) $(LIBBPF_OBJ) | $(OUTPUT)
$(APPS): %: $(OUTPUT)/%.o $(LIBBPF_OBJ) | $(OUTPUT)
$(call msg,BINARY,$@)
$(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lelf -lz -o $@

Expand Down
167 changes: 35 additions & 132 deletions eBPF_Supermarket/eBPF_proc_image/README.md
Original file line number Diff line number Diff line change
@@ -1,161 +1,64 @@
# 基于eBPF的Linux系统性能监测工具-进程画像

## 一、介绍
## 一、项目介绍

本项目是一个Linux进程生命周期画像工具,通过该工具可以清晰展示出一个进程从创建到终止的完整生命周期,并可以额外展示出进程/线程持有锁的区间画像、进程/线程上下文切换原因的标注、线程之间依赖关系(线程)、进程关联调用栈信息标注等。在这些功能的前提下,加入了更多的可视化元素和交互方式,使得整个画像更加直观、易于理解。

运行环境:Ubuntu 22.04,内核版本5.19.0-46-generic

## 二、lifecycle_image 工具
## 二、安装依赖

lifecycle_image工具是Linux进程生命周期画像工具,该工具由多个子功能组成。

### 1. 进程上下CPU时间统计(-p,-C)

通过 -p 参数指定要监控的进程,便可以采集到该进程在生命周期中上下CPU的时间信息。

<div align='center'><img src="./docs/images/on_off_cpu.png"></div>

测试对象:top(默认为每3秒更新一次)

<div align='center'><img src="./docs/images/top_delay.png"></div>

运行eBPF程序跟踪top进程,执行指令 sudo ./proc_image -p 5523,运行结果:

<div align='center'><img src="./docs/images/proc_cpu.png"></div>

结合top进程每3秒更新一次,从运行结果中可以看出该eBPF程序已经成功捕获到top进程上下cpu的时间信息。

在此基础上,通过该工具的-p和-C参数,能捕获到某个CPU所对应0号进程的上下cpu时间信息,进而也可以体现出0号进程所对应的CPU繁忙程度。

### 2. 进程上下CPU原因标注(-r,-s)

通过 -r 参数实现打印进程上下文切换的原因标注,默认打印采集到的全部堆栈信息,可通过-s参数进行设置打印堆栈的数量,若设置的个数大于所采集到的堆栈个数,则将采集到的堆栈全部打印。

测试程序:test_proc(测试程序通过 sleep 函数实现下CPU)

<div align='center'><img src="./docs/images/off_cpu_sleep.png"></div>

测试结果:

<div align='center'><img src="./docs/images/off_cpu_sleep_result.png"></div>

## 三、lock_image 工具

lock_image工具可以对进程/线程持有锁的区间进行画像,该工具目前可以对进程的用户态互斥锁、内核态互斥锁和用户态读写锁进行画像。
```
sudo apt update
sudo apt install libbpf-dev clang llvm libelf-dev libpcap-dev gcc-multilib build-essential
git submodule update --init --recursive
```

<div align='center'><img src="./docs/images/lock_image.png"></div>
## 三、proc_image 工具

lock_image 工具采集到的数据
目前 proc_image 工具具备的功能

1. 请求锁的时间点
2. 上锁的时间点
3. 解锁的时间点
4. 请求锁的时间(时间段)
5. 持有锁的时间(时间段)
- 记录进程上下CPU的时间信息
- 记录进程的关键时间点信息,即exec和exit
- 记录进程持有锁的区间信息,目前实现了用户态互斥锁、内核态互斥锁、用户态读写锁
- 记录新创建进程或线程的时间信息

lock_image 工具的参数信息:
proc_image 工具的参数信息:

| 参数 | 描述 |
| -------------------- | ------------------------------------------------- |
| -p, --pid=PID | 指定跟踪进程的pid,默认为0号进程 |
| -t, --time=TIME-SEC | 设置程序的最大运行时间(0表示无限),默认一直运行 |
| -C, --cpuid=CPUID | 为每CPU进程设置,其他进程不需要设置该参数 |
| -c, --cputime | 统计进程上下CPU时间信息 |
| -e, --execve | 对进程execve关键时间点进行画像 |
| -E, --exit | 对进程exit关键时间点进行画像 |
| -q, --quote | 在参数周围添加引号(") |
| -K, --keytime | 对进程的关键时间点进行画像,即execve和exit |
| -m, --user-mutex | 对进程的用户态互斥锁进行画像 |
| -M, --kernel-mutex | 对进程的内核态互斥锁进行画像 |
| -r, --user-rwlock-rd | 对进程用户态读模式下的读写锁进行画像 |
| -w, --user-rwlock-wr | 对进程用户态写模式下的读写锁进行画像 |
| -L, --lock | 对进程的各种锁进行画像 |
| -f, --fork | 对fork出来的子进程进行画像 |
| -F, --vfork | 对vfork出来的子进程进行画像 |
| -T, --newthread | 对pthread_create出来的新线程进行画像 |
| -S, --child | 对新创建进程和线程进行画像 |
| -A, --all | 开启所有的功能 |
| -h, --help | 显示帮助信息 |

用户态的自旋锁和信号量,在libbpf程序的开发过程中遇到了 libbpf: elf: ambiguous match 问题,目前这个问题社区也在讨论中,详情见 [libbpf_ambiguous_match_question.md](./docs/libbpf_ambiguous_match_question.md)。

## 四、newlife_image 工具

newlife_image工具可以对指定进程fork或vfork出来的新进程以及pthread_create出来的新线程进行画像。

newlife_image 工具采集到的数据:

1. newlife的产生方式以及newlife的pid
2. newlife的开始时间
3. newlife的退出时间
4. newlife的存在时间

newlife_image 工具的参数信息:
## 四、tools

| 参数 | 描述 |
| ------------------- | ------------------------------------------------- |
| -p, --pid=PID | 指定跟踪进程的pid,默认为0号进程 |
| -t, --time=TIME-SEC | 设置程序的最大运行时间(0表示无限),默认一直运行 |
| -f, --fork | 对fork出来的子进程进行画像 |
| -F, --vfork | 对vfork出来的子进程进行画像 |
| -T, --newthread | 对pthread_create出来的新线程进行画像 |
| -h, --help | 显示帮助信息 |

问题及解决:

pthread_create函数也存在模糊匹配问题,如下:

```
libbpf: elf: ambiguous match for 'pthread_create', 'pthread_create' in '/usr/lib/x86_64-linux-gnu/libc.so.6'
```

在Ubuntu22.04.1中 fork 和 vfork 调用的都是clone系统调用,而 pthread_create 调用的是 clone3 系统调用,因此暂用 clone3 监控新线程。

## 五、keytime_image工具

keytime_image工具可以对指定进程执行exec和exit时进行画像。

keytime_image工具采集到的数据:

1. exec或exit的开始或结束时间
2. 被监控进程的父进程pid
3. exec从开始到结束的执行时间
4. 函数返回值
5. 函数参数信息

keytime_image 工具的参数信息:

| 参数 | 描述 |
| ------------------- | ------------------------------------------------- |
| -p, --pid=PID | 指定跟踪进程的pid,默认为0号进程 |
| -t, --time=TIME-SEC | 设置程序的最大运行时间(0表示无限),默认一直运行 |
| -e, --execve | 跟踪进程的execve系统调用 |
| -E, --exit | 跟踪进程的exit系统调用 |
| -q, --quote | 在参数周围添加引号(") |
| -h, --help | 显示帮助信息 |

## 六、proc_offcpu_time工具

该工具可通过-p参数指定进程的pid,便可以采集到该进程处于off_CPU的时间。该功能已经和加入sleep逻辑的用户态程序(./test/test_sleep.c)进行了时间上的比对,准确性满足要求。示例如下:

终端1:./test_sleep

```
test_sleep进程的PID:9063
输入任意数字继续程序的运行:
```

终端2:现在已知test_sleep进程的PID为9063,执行指令sudo ./proc_image -p 9063进行跟踪

终端1:输入任意数字继续程序的运行

最后终端1和终端2的运行结果如下:

```
// 终端1
test_sleep进程的PID:9063
输入任意数字继续程序的运行:1
程序开始执行...
sleep开始时间:2023-07-24 16:58:28
sleep结束时间:2023-07-24 16:58:31
程序睡眠3s,执行完毕!

//终端2
pid:9063 comm:test_sleep offcpu_id:3 offcpu_time:5963882827916 oncpu_id:3 oncpu_time:5966883001411 sleeptime:3.000173
```
tools文件夹中的eBPF程序是按照进程生命周期中数据的类型分别进行实现的:

目前该工具的功能已经合入proc_image。
| 工具 | 描述 |
| --------------- | ------------------------------- |
| lifecycle_image | 对进程上下CPU进行画像 |
| lock_image | 对进程/线程持有锁的区间进行画像 |
| keytime_image | 对进程的关键时间点进行画像 |
| newlife_image | 对新创建进程或线程进行画像 |

## 、test_proc 测试程序
## 、test_proc 测试程序

目前 [test_proc](./test/test_proc.c) 测试程序所具备逻辑:

Expand Down
Loading