LINUX.ORG.RU
решено ФорумAdmin

[drbd] Проблемы с производительностью.

 


0

2

Имеется два хоста с четырёхъядерным Intel(R) Xeon(R) CPU X3430 @ 2.40GHz на борту у каждого. 16 Гб RAM. Быстрый SAS-контроллер. Между собой соединены сетевыми картами Intel 82576 GN через четыре агрегированных в один канал интерфейса. Алгоритм balance-rr.

Тесты на скорость проводится так:

1. Создаём на tmpfs-разделе файл:

dd if=/dev/urandom of=/var/tmp/test.raw bs=128k count=8000

2. Готовый файл пишется в указанное место, изменяется только устройство, монтируемое к /mnt/drbd/ :

dd if=/var/tmp/test.raw of=/mnt/drbd/test.raw bs=128k count=8000 'oflag=direct'

Скорость сетевого соединения, померенная iperf: 453000 КБ/сек (здесь и далее все цифры в килобайтах и мегабайтах)

Сперва, создаём LVM-раздел на диске, пишем на него, как сказано в 2. Скорость получается в 400 МБ/сек.

Создаём DRBD-устройство с global_common.conf

global {
        usage-count no;
        minor-count 64;
        dialog-refresh 5;
}
common {
        protocol C;
        handlers {
                pri-on-incon-degr "/usr/lib64/drbd/notify-pri-on-incon-degr.sh; /usr/lib64/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                pri-lost-after-sb "/usr/lib64/drbd/notify-pri-lost-after-sb.sh; /usr/lib64/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                local-io-error "/usr/lib64/drbd/notify-io-error.sh; /usr/lib64/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
                fence-peer "/usr/lib64/drbd/crm-fence-peer.sh";
                after-resync-target /usr/lib64/drbd/crm-unfence-peer.sh;
        }
        startup {
                wfc-timeout 60;
                degr-wfc-timeout 120;
        }
        disk {
                on-io-error detach;
                fencing resource-only;
                no-disk-flushes;
                no-md-flushes;
                no-disk-barrier;
        }
        net {
                max-buffers 20000;
                max-epoch-size 20000;
                unplug-watermark 512;
                sndbuf-size 0;
        }
        syncer {
                rate 410000K;
        }
}
и файлом ресурса r13.res
 
resource r13 {
    device /dev/drbd13;
    disk /dev/vg/testdrbd;
    meta-disk internal;
    startup {
        become-primary-on nd1;
      }
    on nd1 {
        address 172.16.0.1:7802;
      }
    on nd2 {
        address 172.16.0.2:7803;
      }
  }

Созданный диск /dev/drbd13 монтируется, как показано в шаге 2 и скорость в результате оказывается… 57 МБ/сек. Я всё понимаю, но падение скорости почти в 7 раз…

Стал смотреть: похоже, что узкое место — I/O, т.к. процессор ожидает долго.

В ядре DMA имеется:

zgrep -i dma /proc/config.gz  | grep -v "#"
CONFIG_ZONE_DMA=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_ZONE_DMA32=y
CONFIG_HAVE_DMA_ATTRS=y
CONFIG_HAVE_DMA_API_DEBUG=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_ISA_DMA_API=y
CONFIG_SCSI_DMA=y
CONFIG_ATA_BMDMA=y
CONFIG_DMADEVICES=y
CONFIG_INTEL_MID_DMAC=y
CONFIG_INTEL_IOATDMA=y
CONFIG_TIMB_DMA=y
CONFIG_PCH_DMA=y
CONFIG_DMA_ENGINE=y
CONFIG_NET_DMA=y
CONFIG_ASYNC_TX_DMA=y
CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA=y
CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA=y
CONFIG_HAS_DMA=y
, сам процессор не настолько дохлый, чтобы не прокачать через себя хотя бы 200-250 МБ/сек.

Никто не сталкивался? Куда следует рыть, хотя бы направление подскажете? МП, вроде, может через себя достаточно широкий поток пропихнуть.


А если...

Попробывать разорвать соединение DRBD и повторить запись на DRBD в standAlone? Так точно сеть исключим!

petav ★★★★★
()
Ответ на: А если... от petav

А еще при тесте на LVM надо попробывать кеш сбросить и на скорость посмотреть после этого. Возможно проблема в кеше, встречался с инфой что лучше кеш LVM в купе с DRBD отключать, иначе замедления происходят.

petav ★★★★★
()
Ответ на: комментарий от petav

Параметр oflag=direct заставляет dd писать напрямую, в обход кеша, так что, эта скорость реальная, с учётом затрат на чтение файла из tmpfs.

HolyBoy
() автор топика
Ответ на: комментарий от ventilator

Включены. Оптимизации в drbd тоже включены, как видно из конфига. Поначалу вообще было 30 МБ/сек. Это после оптимизации конфига удалось до 57 МБ/сек вытянуть. Покручу ещё, разумеется.

На тестовом стенде всё работало нормально с realtek'ами. Скорость была на расчётном уровне.

Дело в том, что на продакшн-хостах стоит по две 4-хпортовые сетевухи, одна из которых гоняет drbd-трафик, а процессор — 4-хъядерный. Подозреваю, что прерывания распределяются неоптимально. Надо будет проверить.

К сожалению, все эти манипуляции можно только вечером завтра провести будет.

HolyBoy
() автор топика
Ответ на: комментарий от HolyBoy

Является копией ядра со стенда, только с изменённым составом драйверов для оборудования, естественно.

HolyBoy
() автор топика
Ответ на: комментарий от HolyBoy

