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

cpu_watcher:修改部分warning&schedule_delay功能扩充 #784

Merged
merged 11 commits into from
May 10, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -127,18 +127,22 @@ int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_s
struct sum_schedule sum_schedule= {};
sum_schedule.sum_count++;
sum_schedule.sum_delay += delay;
if (delay > sum_schedule.max_delay)
if (delay > sum_schedule.max_delay){
sum_schedule.max_delay = delay;
if (sum_schedule.min_delay == 0 || delay < sum_schedule.min_delay)
sum_schedule.pid_max = next->pid;
}else if (sum_schedule.min_delay == 0 || delay < sum_schedule.min_delay)
sum_schedule.min_delay = delay;
sum_schedule.pid_min = next->pid;
bpf_map_update_elem(&sys_schedule, &key, &sum_schedule, BPF_ANY);
} else {
sum_schedule->sum_count++;
sum_schedule->sum_delay += delay;
if (delay > sum_schedule->max_delay)
if (delay > sum_schedule->max_delay){
sum_schedule->max_delay = delay;
if (sum_schedule->min_delay == 0 || delay < sum_schedule->min_delay)
sum_schedule->pid_max = next->pid;
}else if (sum_schedule->min_delay == 0 || delay < sum_schedule->min_delay)
sum_schedule->min_delay = delay;
sum_schedule->pid_min = next->pid;
}
return 0;
}
Expand Down
28 changes: 14 additions & 14 deletions eBPF_Supermarket/CPU_Subsystem/cpu_watcher/cpu_watcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ static int print_all()
unsigned long dtaUT = utTime -_utTime;

