Назад | Перейти на главную страницу

cp и cat на Centos 5.5 / ext3 в 10 раз медленнее для файлов в определенных каталогах

Я сортировал несколько больших файлов (91 ГБ по 27 файлам) с помощью GNU sort когда я заметил это iostat -dxk 3 показал очень низкую скорость чтения, от 5 МБ / с до 10 МБ / с, при 100% использовании диска. Я попытался cat large-file > /dev/null, и получил аналогичную производительность, только немного выше. То же самое для cp large-file /tmp/, с участием /tmp на отдельном диске. vim испытывает то же самое, как и сценарии, которые я пишу в файлах чтения Ruby, если это помогает. Скорость записи нормальная и быстрая.

РЕДАКТИРОВАТЬ: похоже, что эти операции выполняются медленно только с файлами в определенном каталоге. Те же операции с другими файлами в родственном каталоге (том же разделе диска) в конечном итоге выполняются быстро, со скоростью чтения более 90 МБ / с. Для меня это не имеет смысла. Может быть, это связано с тем, как были созданы эти файлы? Я создал их, читая множество других файлов и записывая каждую строку в соответствующий «файл корзины», в зависимости от первого символа в строке (например, a-z, и один файл для других). Таким образом, я практически одновременно добавлял строки к 27 файлам, по одной, через 8 процессов, читая пару тысяч файлов. Может ли это привести к тому, что последовательный порядок блоков, представляющих файл, будет нарушен? Отсюда медленное последовательное чтение после этого?

Однако я попытался использовать fio для измерения производительности последовательного чтения, и он работал со скоростью 73 МБ / с. Также примечательно то, что мой босс получил надлежащую скорость чтения при загрузке некоторых файлов по FTP с той же машины.

Я предполагаю, что это какая-то проблема с конфигурацией, но я понятия не имею, где. В чем может быть причина и как ее исправить?

Изменить: эта машина работает под виртуализацией Citrix Xen.

Изменить: вывод iostat -dxk пока sort загружает большой файл в свой буфер (аналогичный вывод для cat / cp):

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 1000.00  0.00  6138.61     0.00    12.28    24.66   24.10   0.99  99.41
xvdb1             0.00     0.00 1000.00  0.00  6138.61     0.00    12.28    24.66   24.10   0.99  99.41
xvda              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
xvda1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Изменить: дальнейшее снижение производительности через несколько часов (с перерывами для диска, когда sort была обработка). Это почти похоже на случайный ввод-вывод, но выполняется только одна операция сортировки, и никакие другие процессы не выполняют никаких операций ввода-вывода, поэтому чтение должно быть последовательным = /:

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 638.00  0.00  2966.67     0.00     9.30    25.89   40.62   1.57 100.00

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.33     0.00 574.67  0.00  2613.33     0.00     9.10    27.82   47.55   1.74 100.00 

Device:         rrqm/s   wrqm/s   r/s   w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
xvdb              0.00     0.00 444.33  0.00  1801.33     0.00     8.11    28.41   65.27   2.25 100.00

Ваши медленные файлы сильно фрагментированы? Бегать /usr/sbin/filefrag -vfilename выяснить. Вы получите такой результат:

Checking big.file
Filesystem type is: ef53
Filesystem cylinder groups is approximately 4272
Blocksize of file big.file is 4096
File size of big.file is 96780584 (23629 blocks)
First block: 88179714
Last block: 88261773
Discontinuity: Block 6 is at 88179742 (was 88179719)
Discontinuity: Block 12233 is at 88192008 (was 88191981)
Discontinuity: Block 17132 is at 88197127 (was 88196911)
Discontinuity: Block 17133 is at 88255271 (was 88197127)
big.file: 5 extents found, perfection would be 1 extent

или, возможно, намного хуже.

Вы упомянули, что система работает в режиме виртуализации. Это доступ с файлом образа виртуального диска?

Су, я считаю, что это простой случай нехватки оперативной памяти ...

Для начала при чтении / записи файла размером меньше вашей оперативной памяти (все работает быстро - как ваш тест "fio" ..)

Как только вы начинаете работать с данными, размер которых превышает размер кеша вашей ОС, кеш вашей ОС начинает заменяться (иногда даже на диск) (на самом деле вы должны проверить использование оперативной памяти, когда у вас скорость чтения 4 МБ)

Это звучит как что-то, что вы испытывали раньше, вы получаете медленную скорость чтения такого большого файла ... (я видел, как БД делает то же самое, когда использует большие индексы, которые не помещаются в ОЗУ)

Учитывая также накладные расходы на работу с виртуальной машиной (для меня это звучит очень типично)

Я бы проверил, что ваши диски не меняются местами или ваша активная память не заполнена (и дайте мне знать): D