Linux内核模块性能测试问题

发布于 2022-09-13 00:35:31 字数 1834 浏览 34 评论 0

我写了一个基于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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文