/*sys*/
int key_sys = 0,next_key;
int key_sys = 0;
int err_sys, fd_sys = bpf_map__fd(sar_skel->maps.tick_user);
u64 __tick_user =0 ;// 用于存储从映射中查找到的值
__tick_user = tick_user;
Expand All @@ -338,7 +338,7 @@ static int print_all()
if(env.enable_proc){
time_t now = time(NULL);
struct tm *localTime = localtime(&now);
printf("%02d:%02d:%02d %8llu %8llu %6d %8llu %10llu %8llu %10llu %8llu %8lu %8lu\n",
printf("%02d:%02d:%02d %8llu %8llu %6d %8llu %10llu %8llu %10lu %8llu %8llu %8llu\n",
localTime->tm_hour, localTime->tm_min, localTime->tm_sec,
__proc,__sched,runqlen,dtairqtime/1000,dtasoftirq/1000,dtaidle/1000000,
dtaKT/1000,dtaSysc / 1000000,dtaUTRaw/1000000,dtaSys / 1000000);
Expand All @@ -354,7 +354,7 @@ int count[25]={0};//定义一个count数组,用于汇总schedul()调度时间
static int handle_event(void *ctx, void *data,unsigned long data_sz)
{
const struct event *e = data;
printf("t1:%lu t2:%lu delay:%lu\n",e->t1,e->t2,e->delay);
printf("t1:%llu t2:%llu delay:%llu\n",e->t1,e->t2,e->delay);

int dly=(int)(e->delay),i=0;
while (dly > 1){
Expand All @@ -380,14 +380,14 @@ static int print_hstgram(int i,int max,int per_len)
printf("\n");
return per_len;
}
double pow(int n,int k)//实现pow函数
double my_pow(int n,int k)//实现pow函数
{
if (k > 0)
return n * pow(n, k - 1);
return n * my_pow(n, k - 1);
else if (k == 0)
return 1;
else
return 1.0 / pow(n, -k);
return 1.0 / my_pow(n, -k);
}
static void histogram()
{
Expand Down Expand Up @@ -420,7 +420,7 @@ static void histogram()
printf("%d\t=>\t%-8d \t%-12d \t|",2,3,count[1]);
print_hstgram(1,max,per_len);
for(int i=2;i<20;i++){
printf("%d\t=>\t%-8d \t%-12d \t|",(int)pow(2,i),(int)pow(2,(i+1))-1,count[i]);
printf("%d\t=>\t%-8d \t%-12d \t|",(int)my_pow(2,i),(int)my_pow(2,(i+1))-1,count[i]);
print_hstgram(i,max,per_len);
}
printf("per_len = %d\n",per_len);
Expand All @@ -438,7 +438,7 @@ static int syscall_delay_print(void *ctx, void *data,unsigned long data_sz)
{

const struct syscall_events *e = data;
printf("pid: %-8llu comm: %-10s syscall_id: %-8ld delay: %-8llu\n",
printf("pid: %-8u comm: %-10s syscall_id: %-8lld delay: %-8lld\n",
e->pid,e->comm,e->syscall_id,e->delay);
return 0;
}
Expand Down Expand Up @@ -470,8 +470,8 @@ static int schedule_print(struct bpf_map *sys_fd)
return -1;
}
avg_delay = info.sum_delay / info.sum_count;
printf("%02d:%02d:%02d | %-15lf %-15lf %-15lf |\n",
hour, min, sec, avg_delay / 1000.0, info.max_delay / 1000.0, info.min_delay / 1000.0);
printf("%02d:%02d:%02d %-15lf %-15lf %6d %-15lf %6d\n",
hour, min, sec, avg_delay / 1000.0, info.max_delay / 1000.0,info.pid_max, info.min_delay / 1000.0,info.pid_min);
return 0;
}

Expand All @@ -483,10 +483,10 @@ static int mq_event(void *ctx, void *data,unsigned long data_sz)
printf("-----------------------------------------------------------------------------------------------------------------------\n");
const struct mq_events *e = data;

printf("Mqdes: %-8llu msg_len: %-8llu msg_prio: %-8llu\n",e->mqdes,e->msg_len,e->msg_prio);
printf("SND_PID: %-8lu SND_enter_time: %-16llu SND_exit_time: %-16llu\n",
printf("Mqdes: %-8d msg_len: %-8lu msg_prio: %-8u\n",e->mqdes,e->msg_len,e->msg_prio);
printf("SND_PID: %-8d SND_enter_time: %-16llu SND_exit_time: %-16llu\n",
e->send_pid,e->send_enter_time,e->send_exit_time);
printf("RCV_PID: %-8lu RCV_enter_time: %-16llu RCV_exit_time: %-16llu\n",
printf("RCV_PID: %-8d RCV_enter_time: %-16llu RCV_exit_time: %-16llu\n",
e->rcv_pid,e->rcv_enter_time,e->rcv_exit_time);
printf("-------------------------------------------------------------------------------\n");

Expand Down Expand Up @@ -626,7 +626,7 @@ int main(int argc, char **argv)
fprintf(stderr, "Failed to attach BPF skeleton\n");
goto schedule_cleanup;
}
printf("%-8s %s\n", " TIME ", "avg_delay/μs max_delay/μs min_delay/μs");
printf("%-8s %s\n", " TIME ", "avg_delay/μs max_delay/μs max_pid min_delay/μs min_pid");
}else if (env.SAR){
/* Load and verify BPF application */
sar_skel = sar_bpf__open();
Expand Down
127 changes: 60 additions & 67 deletions eBPF_Supermarket/CPU_Subsystem/cpu_watcher/include/cpu_watcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
#include <asm/types.h>
#include <linux/version.h>

typedef long long unsigned int u64;
typedef unsigned long long u64;
typedef unsigned int u32;
typedef __kernel_mqd_t mqd_t;
typedef __kernel_mqd_t mqd_t;
#define __user
#define MAX_CPU_NR 128
#define MAX_CPU_NR 128
#define TASK_COMM_LEN 20
#define SYSCALL_MIN_TIME 1E7
#define MAX_SYSCALL_COUNT 100
Expand All @@ -35,87 +35,80 @@ typedef __kernel_mqd_t mqd_t;
/// @param type1 键的类型
/// @param type2 值的类型
/// @param MAX_ENTRIES map容量
#define BPF_ARRAY(name, type1,type2,MAX_ENTRIES ) \
struct \
{ \
__uint(type, BPF_MAP_TYPE_ARRAY); \
__uint(key_size, sizeof(type1)); \
__uint(value_size, sizeof(type2)); \
__uint(max_entries, MAX_ENTRIES); \
#define BPF_ARRAY(name, type1, type2, MAX_ENTRIES) \
struct { \
__uint(type, BPF_MAP_TYPE_ARRAY); \
__uint(key_size, sizeof(type1)); \
__uint(value_size, sizeof(type2)); \
__uint(max_entries, MAX_ENTRIES); \
} name SEC(".maps")

/// @brief 创建一个指定名字和键值类型的ebpf散列表
/// @param name 新散列表的名字
/// @param type1 键的类型
/// @param type2 值的类型
/// @param MAX_ENTRIES 哈希map容量
#define BPF_HASH(name, type1,type2,MAX_ENTRIES ) \
struct \
{ \
__uint(type, BPF_MAP_TYPE_HASH); \
__uint(key_size, sizeof(type1)); \
__uint(value_size, sizeof(type2)); \
__uint(max_entries, MAX_ENTRIES); \
} name SEC(".maps")

#define BPF_HASH(name, type1, type2, MAX_ENTRIES) \
struct { \
__uint(type, BPF_MAP_TYPE_HASH); \
__uint(key_size, sizeof(type1)); \
__uint(value_size, sizeof(type2)); \
__uint(max_entries, MAX_ENTRIES); \
} name SEC(".maps")
/// @brief 创建一个指定名字和键值类型的ebpf每CPU数组
/// @param name 新散列表的名字
/// @param type1 键的类型
/// @param type2 值的类型
/// @param MAX_ENTRIES map容量
#define BPF_PERCPU_ARRAY(name, type1,type2,MAX_ENTRIES ) \
struct \
{ \
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); \
__uint(key_size, sizeof(type1)); \
__uint(value_size, sizeof(type2)); \
__uint(max_entries, MAX_ENTRIES); \
} name SEC(".maps")

#define BPF_PERCPU_ARRAY(name, type1, type2, MAX_ENTRIES) \
struct { \
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); \
__uint(key_size, sizeof(type1)); \
__uint(value_size, sizeof(type2)); \
__uint(max_entries, MAX_ENTRIES); \
} name SEC(".maps")
/// @brief 创建一个指定名字和键值类型的ebpf每CPU散列表
/// @param name 新散列表的名字
/// @param type1 键的类型
/// @param type2 值的类型
/// @param MAX_ENTRIES map容量
#define BPF_PERCPU_HASH(name, type1,type2,MAX_ENTRIES ) \
struct \
{ \
__uint(type, BPF_MAP_TYPE_PERCPU_HASH); \
__uint(key_size, sizeof(type1)); \
__uint(value_size, sizeof(type2)); \
__uint(max_entries, MAX_ENTRIES); \
} name SEC(".maps")
#define BPF_PERCPU_HASH(name, type1, type2, MAX_ENTRIES) \
struct { \
__uint(type, BPF_MAP_TYPE_PERCPU_HASH); \
__uint(key_size, sizeof(type1)); \
__uint(value_size, sizeof(type2)); \
__uint(max_entries, MAX_ENTRIES); \
} name SEC(".maps")

/*----------------------------------------------*/
/* cs_delay结构体 */
/*----------------------------------------------*/
#ifndef __CS_DELAY_H
#define __CS_DELAY_H
struct event {
long unsigned int t1;
long unsigned int t2;
long unsigned int delay;
u64 t1;
u64 t2;
u64 delay;
};
#endif /* __CS_DELAY_H */

/*----------------------------------------------*/
/* syscall_delay结构体 */
/*----------------------------------------------*/
struct syscall_flags{
long unsigned int start_time;
struct syscall_flags {
u64 start_time;
int syscall_id;
};

struct syscall_events {//每个进程一个
int pid,count;
int pid, count;
char comm[TASK_COMM_LEN];
u64 delay;
u64 syscall_id;
};
/*----------------------------------------------*/
/* preempt_event结构体 */
/*----------------------------------------------*/
struct preempt_event{
struct preempt_event {
pid_t prev_pid;
pid_t next_pid;
unsigned long long duration;
Expand All @@ -125,22 +118,24 @@ struct preempt_event{
/* schedule_delay相关结构体 */
/*----------------------------------------------*/
//标识不同进程
struct proc_id{
struct proc_id {
int pid;
int cpu_id;
};
//标识该进程的调度信息
struct schedule_event{
struct schedule_event {
int pid;
int count;//调度次数
unsigned long long enter_time;
};
//整个系统所有调度信息
struct sum_schedule{
struct sum_schedule {
unsigned long long sum_count;
unsigned long long sum_delay;
unsigned long long max_delay;
unsigned long long min_delay;
int pid_max;
int pid_min;
};

/*----------------------------------------------*/
Expand All @@ -150,36 +145,34 @@ struct mq_events {
int send_pid;
int rcv_pid;
mqd_t mqdes;
size_t msg_len;
unsigned int msg_prio;

u64 send_enter_time;
u64 send_exit_time;
u64 rcv_enter_time;
u64 rcv_exit_time;
size_t msg_len;
unsigned int msg_prio;
u64 send_enter_time;
u64 send_exit_time;
u64 rcv_enter_time;
u64 rcv_exit_time;
};
struct send_events {
int send_pid;
u64 Key_msg_ptr;

mqd_t mqdes;
size_t msg_len;
unsigned int msg_prio;
const char *u_msg_ptr;
const void *src;
u64 send_enter_time;
u64 send_exit_time;
size_t msg_len;
unsigned int msg_prio;
const char *u_msg_ptr;
const void *src;
u64 send_enter_time;
u64 send_exit_time;
};
struct rcv_events {
int rcv_pid;
u64 Key_msg_ptr;
mqd_t mqdes;
size_t msg_len;
unsigned int msg_prio;
const char *u_msg_ptr;
const void *dest;
u64 rcv_enter_time;
u64 rcv_exit_time;
size_t msg_len;
unsigned int msg_prio;
const char *u_msg_ptr;
const void *dest;
u64 rcv_enter_time;
u64 rcv_exit_time;
};
/*----------------------------------------------*/
/* cswch_args结构体 */
Expand Down
Loading