我正在为 nvme-cli 开发一个测试工具(用 c 编写并且可以在 linux 上运行)。
我有兴趣使用 't' 线程数重复 nvme 命令 'r' 次数。
下面的代码执行命令的重复以及线程,但这里的问题是并行执行时间与串行执行相比非常高。
根据我的观察,原因是ioctl()
从
err = nvme_identify(fd, 0, 1, data);
即nvme_identify()
轮流调用中调用系统调用ioctl()
。
那么我可以知道是否ioctl()
阻止了 nvme 吗?
我也可以有任何方法(解决方案)通过线程减少执行时间吗?
int repeat_cmd(int fd, void *data, int nsid,int cmd, int rc, int flags,
struct repeatfields *rf, int threadcount)
{
pthread_t tid[threadcount];
int err, i=0,j=0;
struct my_struct1 my_struct[threadcount];
switch(cmd){
case 1 :
for (j=0; j <threadcount; j++)
{
my_struct[j].fd = fd;
my_struct[j].data = data;
my_struct[j].flags = flags;
my_struct[j].rf = *rf;
my_struct[j].rcount = rc/threadcount;
pthread_create(&tid[j], NULL, ThreadFun_id_ctrl, (void*)&my_struct[i]);
}
for (j=0; j <threadcount; j++)
pthread_join(tid[j], NULL);
break;
}
线程函数如下:
void *ThreadFun_id_ctrl(void *val)
{
int err,j;
struct my_struct1 *my_struct = (struct my_struct1 *)val;
int fd = my_struct->fd;
void *data = my_struct->data;
struct repeatfields rf = my_struct->rf;
int flags = my_struct->flags;
int rcount = my_struct->rcount;
printf("Printing count = %d\n",rcount);
for (j=0; j <rcount; j++)
{
err = nvme_identify(fd, 0, 1, data);
if (!err) {
if (rf.fmt == BINARY)
d_raw((unsigned char *)&rf.ctrl, sizeof(rf.ctrl));
else if (rf.fmt == JSON)
json_nvme_id_ctrl(data, flags, 0);
else {
printf("NVME Identify Controller:\n");
__show_nvme_id_ctrl(data, flags, 0);
}
}
else if (err > 0){
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
}
else
perror("identify controller");
printf("Printing from Thread id = %d\n",syscall(SYS_gettid));
}
return NULL;