ioprio_set: IDLE_CLASS doesn't work as its name suggests

From: fykcee1@xxxxxxxxx
Date: Sat Mar 26 2011 - 00:39:57 EST


Hi all,

I've tried to make a fast boot according to "Booting Linux in five
seconds"[1]. One method of boot fast is using readahead -- a process
"replay" read actions in IDLE IO class via readahead syscall. Sadly
observed negative results -- according to bootchat diagram, readahead
process actually uses more IO bandwidth that slows down all IO
operations of other ones.

Then I did some tests -- two I/O hog processes, the IDLE IO class one
largely degrades I/O performance of the other one.

The tests were performed on a machine with dual-core cpu (intel
E5400@xxxxxx), G33 and ICH7, 2G mem, running Ubuntu 10.04. The kernel
version was 2.6.35-25-generic with CFQ as default I/O scheduler.
We ran test programs which time "find $2 -type f -exec cat {} \;" on
~1.9G directory with Normal and IDLE IO class. Before each test, we
reboot the system. Here are the results:

1. Only ran one instance of the test program in Normal IO class:
Job finished in 4m2.365s

2. Ran two instances of the test program, one Normal IO class, the
other Idle IO class:
[Normal]: 7m0.999s
[Idle]: 7m43.180s

3. Ran two instances of the test program, both Normal IO class:
[Normal1]: 8m39.366s
[Normal2]: 8m39.377s

BTW, for those interested in the detail, try the attachment:
1. mkdir ioprio_test
2. cp ioprio_test.c run_test.sh ioprio_test
3. tar xf <system_image.tar.gz> -C ioprio_test/tdir1
4. tar xf <system_image.tar.gz> -C ioprio_test/tdir2
5. reboot; cd ioprio_test && ./run_test.sh 1 => result stored in F.txt
6. reboot; cd ioprio_test && ./run_test.sh 2 => result stored in
F[B0].txt B0[F].txt
7. reboot; cd ioprio_test && ./run_test.sh 3 => result stored in
F[B1].txt B1[F].txt



Regards,
cee1
-------
[1] http://lwn.net/Articles/299483/
#include <unistd.h>
#include <sys/syscall.h>

int main(int argc, char * argv[])
{
char *cmd[] = {
"/usr/bin/find",
NULL,
"-type", "f",
"-exec", "cat", "{}", ";",
NULL
};

close(1);
close(2);

if(3 > argc)
{
return -1;
}
else
{

cmd[1] = argv[2];

if('0' == argv[1][0])
{
/* Idle */
syscall(SYS_ioprio_set, 1, getpid(), ((3<<13) | 0));
}

execv(cmd[0], cmd);
}

return 0;
}

Attachment: run_test.sh
Description: Bourne shell script