Re: Скоpость чтения/записи с зеpкала

From
Vitaly Filatov (2:5020/400)
To
Dmitry Budanov (2:5054/37.63)
Date
2005-05-09T14:08:04Z
Area
RU.UNIX.SOLARIS
From: Vitaly Filatov <vitaly@royint.com>

Дмитрий!

Обычно результат противоположен: запись выполняется дольше, чем чтение.

Причина Вашего парадокса в том, что Вы пишете и читаете в /tmp, которая
частично расположена в ОЗУ.

Когда Вы пишете в /tmp, то данные вначале складываются в ОЗУ, затем
может начаться своппинг на диск. Поэтому очень сложно отделить этот
процесс, от самого ввода-вывода.

То, что своппинг на диск имел место Вы можете посмотреть по результату
вывода команды 'swap -l':

$ /usr/sbin/swap -l
swapfile             dev  swaplo blocks   free
/dev/dsk/c0d1s1     102,65      8 1846648 780792

Если число в колонке blocks стало не равно числу в колонке free, то
своппинг на диск произошёл. У меня, например, при обычной работе
эти значения всегда равны, т.е. для моих мелких задач вполне хватает
одного ОЗУ.

------------------
Небольшое отступление.

В Солярис /tmp накладывается на swapfs. swapfs начинается в ОЗУ (и
занимает объём оставшийся от резидентного ядра, выполняемых программ и
кеша файловой системы) и продолжается на тот диск, который показывает
команда 'swap -l', например:

$ /usr/sbin/swap -l
swapfile             dev  swaplo blocks   free
/dev/dsk/c0d1s1     102,65      8 1846648 1846648
$

Здесь у меня заведён раздел на диске под swap размером

1846648 * 512 = 945483776 (~945Мб)

Общий же размер swapfs (виртуальной памяти) у меня равен ~1245Mb (см.
available):

$ /usr/sbin/swap -s
total: 86732k bytes allocated + 85412k reserved = 172144k used, 1245768k available
$

и этот объём у меня складывается из 640Мб ОЗУ плюс 945Мб swap на диске
минус память под ядро, выполняемые программы и кеш файловой системы:

$ /usr/sbin/prtconf | grep Memory
Memory size: 640 Megabytes
$

1245Mb ~= (640Мб + 945Мб) - x

x = 340Мб (память под ядро, выполняемые программы и кеш файловой системы).
------------------

Другое дело, если Вы будете использовать для ввода/вывода обычный диск.

Откройте три окна и запустите в них:

iostat -x -M -T d cmdk1 5 | nawk '/^Mon/{printf("%s: ",$4);next}/^cmdk1/{print}'

- замените cmdk1 на используемый у Вас контроллер, их список можно
посмотреть по команде 'iostat -x', Mon - день недели - укажите правильно.

vmstat 5

- этой командой Вы будете контролировать своппинг. И в третьем окне

date; time dd if=/dev/zero of=/d1/test bs=8192k count=512; date

а затем:

date; time dd if=/d1/test of=/dev/null bs=8192k count=512; date

(замените /d1/test на путь к файлу, находящемуся на реальном диске,
а не в /tmp).

Получите:

Запись:
-------
# sync; sync; sync
# date; time dd if=/dev/zero of=/d1/test bs=8192k count=512; date
Пнд 09 Май 2005 09:53:44
512+0 records in
512+0 records out

real     3:14.6
user        0.0
sys      2:02.0
Пнд 09 Май 2005 09:56:59

Чтение:
-------
# date; time dd if=/d1/test of=/dev/null bs=8192k count=512; date
Пнд 09 Май 2005 09:57:24
512+0 records in
512+0 records out

real     2:37.8
user        0.0
sys      1:02.1
Пнд 09 Май 2005 10:00:02
#

$ iostat -x -M -T d cmdk1 5 | nawk '/^Mon/{printf("%s: ",$4);next}/^cmdk1/{print}'
           device       r/s    w/s   Mr/s   Mw/s wait actv  svc_t  %w  %b
