GNU time
имеет дополнительный дисплей измерений ввода / вывода:
TIME="%I:%O" /usr/bin/time cp filea fileb
0:5488
но какие единицы он измеряет? Любые идеи? В инструкции только сказано
%I Number of filesystem inputs by the process.
%O Number of filesystem outputs by the process.
что менее чем полезно.
Несколько тестов показывают, что это, вероятно, 512k блоков, как данных, так и метаданных:
$ TIME="%I:%O" /usr/bin/time dd if=/dev/zero of=foo bs=1 count=1024
1024 bytes (1.0 kB, 1.0 KiB) copied, 0.0120082 s, 85.3 kB/s
0:8
$ TIME="%I:%O" /usr/bin/time dd if=/dev/zero of=foo bs=1k count=1 conv=sync
1024 bytes (1.0 kB, 1.0 KiB) copied, 0.000354987 s, 2.9 MB/s
0:8
$ TIME="%I:%O" /usr/bin/time dd if=/dev/zero of=foo bs=1k count=1024
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.017763 s, 59.0 MB/s
0:2080
[craig@ayaki-localdomain personal-git]$ TIME="%I:%O" /usr/bin/time dd if=/dev/zero of=foo bs=1M count=1 conv=sync
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0052077 s, 201 MB/s
0:2048
но было бы неплохо это подтвердить.
Кто-нибудь знает, откуда это?
Из руководства:
The `%I' and `%O' values are allegedly only `real'
input and output and do not include those supplied
by caching devices. The meaning of `real' I/O reported
by `%I' and `%O' may be muddled for workstations,
especially diskless ones.
Итак, блоки находятся в вводах / выводах. Возможно, исходный код знает, что это значит. Из краткой документации по функциям в time.c:
...
I == file system inputs (ru_inblock)
...
O == file system outputs (ru_oublock)
...
ru_inblock и ru_oblock взяты из getrusage. Из руководства getrusage:
ru_inblock (since Linux 2.6.22)
The number of times the filesystem had to perform input.
ru_oublock (since Linux 2.6.22)
The number of times the filesystem had to perform output.
Что ж, это не особенно полезно, но LKML показывает обсуждаемые патчи (https://lkml.org/lkml/2007/3/19/100) добавить ru_inblock и ru_oublock:
As TASK_IO_ACCOUNTING currently counts bytes, we approximate blocks
count doing : nr_blocks = nr_bytes / 512
Проверка текущего исходного кода ядра (https://github.com/spotify/linux/blob/master/include/linux/task_io_accounting_ops.h) показывает:
/*
* We approximate number of blocks, because we account bytes only.
* A 'block' is 512 bytes
*/
static inline unsigned long task_io_get_inblock(const struct task_struct *p)
{
return p->ioac.read_bytes >> 9;
}
и
/*
* We approximate number of blocks, because we account bytes only.
* A 'block' is 512 bytes
*/
static inline unsigned long task_io_get_oublock(const struct task_struct *p)
{
return p->ioac.write_bytes >> 9;
}
Короче говоря, да, блоки примерно по 512 байт каждый.
я буду угадать «входы / выходы файловой системы» означают размер блока, поэтому, если базовая файловая система была отформатирована с использованием блоков по 512 байт, она возвращает это, если что-то еще, то это.
Но это только предположение.