我必须编写I / O界限的程序,这将使我的I / O调度程序像以前从未做过的操作系统作业一样工作,但我不知道该怎么做。我已经尝试编写一个简单的C程序来计算大文本文件的行数,但它执行得太快,我无法用它来衡量我的调度程序的有效性。这比我的成绩高出25%,任何帮助都会非常感激。
答案 0 :(得分:0)
试试这个:
find / | head -n 1000000 | xargs -P 10 wc >/dev/null 2>&1
应该很糟糕。 xargs -P选项使其并行运行。您可以调整选项以获得合适的负载。除了消耗每个文件之外,wc
没有做太多其他事情,所以认为它应该主要是IO绑定的。当然还有磁盘缓存。
答案 1 :(得分:0)
上一个答案显示的CPU绑定比我测试中的i / o更多。
我建议使用低级非缓存C例程在每个文件中打开许多文件并寻求疯狂。以下是执行搜索的C代码:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "specify a file to read!\n");
return EXIT_FAILURE;
}
int fd = open(argv[1], O_DIRECT);
if (fd < 0) {
perror("open error");
return EXIT_FAILURE;
}
off_t size = lseek(fd, 0, SEEK_END);
for (int i = 0; i < 1000000; i++)
lseek(fd, rand() % size, SEEK_SET);
close(fd);
return EXIT_SUCCESS;
}
然后,在shell中,通过find运行文件系统中的每个文件:
find / -exec ./io_bound {} \; 2>/dev/null
在我的系统上它运行良好,可以发现rcu_sched任务:
top - 20:44:48 up 57 min, 1 user, load average: 0.84, 0.76, 0.59
Tasks: 266 total, 2 running, 264 sleeping, 0 stopped, 0 zombie
%Cpu0 : 10.0 us, 11.3 sy, 0.0 ni, 78.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 10.3 us, 8.3 sy, 0.0 ni, 81.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 15.3 us, 15.9 sy, 0.0 ni, 68.4 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 16.4 us, 14.7 sy, 0.0 ni, 68.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16314192 total, 9431208 free, 3312716 used, 3570268 buff/cache
KiB Swap: 15624188 total, 15624188 free, 0 used. 12630464 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13087 gluckf 20 0 4224 784 708 R 3.3 0.0 0:00.10 io_bound
7 root 20 0 0 0 0 S 0.3 0.0 0:03.54 rcu_sched
1586 root 20 0 455832 74824 62736 S 0.3 0.5 0:41.49 Xorg
2160 gluckf 20 0 1389916 137096 52548 S 0.3 0.8 0:41.27 cinnamon
2285 gluckf 20 0 498388 46752 28632 S 0.3 0.3 0:14.15 gnome-term+