09:53:24: cmdk1       47.2    7.3    0.3    0.0  3.9  0.4   80.2   8  28
09:53:29: cmdk1        0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0
09:53:34: cmdk1        0.0    0.2    0.0    0.0  0.0  0.0    0.4   0   0
09:53:39: cmdk1        0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0
09:53:44: cmdk1        0.0    0.2    0.0    0.0  0.0  0.0    0.3   0   0
09:53:49: cmdk1        0.6  370.0    0.0   20.0 25.6  1.7   73.8  86  88
09:53:54: cmdk1        0.0  401.6    0.0   21.4 35.5  2.0   93.3  99 100
09:53:59: cmdk1        0.0  388.4    0.0   21.1 35.0  2.0   95.3  99 100
09:54:04: cmdk1        0.0  404.8    0.0   22.0 33.3  2.0   87.2  99 100
09:54:09: cmdk1        0.0  390.4    0.0   21.2 33.2  2.0   90.3  99 100
09:54:14: cmdk1        0.0  377.4    0.0   20.5 35.9  2.0  100.5  99 100
09:54:19: cmdk1        0.0  369.9    0.0   20.0 37.6  2.0  107.0  99 100
09:54:24: cmdk1        0.0  361.7    0.0   18.9 36.5  2.0  106.4  99 100
09:54:29: cmdk1        0.0  399.4    0.0   21.6 34.9  2.0   92.4  99 100
09:54:34: cmdk1        0.0  400.0    0.0   21.6 34.7  2.0   91.7  99 100
09:54:39: cmdk1        0.0  401.7    0.0   21.8 32.0  2.0   84.6  99 100
09:54:44: cmdk1        0.0  396.2    0.0   21.6 32.7  2.0   87.5  99 100
09:54:49: cmdk1        0.2  409.3    0.0   22.2 32.0  2.0   83.1  99 100
09:54:54: cmdk1        0.0  348.2    0.0   18.1 38.1  2.0  115.2  99 100
09:54:59: cmdk1        0.2  378.0    0.0   20.5 35.0  2.0   97.8  99 100
09:55:04: cmdk1        0.0  396.6    0.0   21.5 32.8  2.0   87.7  99 100
09:55:09: cmdk1        0.2  378.3    0.0   20.5 36.1  2.0  100.8  99 100
09:55:14: cmdk1        0.6  394.4    0.0   21.4 30.5  2.0   82.2  99 100
09:55:19: cmdk1        0.0  426.0    0.0   23.1 26.5  2.0   66.9  99 100
09:55:24: cmdk1        1.6  353.5    0.0   18.2 36.1  2.0  107.4  98 100
09:55:29: cmdk1        3.8  383.0    0.0   20.6 39.2  2.0  106.6 100 100
09:55:34: cmdk1        1.6  390.9    0.0   20.7 40.4  2.0  108.0  99 100
09:55:39: cmdk1        0.0  401.3    0.0   21.5 34.3  2.0   90.5  99 100
09:55:44: cmdk1        0.2  404.7    0.0   21.7 31.8  2.0   83.3  98  99
09:55:49: cmdk1        0.0  406.4    0.0   22.1 29.1  2.0   76.6  99 100
09:55:54: cmdk1        0.2  360.6    0.0   18.7 36.0  2.0  105.3  99 100
09:55:59: cmdk1        0.4  393.8    0.0   21.4 33.8  2.0   90.7  99 100
09:56:04: cmdk1        0.0  379.2    0.0   20.1 38.6  2.0  107.2  99 100
09:56:09: cmdk1        0.0  391.4    0.0   21.1 34.6  2.0   93.6  99 100
09:56:14: cmdk1        0.0  402.6    0.0   21.9 29.4  2.0   78.1  99 100
09:56:19: cmdk1        0.2  377.1    0.0   20.4 33.5  2.0   94.0  99 100
09:56:24: cmdk1        0.0  386.7    0.0   20.4 29.0  2.0   80.1  99 100
09:56:29: cmdk1        0.2  400.3    0.0   21.6 31.3  2.0   83.2  99 100
09:56:34: cmdk1        0.0  400.5    0.0   21.8 31.6  2.0   83.8  99 100
09:56:39: cmdk1        0.0  406.9    0.0   21.9 29.9  2.0   78.4  99 100
09:56:44: cmdk1        0.0  409.5    0.0   21.8 33.4  2.0   86.4  99 100
09:56:49: cmdk1        0.2  408.2    0.0   22.1 31.3  2.0   81.5  98 100
09:56:54: cmdk1        0.0  386.1    0.0   19.9 33.4  2.0   91.6  99 100
09:56:59: cmdk1        0.2  405.2    0.0   22.0 30.0  2.0   78.8  99 100
09:57:04: cmdk1        1.9   17.6    0.0    0.7  1.9  0.1  102.1   5   6
09:57:09: cmdk1        0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0
09:57:14: cmdk1        0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0
09:57:19: cmdk1        0.0    7.0    0.0    0.1  0.0  0.0    5.3   0   0
09:57:24: cmdk1        0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0
09:57:29: cmdk1      412.2    0.0   22.4    0.0  0.0  1.5    3.6   2  92
09:57:34: cmdk1      453.8    0.0   24.7    0.0  0.0  1.6    3.6   2 100
09:57:39: cmdk1      448.8    0.0   24.5    0.0  0.0  1.6    3.6   2 100
09:57:44: cmdk1      512.8    0.0   21.8    0.0  0.1  1.7    3.4   7 100
09:57:49: cmdk1      469.6    0.2   23.7    0.0  0.1  1.6    3.6   5 100
09:57:54: cmdk1      430.2    3.0   23.4    0.0  0.0  1.6    3.8   2 100
09:57:59: cmdk1      454.9    0.0   24.8    0.0  0.0  1.6    3.6   2 100
09:58:04: cmdk1      441.0    0.0   24.0    0.0  0.0  1.6    3.7   2 100
09:58:09: cmdk1      450.4    0.0   24.5    0.0  0.0  1.6    3.7   2 100
09:58:14: cmdk1      450.1    0.0   24.6    0.0  0.0  1.6    3.7   2 100
09:58:19: cmdk1      447.6    0.2   24.4    0.0  0.0  1.6    3.7   2 100
09:58:24: cmdk1      444.8    0.0   24.2    0.0  0.0  1.6    3.7   2 100
09:58:29: cmdk1      447.0    0.0   24.4    0.0  0.0  1.6    3.7   2 100
09:58:34: cmdk1      446.2    0.0   24.4    0.0  0.0  1.6    3.7   2 100
09:58:39: cmdk1      449.6    0.0   24.5    0.0  0.0  1.6    3.7   2 100
09:58:44: cmdk1      438.3    0.0   23.9    0.0  0.0  1.6    3.8   2 100
09:58:49: cmdk1      455.8    0.6   24.9    0.0  0.0  1.6    3.6   2 100
09:58:54: cmdk1      441.8    0.0   23.8    0.0  0.1  1.6    3.9   5 100
09:58:59: cmdk1      452.0    0.0   24.2    0.0  0.1  1.6    3.7   5 100
09:59:04: cmdk1      431.3    0.0   23.3    0.0  0.1  1.6    4.0   3  99
09:59:09: cmdk1      440.0    0.0   23.8    0.0  0.1  1.6    3.8   4 100
09:59:14: cmdk1      439.0    0.0   23.9    0.0  0.0  1.6    3.8   2 100
09:59:19: cmdk1      454.4    0.0   24.8    0.0  0.0  1.6    3.6   2 100
09:59:24: cmdk1      436.6    0.0   23.6    0.0  0.1  1.6    3.9   3 100
09:59:29: cmdk1      455.4    0.0   24.5    0.0  0.1  1.6    3.7   4 100
09:59:34: cmdk1      453.9    0.0   24.8    0.0  0.0  1.6    3.6   2 100
09:59:39: cmdk1      457.1    0.0   24.9    0.0  0.0  1.6    3.6   3 100
09:59:44: cmdk1      447.0    0.0   24.4    0.0  0.0  1.6    3.7   2 100
09:59:49: cmdk1      454.4    0.0   24.6    0.0  0.0  1.6    3.6   3 100
09:59:54: cmdk1      492.3    0.0   20.6    0.0  0.1  1.5    3.2   5  92
09:59:59: cmdk1        0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0
10:00:04: cmdk1        0.0    0.0    0.0    0.0  0.0  0.0    0.0   0   0
10:00:09: cmdk1        0.4    0.0    0.0    0.0  0.0  0.0   16.0   0   1
^C$

