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