У меня есть выделенный сервер с 3 жесткими дисками. Системный диск, резервный диск (такой же, как системный диск) и диск данных. Когда я копирую много данных с помощью cp (скажем, между резервным диском и диском данных), средняя загрузка становится заоблачной.
Например, средняя загрузка на данный момент составляет около 0,57, при копировании данных она может превышать 50 и более.
Копирование с rsync and with --bwlimit=10000
проходит без проблем. Более высокие значения вызывают большую нагрузку.
Файловая система - ext3.
% 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
% 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
% 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 года назад, а вы тем временем нашли решение?