Смотрите колонки 'Mr/s' и 'Mw/s' для скорости чтения/записи на диск
в мегабайтах в секунду.

Видно, что скорость записи ~20.56Мб/сек, а скорость чтения ~23.43Mb,
на 14% больше. Это примерно соответствует изменению длительности
программы:

2:37.8 = 157.8сек

157.8сек + 14% = 157.8 + 22.09 = 179.89сек ~= 3мин

В этом случае никаких парадоксов не наблюдается.

Вообще говоря в Солярис каталог /tmp надо использовать очень осторожно:
не допускать его заполнения. Хотя доступ к файлам в этом каталоге
наиболее быстр, сильное заполнение этого каталога может привести к
своппингу и существенной деградации в работе системы.

Для возможность достижения наивысшей производительности следите, чтобы
во время работы в столбцах blocks и free, вывода команды 'swap -l',
были одинаковые значения. Если они по ходу работы становятся не
одинаковыми, то, скорее всего, надо прикупить ОЗУ.

Виталий Филатов
http://members.tripod.com/Vitaly_Filatov

Dmitry Budanov сообщил:
> Добpый день All!
> 
> bash-2.05# time dd if=/dev/zero of=/tmp/test bs=8192k count=512
> 512+0 records in
> 512+0 records out
> 
> real    2m9.675s
> user    0m0.000s
> sys     0m20.230s
> bash-2.05# time dd if=/tmp/test of=/dev/null bs=8192k count=512
> 512+0 records in
> 512+0 records out
> 
> real    4m12.803s
> user    0m0.000s
> sys     0m19.930s
> 
> Почему скоpость записи на зеpкало в 2 pаза выше скоpости чтения?
> 
> PS. В кэш файлик не поместится.
> 
> Пока, Dmitry.

--- ifmail v.2.15dev5.3
 * Origin: MTU-Intel ISP (2:5020/400)
SEEN-BY: 46/50 50/203 520 450/159 186 247 1024 451/30 461/640 469/999 4625/8
SEEN-BY: 4627/10 5000/76 5000 5006/1 5007/1 5010/70 5011/13 5015/10 5020/52
SEEN-BY: 5020/118 175 194 400 545 715 758 902 937 1042 1523 1604 1922 2020
SEEN-BY: 5020/2238 4441 5021/29 5022/128 5025/3 750 5026/45 5027/16 5030/49
SEEN-BY: 5030/115 556 966 1900 1957 5031/72 5035/3 38 5036/1 5051/15 5054/1 4
SEEN-BY: 5054/8 9 28 35 37 5057/1 5060/88 5061/15 5062/1 10 5066/18 5067/2
SEEN-BY: 5069/7 5070/1222 5074/9 5075/5 35 5080/80 1003 5081/2 5082/6 5083/21
SEEN-BY: 5085/13 5090/113 5093/57 5095/20 5096/18 6000/254 6001/3
PATH: 5020/400 4441 545 5054/1 37