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

kvm_watcher:自主选择输出格式并兼容可视化数据格式要求 #816

Merged
merged 3 commits into from
Jun 6, 2024
Merged
Changes from all commits
Commits
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
185 changes: 116 additions & 69 deletions eBPF_Supermarket/kvm_watcher/src/kvm_watcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,7 @@ static struct env {
bool execute_ioctl;
bool execute_timer;
bool verbose;
bool show;
int monitoring_time;
pid_t vm_pid;
enum EventType event_type;
Expand All @@ -347,6 +348,7 @@ static struct env {
.verbose = false,
.monitoring_time = 0,
.vm_pid = -1,
.show = false,
.event_type = NONE_TYPE,
};

Expand Down Expand Up @@ -376,6 +378,7 @@ static const struct argp_option opts[] = {
"Monitoring the data of mmio page fault.(The -f option must be "
"specified.)"},
{"vm_pid", 'p', "PID", 0, "Specify the virtual machine pid to monitor."},
{"show", 's', NULL, 0, "Visual display"},
{"monitoring_time", 't', "SEC", 0, "Time for monitoring."},
{"kvm_ioctl", 'l', NULL, 0, "Monitoring the KVM IOCTL."},
{"kvm_timer", 'T', NULL, 0, "Monitoring the KVM hv or software timer."},
Expand All @@ -386,6 +389,9 @@ static const struct argp_option opts[] = {
// 解析命令行参数
static error_t parse_arg(int key, char *arg, struct argp_state *state) {
switch (key) {
case 's':
env.show = true;
break;
case 'H':
argp_state_help(state, stderr, ARGP_HELP_STD_HELP);
break;
Expand Down Expand Up @@ -735,11 +741,12 @@ static int print_event_head(struct env *env) {
"VAILD?");
break;
case EXIT:
printf("Waiting vm_exit ... \n");
//可视化调整输出格式
// printf("Waiting vm_exit ... \n");
break;
case VCPU_LOAD:
//可视化调整输出格式
//printf("Waiting vm_vcpu_load ... \n");
// printf("Waiting vm_vcpu_load ... \n");
break;
case HALT_POLL:
printf("%-18s %-15s %-15s %-10s %-7s %-11s %-10s\n", "TIME(ms)",
Expand Down Expand Up @@ -1023,38 +1030,60 @@ int print_vcpu_load_map(struct kvm_watcher_bpf *skel) {
int fd = bpf_map__fd(skel->maps.load_map);
int err;
struct load_key lookup_key = {};
struct load_key next_key = {};
struct load_key next_key = {};
struct load_value load_value = {};
//可视化调整输出格式
//int first = 1;
while (!bpf_map_get_next_key(fd, &lookup_key, &next_key)) {
int first = 1;
if (env.show) {
if (is_first) {
printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s %-12s\n", "pid",
"tid", "total_time", "max_time", "min_time", "counts",
"vcpuid", "pcpuid");
is_first = 0;
//可视化调整输出格式
//printf("\nTIME:%s\n", getCurrentTimeFormatted());
}
while (!bpf_map_get_next_key(fd, &lookup_key, &next_key)) {
err = bpf_map_lookup_elem(fd, &next_key, &load_value);
if (err < 0) {
fprintf(stderr, "failed to lookup vcpu_load_value: %d\n", err);
return -1;
}
printf("%-12d %-12d %-12.4f %-12.4f %-12.4f %-12u %-12d %-12d\n",
next_key.pid, next_key.tid,
NS_TO_MS_WITH_DECIMAL(load_value.total_time),
NS_TO_MS_WITH_DECIMAL(load_value.max_time),
NS_TO_MS_WITH_DECIMAL(load_value.min_time), load_value.count,
load_value.vcpu_id, load_value.pcpu_id);

lookup_key = next_key;
}

} else {
if (first) {
first = 0;
printf("\nTIME:%s\n", getCurrentTimeFormatted());
printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s %-12s\n", "pid",
"tid", "total_time", "max_time", "min_time", "counts",
"vcpuid", "pcpuid");
//可视化调整输出格式
// printf(
// "------------ ------------ ------------ ------------ "
// "------------ "
// "------------ "
// "------------ "
// "------------\n");
printf(
"------------ ------------ ------------ ------------ "
"------------ "
"------------ "
"------------ "
"------------\n");
}
err = bpf_map_lookup_elem(fd, &next_key, &load_value);
if (err < 0) {
fprintf(stderr, "failed to lookup vcpu_load_value: %d\n", err);
return -1;
while (!bpf_map_get_next_key(fd, &lookup_key, &next_key)) {
err = bpf_map_lookup_elem(fd, &next_key, &load_value);
if (err < 0) {
fprintf(stderr, "failed to lookup vcpu_load_value: %d\n", err);
return -1;
}
printf("%-12d %-12d %-12.4f %-12.4f %-12.4f %-12u %-12d %-12d\n",
next_key.pid, next_key.tid,
NS_TO_MS_WITH_DECIMAL(load_value.total_time),
NS_TO_MS_WITH_DECIMAL(load_value.max_time),
NS_TO_MS_WITH_DECIMAL(load_value.min_time), load_value.count,
load_value.vcpu_id, load_value.pcpu_id);
lookup_key = next_key;
}
printf("%-12d %-12d %-12.4f %-12.4f %-12.4f %-12u %-12d %-12d\n",
next_key.pid, next_key.tid,
NS_TO_MS_WITH_DECIMAL(load_value.total_time),
NS_TO_MS_WITH_DECIMAL(load_value.max_time),
NS_TO_MS_WITH_DECIMAL(load_value.min_time), load_value.count,
load_value.vcpu_id, load_value.pcpu_id);
lookup_key = next_key;
}
clear_map(&lookup_key, &next_key, VCPU_LOAD, fd);
return 0;
Expand All @@ -1070,58 +1099,76 @@ void __print_exit_map(int fd, enum NameType name_type) {
// Iterate over the array
__u32 pid = 0;
__u32 tid = 0;
for (int i = 0; i < count; i++) {
if (first_run) {
first_run = 0;
if (name_type == EXIT_NR) {
printf(
"============================================KVM_EXIT======"
"========"
"==============================\n");
} else if (name_type == EXIT_USERSPACE_NR) {
if (env.show) {
if (is_first) {
printf("%-12s %-12s %-12s %-12s %-12s %-12s\n", "PID", "TID",
"TOTAL_TIME", "MAX_TIME", "MIN_TIME", "COUNT");
is_first = 0;
}
for (int i = 0; i < count; i++) {
printf("%-12d %-12d %-12.4f %-12.4f %-12.4f %-12u\n", keys[i].pid,
keys[i].tid, NS_TO_MS_WITH_DECIMAL(values[i].total_time),
NS_TO_MS_WITH_DECIMAL(values[i].max_time),
NS_TO_MS_WITH_DECIMAL(values[i].min_time), values[i].count);
}

} else {
for (int i = 0; i < count; i++) {
if (first_run) {
first_run = 0;
if (name_type == EXIT_NR) {
printf(
"============================================KVM_EXIT=="
"===="
"========"
"==============================\n");
} else if (name_type == EXIT_USERSPACE_NR) {
printf(
"\n=======================================KVM_"
"USERSPACE_"
"EXIT======="
"================================\n");
} else {
return;
}
printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s\n", "PID",
"TID", "TOTAL_TIME", "MAX_TIME", "MIN_TIME", "COUNT",
"REASON");
printf(
"\n=======================================KVM_USERSPACE_"
"EXIT======="
"================================\n");
} else {
return;
"------------ ------------ ------------ ------------ "
"------------ "
"------------ "
"------------\n");
}
printf("%-12s %-12s %-12s %-12s %-12s %-12s %-12s\n", "PID", "TID",
"TOTAL_TIME", "MAX_TIME", "MIN_TIME", "COUNT", "REASON");
printf(
"------------ ------------ ------------ ------------ "
"------------ "
"------------ "
"------------\n");
}
// Print the current entry
if (tid == 0 || tid != keys[i].tid) {
tid = keys[i].tid;
if (pid == 0 || pid != keys[i].pid) {
pid = keys[i].pid;
printf("%-13d", pid);
} else {
printf("%-13s", "");
// Print the current entry
if (tid == 0 || tid != keys[i].tid) {
tid = keys[i].tid;
if (pid == 0 || pid != keys[i].pid) {
pid = keys[i].pid;
printf("%-13d", pid);
} else {
printf("%-13s", "");
}
printf("%-12d %-12.4f %-12.4f %-12.4f %-12u %-12s\n",
keys[i].tid, NS_TO_MS_WITH_DECIMAL(values[i].total_time),
NS_TO_MS_WITH_DECIMAL(values[i].max_time),
NS_TO_MS_WITH_DECIMAL(values[i].min_time),
values[i].count, getName(keys[i].reason, name_type));
} else if (tid == keys[i].tid) {
printf("%25s %-12.4f %-12.4f %-12.4f %-12u %-12s\n", "",
NS_TO_MS_WITH_DECIMAL(values[i].total_time),
NS_TO_MS_WITH_DECIMAL(values[i].max_time),
NS_TO_MS_WITH_DECIMAL(values[i].min_time),
values[i].count, getName(keys[i].reason, name_type));
}
printf("%-12d %-12.4f %-12.4f %-12.4f %-12u %-12s\n", keys[i].tid,
NS_TO_MS_WITH_DECIMAL(values[i].total_time),
NS_TO_MS_WITH_DECIMAL(values[i].max_time),
NS_TO_MS_WITH_DECIMAL(values[i].min_time), values[i].count,
getName(keys[i].reason, name_type));
} else if (tid == keys[i].tid) {
printf("%25s %-12.4f %-12.4f %-12.4f %-12u %-12s\n", "",
NS_TO_MS_WITH_DECIMAL(values[i].total_time),
NS_TO_MS_WITH_DECIMAL(values[i].max_time),
NS_TO_MS_WITH_DECIMAL(values[i].min_time), values[i].count,
getName(keys[i].reason, name_type));
}
}
clear_map(&lookup_key, &next_key, EXIT, fd);
}
int print_exit_map(struct kvm_watcher_bpf *skel) {
int exit_fd = bpf_map__fd(skel->maps.exit_map);
int userspace_exit_fd = bpf_map__fd(skel->maps.userspace_exit_map);
//printf("\nTIME:%s\n", getCurrentTimeFormatted());
// printf("\nTIME:%s\n", getCurrentTimeFormatted());
__print_exit_map(exit_fd, EXIT_NR);
__print_exit_map(userspace_exit_fd, EXIT_USERSPACE_NR);
return 0;
Expand Down Expand Up @@ -1156,7 +1203,7 @@ int main(int argc, char **argv) {
struct kvm_watcher_bpf *skel;
int err;
//可视化调整输出格式
//print_logo();
// print_logo();

/*解析命令行参数*/
err = argp_parse(&argp, argc, argv, 0, NULL, NULL);
Expand Down
Loading