$ time perl -e \
'$count=1024*1024; while ($count>0) { print "x" x 384; $count--; }' > out
real 0m1.284s
user 0m0.316s
sys 0m0.961s
$ ls -lh out
-rw-r--r-- 1 me group 384M Apr 16 19:47 out
Замена "x" x 384
(который производит строку 384 x
s) с чем Вам нравится.
Можно оптимизировать это далее при помощи большей строки в каждом цикле и обхода нормального стандарта, буферизующего.
$ perl -e \
'$count=384; while ($count>0) {
syswrite(STDOUT, "x" x (1024*1024), 1024*1024);
$count--;
}' > out
В этом случае, syswrite
вызовы передадут 1M за один раз к базовому write
syscall, который становится довольно хорошим. (Я обхожу 0,940 пользователей с с этим.)
Подсказка: удостоверьтесь, что Вы звоните sync
между каждым тестом, чтобы не иметь сбрасывание предыдущего выполнения вмешиваются во ввод-вывод текущего выполнения.
Для ссылки я добираюсь на этот раз:
$ time dd if=/dev/zero bs=1024 count=$((1024*384)) of=./out
393216+0 records in
393216+0 records out
402653184 bytes (403 MB) copied, 1.41404 s, 285 MB/s
real 0m1.480s
user 0m0.054s
sys 0m1.410s
inotify-инструменты являются простым способом сделать это. Существует несколько примеров на их сайте, который смог бы сделать то, что Вы хотите (см. inotifywatch пример для действительно основного).
Другая подсказка: Используйте Systemtap, существует набор тестовых сценариев на сайте systemtap, достаточно полезном для нахождения преступника.
В другом случае в целом,
Если Вы хотите узнать, какой процесс заставил диск вращаться, можно собрать информацию путем установки флага /proc/sys/vm/block_dump
. Когда этот флаг установлен, Linux сообщает обо всем чтении с диска и операциях записи, которые происходят, и все dirtyings блока, сделанные в файлы. Это позволяет отладить, почему диск должен вращаться, и увеличить ресурс аккумулятора еще больше. Вывод block_dump записан в вывод ядра, и он может быть получен с помощью "dmesg" или посмотреть средство керна системного журнала для места назначения сообщений отладки. Обычно это должно быть /var/log/debug
. Когда Вы используете block_dump, и Ваш уровень входа ядра также включает сообщения отладки ядра, Вы, вероятно, хотите выключить klogd, иначе вывод block_dump будет зарегистрирован, вызывая активность диска, которая обычно не является там.
Вам нужно сказать ядру, чтобы оно сообщило вам обо всех прочтениях/записях на диски, затем вам нужно взглянуть на эту информацию.
So:
# sync
# echo 1 > /proc/sys/vm/block_dump
# dmesg -c | grep '/dev/sda'
sync
смывает все отложенные записи на диски, так что вы увидите только новые чтения или записи.
dmesg -c
показывает сообщения ядра, и очищает их (иначе вы видите и старые тоже, каждый раз при запуске dmesg).
grep
фильтрует вывод dmesg для интересующего вас диска. Замените /dev/sda на ваше фактическое устройство.
Обычно я использую что-то подобное для вращения диска, а затем проверяю, когда он снова вращается:
# sync
# hdparm -y /dev/sda
# while true; do hdparm -C /dev/sda ; sleep 600 ; done
Цикл while
проверяет состояние активного/завершенного диска каждые 10 минут. Когда вы увидите, что он включился, запустите строку dmesg
выше, чтобы увидеть whodunnit.