C ioprio_集合未显示调用线程的io性能增益

C ioprio_集合未显示调用线程的io性能增益,c,linux,multithreading,io,C,Linux,Multithreading,Io,这个小实验是为了证明通过增加线程的I/O优先级可以提高I/O性能。 为此,使用了系统调用。 要查看此api的实际应用,您可以浏览ionice实用程序的代码。 因此,我产生了一些线程来复制相同大小的文件(其中一个线程将一个文件复制到某个输出文件) 对于一个线程,我称之为ioprio_集 ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_RT,0)); 这些参数将使调用线程的优先级升级为具有最高值(即0)的实时(ioc

这个小实验是为了证明通过增加线程的I/O优先级可以提高I/O性能。 为此,使用了系统调用。 要查看此api的实际应用,您可以浏览ionice实用程序的代码。 因此,我产生了一些线程来复制相同大小的文件(其中一个线程将一个文件复制到某个输出文件) 对于一个线程,我称之为ioprio_集

ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_RT,0));
这些参数将使调用线程的优先级升级为具有最高值(即0)的实时(ioclass)。为了衡量性能,我使用了线程io操作前后的时钟时间

但在运行程序后,我看不到调用线程的执行时间的增加。 下面是代码

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<sys/syscall.h>
#include<unistd.h>
#include<time.h>
#define NB_THREADS  3 
#define IOPRIO_PRIO_VALUE(class, data)  (((class) << IOPRIO_CLASS_SHIFT) | data)
#define IOPRIO_CLASS_SHIFT  13
#define BILLION  1000000000L

enum {
    IOPRIO_CLASS_NONE,
    IOPRIO_CLASS_RT,
    IOPRIO_CLASS_BE,
    IOPRIO_CLASS_IDLE,
};

enum {
    IOPRIO_WHO_PROCESS = 1,
    IOPRIO_WHO_PGRP,
    IOPRIO_WHO_USER,
};

static inline int ioprio_set(int which, int who, int ioprio)
{
    return syscall(SYS_ioprio_set, which, who, ioprio);
}


double times[NB_THREADS];
void *copyfile(void *args){
    struct timespec start, stop;
    double accum;


int x;
    char finname[10];// name of the file to be copied
    char foutname[10],ch;
    int *id;
    FILE *source, *target;


    id = (int *) args;
    sprintf(finname,"large%d.txt",*id);

    sprintf(foutname,"out%d.txt",*id);

    if(*id == 2){
        x=ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IOPRIO_CLASS_RT,0));
        //printf("##%d##",x);
    }

if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
        perror( "clock gettime" );
        exit(EXIT_FAILURE);
    }


    //printf("%s##%s\n\n",finname,foutname);
    source = fopen(finname, "r");
    if( source == NULL )
    {
        printf("Press any key to exit...\n");
        exit(EXIT_FAILURE);
    }


    target = fopen(foutname, "w");

    if( target == NULL )
    {
        fclose(source);
        printf("Press any key to exit...\n");
        exit(EXIT_FAILURE);
    }

    while( ( ch = fgetc(source) ) != EOF )
    {
        fputc(ch, target);           
    }

    //printf("\ndone copying file %s to %s in %lf\n",finname,foutname,accum);

    fclose(source);
    fclose(target);
    if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
        perror( "clock gettime" );
        exit(EXIT_FAILURE);
    }

    accum = ( stop.tv_sec - start.tv_sec )
        + (double)( stop.tv_nsec - start.tv_nsec )
        / (double)BILLION;

    times[*id]=accum;
}




int main()
{

    unsigned int ints[NB_THREADS],i;
    int err;
    pthread_t    threads[NB_THREADS];

    for (i = 0; i < NB_THREADS; ++i) {
        ints[i] = i;
        err=pthread_create(&threads[i], NULL, copyfile , &ints[i]);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
        else
            printf("\n Thread %d created successfully\n",i);

        //pthread_join(threads[i], NULL);
    }
    for (i = 0; i < NB_THREADS; ++i) {
        pthread_join(threads[i], NULL);
    }
    for (i = 0; i < NB_THREADS; ++i) {
        printf("\n %d : %lf",i,times[i]);
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义NB_线程3

#定义IOPRIO_优先级值(类、数据)((类)您是如何配置的?值?期望值?其他相关情况?什么限制了性能?很可能文件的内容已经在页面缓存中,在这种情况下,I/O优先级不会有太大影响。请确保
large#.txt
文件是独立的,而不是指向同一inode的硬链接:如果它们指向同一inode,则内容只有一个实例;每当文件块被缓存到页面缓存中时,其他线程都会立即得到它。最后,如果没有对I/O资源的竞争,则优先级没有影响,因此请确保线程竞争(而不是在同一索引节点上)。要清除页面缓存:
sudo sh-c'echo 3>/proc/sys/vm/drop#u caches'
。我注意到大的#.txt不是同一inode的硬链接,事实上我已经用'base64/dev/uradom | head-c 3000000000000>大的#.txt'(3GB文件)生成了每个文件。我也尝试了释放缓存。输出是:(第二个线程中的增益未显示)线程0已成功创建线程1已成功创建线程2已成功创建线程0:347.382835 1:350.225743 2:349.463542您是如何配置的?值?期望值?其他相关情况?什么限制了性能?最有可能的是文件内容已在页缓存中,在这种情况下,I/O优先级将不受限制非常有效。确保
large#.txt
文件是独立的,而不是指向同一个inode的硬链接:如果它们指向同一个inode,则只有一个内容实例;每当文件块被缓存到页面缓存中时,其他线程都会立即得到它。最后,如果没有对I/O资源的竞争,则priority没有效果,所以一定要确保线程竞争(而不是在同一个inode上)。要清除页面缓存:
sudo sh-c'echo 3>/proc/sys/vm/drop_caches'
。我注意到大的#.txt不是同一inode的硬链接,事实上我已经用'base64/dev/uradom | head-c 300000000000>大的#.txt'(3GB文件)生成了每个文件我也尝试过释放缓存。输出是:(第二个线程中的增益未显示)线程0成功创建线程1成功创建线程2成功创建0:347.382835 1:350.225743 2:349.463542