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

Копирование вызывает большой айовейт

У меня есть выделенный сервер с 3 жесткими дисками. Системный диск, резервный диск (такой же, как системный диск) и диск данных. Когда я копирую много данных с помощью cp (скажем, между резервным диском и диском данных), средняя загрузка становится заоблачной.

Например, средняя загрузка на данный момент составляет около 0,57, при копировании данных она может превышать 50 и более.

Копирование с rsync and with --bwlimit=10000 проходит без проблем. Более высокие значения вызывают большую нагрузку.

Файловая система - ext3.

sda - системный диск:

% hdparm -Tt /dev/sda

/dev/sda:
 Timing cached reads:   13444 MB in  2.00 seconds = 6730.82 MB/sec
 Timing buffered disk reads:  232 MB in  3.02 seconds =  76.73 MB/sec

sdb - диск с данными:

% hdparm -Tt /dev/sdb

/dev/sdb:
 Timing cached reads:   13740 MB in  2.00 seconds = 6879.30 MB/sec
 Timing buffered disk reads:  430 MB in  3.00 seconds = 143.10 MB/sec

sdc - резервный диск:

% hdparm -Tt /dev/sdc

/dev/sdc:
 Timing cached reads:   13796 MB in  2.00 seconds = 6907.75 MB/sec
 Timing buffered disk reads:  336 MB in  3.01 seconds = 111.45 MB/sec

iostat -x 1 (без копирования): http://pastebin.com/4WKU7YPa

iostat -x 1 (при копировании: sdc> sdb): http://pastebin.com/fHafRCa8

% cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]

Остальные два диска сейчас «дедлайн», но они тоже были «cfq». Просто попробовал посмотреть, будет ли разница. Нет.

Любые операции, требующие более интенсивного использования диска, убивают сервер. Если какой-то процесс использует больше памяти и требуется подкачка, нагрузка становится очень высокой. Иногда мне нужно убить какую-то службу, чтобы нагрузка снизилась. Бывали случаи, когда загрузка доходила до 500 из-за подкачки.

Сервер имеет 4 ГБ оперативной памяти и Xeon X3220 @ 2,40 ГГц. Я могу смириться с низкой производительностью, когда не хватает оперативной памяти, но простое копирование не должно убивать сервер. Это просто неправильно.

Есть идеи, в чем может быть проблема? Что еще я должен проверить? Может быть, это плохой контроллер материнской платы?

Добавлено:

% fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes
 255 heads, 63 sectors/track, 60801 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sda1   *           1          13      104391   83  Linux
 /dev/sda2              14        1318    10482412+  83  Linux
 /dev/sda3            1319        2623    10482412+  83  Linux
 /dev/sda4            2624       60801   467314785    5  Extended
 /dev/sda5            2624        3928    10482381   83  Linux
 /dev/sda6            3929        4189     2096451   82  Linux swap / Solaris
 /dev/sda7            4190       60670   453683601   83  Linux
 /dev/sda8           60671       60801     1052226   83  Linux

 Disk /dev/sdb: 2000.3 GB, 2000398934016 bytes 
 255 heads, 63 sectors/track, 243201 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sdb1               1      243201  1953512001   83  Linux

 Disk /dev/sdc: 500.1 GB, 500107862016 bytes
 255 heads, 63 sectors/track, 60801 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sdc1   *           1       60801   488384001   83  Linux

% cat / proc / scsi / scsi

 Attached devices:
 Host: scsi0 Channel: 00 Id: 00 Lun: 00
   Vendor: ATA      Model: WDC WD5002ABYS-0 Rev: 02.0
   Type:   Direct-Access                    ANSI SCSI revision: 05
 Host: scsi0 Channel: 00 Id: 01 Lun: 00
   Vendor: ATA      Model: WDC WD2003FYYS-0 Rev: 01.0
   Type:   Direct-Access                    ANSI SCSI revision: 05
 Host: scsi1 Channel: 00 Id: 00 Lun: 00
   Vendor: ATA      Model: WDC WD5002ABYS-0 Rev: 02.0
   Type:   Direct-Access                    ANSI SCSI revision: 05

Я думаю, что ты в том же деле, что и я Создание большого количества грязных страниц блокирует синхронную запись

kjournald среди ведущих процессов.

вы используете журналируемую файловую систему, такую ​​как ext3, которая, по-видимому, вызывает блокировку синхронной записи.

Можешь попробовать

Уменьшение объема грязной памяти, которую может создать процесс:

echo 100000000 > /proc/sys/vm/dirty_background_bytes
echo 200000000 > /proc/sys/vm/dirty_bytes 

Процесс копирования не сможет написать слишком много сразу. Он запишет часть данных, а затем гарантирует, что эти данные будут сброшены на диск перед записью следующей части. Это гарантирует, что потоку журналирования не слишком много работы, и он по-прежнему сможет работать с запросами от других процессов, пока выполняется копирование.

Еще вы можете попробовать сделать копию с помощью dd и убедиться, что вы пишете синхронно:

dd if=foo of=bar bs=4096 oflag=sync

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

А также, если это соответствует вашему варианту использования, вы можете удалить ведение журнала в целевой папке, если вы понимаете риск. Вы можете перемонтировать свою (я полагаю, ext3?) Файловую систему с опцией

data=writeback

Это то, что я пробовал со своей системой. Этот вопрос был открыт 2 года назад, а вы тем временем нашли решение?