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