Linux内核模块性能测试问题
我写了一个基于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耗时:
sleep 1ms的syscall耗时:
我怀疑这是缓存的原因; 我写了一个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);
}
}
耗时结果:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论