Re: SATA работает черезчур медленно.
Илья
m191 на yandex.ru
Пт Сен 11 14:55:29 BST 2009
Думаю что это не проблема а следствие реализации механизма копирования файлов.
Тестировал в виртуальной машине, чистота эксперемента не гарантируется :)
ilya на u8:~$ su bash
1)Параметры диска
root на u8:~# hdparm -tT /dev/sda
/dev/sda:
Timing cached reads: 1996 MB in 2.00 seconds = 999.53 MB/sec
Timing buffered disk reads: 100 MB in 3.09 seconds = 32.39 MB/sec
2)Тестовый файл
root на u8:~# ls test -l
-rwxr-xr-x 1 root root 1362335 2009-09-11 17:01 test
3) Проведем трассировку копирования
root на u8:~# strace -c cp test /media/disk/
Process 16370 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
97.36 0.004498 27 167 write
2.64 0.000122 1 178 read
.....удалено.....
------ ----------- ----------- --------- --------- ----------------
100.00 0.004620 490 22 total
Видим что было произведено 167 операций записей, т.е
Размер файла / Количество операций / 8 = 1362335 / 167 / 8 = 1019
т.е. примерно 1024 - размер блока чтения по умолчанию.
4) посмотрим примерную скорость I/O при стандартном буфере
root на u8:~# dd if=test of=/media/disk/test
2660+1 записей считано
2660+1 записей написано
скопировано 1362335 байт (1,4 MB), 0,0296695 c, 45,9 MB/c
5) попробуем увеличить размер буфера
root на u8:~# dd if=test of=/media/disk/test bs=10240
133+1 записей считано
133+1 записей написано
скопировано 1362335 байт (1,4 MB), 0,00739249 c, 184 MB/c
хм... скорость увеличилась :)
6) попробуем еще
root на u8:~# dd if=test of=/media/disk/test bs=131072
10+1 записей считано
10+1 записей написано
скопировано 1362335 байт (1,4 MB), 0,0051516 c, 264 MB/c
7) Еще тест
strace -c dd if=test of=/media/disk/test
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
51.55 0.004710 2 2667 read
32.90 0.003006 1 2664 write
strace -c dd if=test of=/media/disk/test bs=131072
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
92.12 0.001624 116 14 write
16.29 0.001722 101 17 read
видим что время и количество операций записи и чтения уменьшилось.
т.е. скорость копирования больших файлов можно реально увеличить используя команду dd вместо cp.
Думаю что размер буфера (размер должен быть кратен размеру буфера файловой системы, для каждого диска может быть различен) надо вычислять исходя из среднего размера копируемых файлов (большой размер для маленьких файлов увеличивает фрагментацию диска) и размера буфера физического диска (можно посмотреть так на значение BuffSize в выводе следующей команды:
ilya на u8:~$ sudo hdparm -i /dev/sda
/dev/sda:
Model=VBOX HARDDISK , FwRev=1.0 , SerialNo=VB9cf3e9d5-5d934d94
Config={ Fixed }
RawCHS=16383/16/63, TrkSize=0, SectSize=512, ECCbytes=0
BuffType=DualPortCache, BuffSize=256kB, MaxMultSect=128, MultSect=?128?
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=16777216
IORDY=yes, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 *udma2 udma3 udma4 udma5 udma6
AdvancedPM=no WriteCache=enabled
Drive conforms to: unknown: ATA/ATAPI-1,2,3,4,5,6
Как указать размер буфера для файловых операций чтения и записей для стандартных команд (типа cp и mv) я не знаю.
Один из выходов написать скрипт для копирования больших объемов данных (можно с вычислением размера bs).
PS
Попутно выяснил что есть какие-то глюки с открытием файлов связанных с локализацией
root на u8:~# ls -l ip
-rwxr-xr-x 1 ilya ilya 328 2009-07-29 17:23 ip
root на u8:~# strace -c dd if=ip of=/media/disk/test
0+1 записей считано
0+1 записей написано
скопировано 328 байт (328 B), 0,00238499 c, 138 kB/c
Process 16668 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.001137 25 46 24 open
0.00 0.000000 0 7 read
0.00 0.000000 0 4 write
0.00 0.000000 0 26 1 close
0.00 0.000000 0 1 execve
0.00 0.000000 0 5 5 access
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 munmap
0.00 0.000000 0 1 uname
0.00 0.000000 0 1 mprotect
0.00 0.000000 0 1 _llseek
0.00 0.000000 0 6 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 1 getrlimit
0.00 0.000000 0 27 mmap2
0.00 0.000000 0 20 fstat64
0.00 0.000000 0 2 futex
0.00 0.000000 0 1 set_thread_area
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 2 clock_gettime
0.00 0.000000 0 1 set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00 0.001137 159 30 total
Видно что количество ошибок открытия файлов 24 из 46 и время на эту операцию для небольших файлов уходит значительное (100%!!!!)
root на u8:~# strace -e open dd if=ip of=/media/disk/test
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/tls/i686/cmov/librt.so.1", O_RDONLY) = 3
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
open("/lib/tls/i686/cmov/libpthread.so.0", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/locale.alias", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_IDENTIFICATION", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_IDENTIFICATION", O_RDONLY) = 3
open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_MEASUREMENT", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_MEASUREMENT", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_TELEPHONE", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_TELEPHONE", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_ADDRESS", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_ADDRESS", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_NAME", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_NAME", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_PAPER", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_PAPER", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_MESSAGES", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_MESSAGES", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.utf8/LC_MESSAGES/SYS_LC_MESSAGES", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_MONETARY", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_MONETARY", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_COLLATE", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_COLLATE", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_TIME", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_TIME", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_NUMERIC", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_NUMERIC", O_RDONLY) = 3
open("/usr/lib/locale/ru_RU.UTF-8/LC_CTYPE", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/ru_RU.utf8/LC_CTYPE", O_RDONLY) = 3
open("ip", O_RDONLY|O_LARGEFILE) = 0
open("/media/disk/test", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 1
open("/usr/share/locale/ru_RU.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru_RU.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru_RU/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru_RU.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru_RU.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru_RU/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru/LC_MESSAGES/coreutils.mo", O_RDONLY) = 0
0+1 записей считано
0+1 записей написано
скопировано 328 байт (328 B), 0,00122779 c, 267 kB/c
Т.е. системой запрашиваются файлы сначала не там где они реально лежат. Это в моей тестовой системе или у всех так?
Подробная информация о списке рассылки ubuntu-ru