У вас по идее большие пакеты, потому не думаю что там особо много прерываний. Попробуйте убрать бондинг, и соединить через один гигабитный порт.

ventilator ★★★
()

DRBD был, есть и будет г-ном, способным к тому же хоть как-то работать только в Primary/Secondary. Либо пользуйтесь GEOM из FreeBSD, либо заставьте начальника отказаться от дряной идеи нищебродства. Оно слишком дорого потом выходит, уж поверьте. Если уж совсем невмоготу и нужно использовать косой софтовый RAID по сети. смотрите в сторону GlusterFS - тот хоть люди с мозгами, а не соломой в голове писали. К тому же, Glusterfs даёт возможность делать полноценные RAID'ы, а не угробище, которое на одной ноде даже не в read-only.

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

способным к тому же хоть как-то работать только в Primary/Secondary

Мне других и не надо.

К тому же, Glusterfs даёт возможность делать полноценные RAID'ы

Но мне нужна не ФС, а синхронизация блочных устройств. Плюс, умение работать в кластере. Не более того.

а не угробище, которое на одной ноде даже не в read-only.

На secondary:

# mount /dev/drbd1 /mnt/drbd/
mount: block device /dev/drbd1 is write-protected, mounting read-only
HolyBoy
() автор топика
Ответ на: комментарий от HolyBoy

Странно, раньше говорил просто inapropriate ioctl for device

DRVTiny ★★★★★
()
Ответ на: комментарий от HolyBoy

>Подозреваю, что прерывания распределяются неоптимально

irqbalance работает? может, стоит с ним попробовать?

madgnu ★★★★★
()
Ответ на: комментарий от anonymous

А то balance-rr стоит использовать, только когда оборудование не поддерживает чего-то более приличного

anonymous
()
Ответ на: комментарий от DRVTiny

Я не знаю конечно

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

petav ★★★★★
()
Ответ на: Я не знаю конечно от petav

>Мое мнение не авторитетное, но много кто пользуется и в продакшне

Всегда есть компромисс между стоимостью (например, нормального SAN-сторэджа) и рисками. Но объективно не знаю ни одной конторы, которая хранила бы данные высокой доступности на DRBD. То, что всегда может подождать часок восстановления из бэкапов - пожалуйста. Иначе split-brain DRBD (самая страшная вещь,которая во многих случаях приводит потере данных из-за отсутствия даже зачатков эвристики в DRBD) приведёт напрямую к раскалыванию голов IT-начальства и, - по цепочке, - всех IT-подчинённых.

DRVTiny ★★★★★
()
Ответ на: комментарий от DRVTiny

Да состояния splitbrain это единственное что может быть опасно в этой технологии. Но и это отрабатывается stonith к примеру. Но явно не 100%. Согласен.

petav ★★★★★
()
Ответ на: комментарий от DRVTiny

приведёт напрямую к раскалыванию голов IT-начальства

там где есть ИТ начальство, там точно SAN ))))

petav ★★★★★
()
Ответ на: комментарий от petav

там самое смешное и обидное, что ничто по сути не мешает аккуратно выявить, какие блоки где изменились. В большинстве случаев реально изменилось что-то только на одной ноде, причём изменения эти мизерные по сравнению с размерами нижележащего блока. В некоторых случаях меняются совершенно разные данные и тогда нужно просто дать возможность хотя бы в интерактивном режиме сказать: пусть все изменения с обеих нод останутся и уже просто исчезающе редко бывает, что в состоянии split'а обе нода писали что-то на drbd и писали в одни и те же блоки. В последнем случае не помешал бы простой механизм отката с отменой всех изменений с момента T. Здесь DRBD мог бы использовать LVM-snapshot'ы, обновляемые с определённой периодичностью (раз в 5 минут например).
Но, повторюсь, с учётом того, что изначально DRBD в режиме Primary/Primary работает просто ужасно, вероятность того, что кто-то использует этот режим и ноды будут писать в одни и те же блоки - исчезающе мала (это больше было бы похоже на работу с нормальным RAID 1 на SAN - вот там действительно конкурентная запись!).
DRBD же иногда умудряется впадать в split и не выходить из него даже если данные изменились только на одной ноде, хотя эта ситуация совершенно элементарная!

DRVTiny ★★★★★
()

А слона-то мы и не заметили:

dd if=/var/tmp/test.raw of=/dev/vg/testdrbd bs=10M  'oflag=direct'
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 1.56732 s, 669 MB/s

dd if=/var/tmp/test.raw of=/dev/drbd13 bs=10M  'oflag=direct'
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 3.38932 s, 309 MB/s

dd if=/var/tmp/test.raw of=/dev/drbd13 bs=128k  'oflag=direct'
8000+0 records in
8000+0 records out
1048576000 bytes (1.0 GB) copied, 18.8894 s, 55.5 MB/s

Полагаю, можно считать закрытым. :) Всем спасибо большое!

HolyBoy
() автор топика
Ответ на: комментарий от HolyBoy
dd if=/dev/zero of=/dev/vg/testdrbd bs=10M  'oflag=direct'
dd: writing `/dev/vg/testdrbd': No space left on device
205+0 records in
204+0 records out
2147483648 bytes (2.1 GB) copied, 3.48434 s, 616 MB/s

dd if=/dev/zero of=/dev/drbd13 bs=10M  'oflag=direct'
dd: writing `/dev/drbd13': No space left on device
205+0 records in
204+0 records out
2147381248 bytes (2.1 GB) copied, 7.00496 s, 307 MB/s
HolyBoy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.