Linux内核模块性能测试问题

justlearnm0re
  • 4
新手上路,请多包涵

我写了一个基于tracepoint的内核模块来hook一些系统调用(类似sysdig),比如open/execve/connect等,并使用trace-cmd来测试加了驱动之后的开销。测试用例是我自己写的简单程序,用来模拟真实环境中大量调用特定系统调用的场景;然后,我发现我在测试程序中是否加usleep以及usleep不同时间,trace-cmd得到的耗时数据是不同的,包括tracepoint handler的时间消耗和syscall本身的时间消耗;现在我有两个问题,第一个是为什么usleep会导致性能测试结果的差异,第二个是我应该用哪次的测试数据作为最终性能标准;求教各位dalao,Orz。

测试用例:

#include<stdio.h>
#include<fcntl.h>
#include<errno.h>
extern int errno;
int main(){
    while (1){
        int f = open("foo.txt", O_RDONLY | O_CREAT);
        close(f);
        //usleep(1000000);
        //usleep(100000);
        usleep(1);
        //usleep(10);
        //usleep(100);
        //usleep(10000);
        //usleep(1000);
    }
}

不sleep的syscall耗时:
image.png

sleep 1ms的syscall耗时:
image.png

我怀疑这是缓存的原因; 我写了一个demo,发现sleep后第一次调用open的时间消耗和第二次调用open的时间消耗明显不同:
demo:

#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>

void open_once(){
    int f = open("foo.txt", O_RDONLY | O_CREAT);
    close(f);
}
long get_ts(){
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return tv.tv_sec*1000000 + tv.tv_usec;
}
void main() {
    int i = 0, flag = 0;
    long time_a, time_b;
    while(i < 10) {
        flag = i%2;
        if (flag == 1) {
            open_once();
        }
        time_a = get_ts();
        open_once();
        time_b = get_ts();
        //printf("isCallBefore:%d ts:%ld a:%ld b:%ld\n", flag, time_b - time_a, time_a, time_b);
        printf("isCallBefore:%d ts:%ld\n", flag, time_b - time_a);
        i++;
        usleep(1000);
    }
}

耗时结果:
image.png

回复
阅读 183
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