Проблемы с интерпретацией мер tps Иостата

Прелюдия: Я сбросил базу данных объемом 5,2 ГБ с помощью команды mysqldump. Я сделал это на слабом виртуальном сервере с 512 МБ памяти. Это заняло около часа. Сейчас я перезагружаю эту базу данных на моем настольном компьютере с двухъядерным процессором и 2 ГБ памяти. Перезагрузка уже девятого часа, и я даже не знаю, подходит ли она к концу. Я перезагрузил эту базу данных на той же машине около года назад, и это заняло всего два часа. Разница между тогда и сейчас состоит в том, что я заменил свой единственный жесткий диск ATA двумя дисками SATA в режиме raid1. Я знаю, что raid1 будет писать медленнее (теоретически), но определенно не в 4,5 раза медленнее! Так что я разразился иостатом и просто запутался.

$ sudo iostat 
Linux 2.6.30-2-amd64 (lukahn)  12/12/2009  _x86_64_ (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7.13    0.00    1.94   27.96    0.00   62.97

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda             144.02       198.41     11139.44    9322418  523399320
sdb             143.78       165.59     11137.39    7780516  523303000
hda               0.01         0.05         0.00       2492          0
md0               0.66         6.44         0.71     302538      33496
md1               7.32        67.02         7.51    3148938     352960
md2               6.08       240.02        18.95   11277610     890584
md3            1389.80        46.85     11106.55    2201410  521853640
md4               0.41         3.03         0.21     142322       9824

sda и sdb - это настоящие диски SATA, которые поддерживают устройства md, как вы можете увидеть в /proc/mdstat:

$ cat /proc/mdstat 
Personalities : [raid0] [raid1] 
md4 : active raid0 sda6[0] sdb6[1]
      48821248 blocks 64k chunks

md3 : active raid1 sda5[0] sdb5[1]
      48829440 blocks [2/2] [UU]

md2 : active raid1 sda4[0] sdb4[1]
      1318358080 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      48829440 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      9767424 blocks [2/2] [UU]

Файл.sql, с которого я перезагружаюсь, находится в разделе / ​​home на md2, а раздел /var на md3. Я предполагаю, что блоки, записанные в md3, намного выше, чем блоки, считанные из md2, из-за регенерирующих индексов MySql. Однако большой вопрос, который у меня возникает, заключается в том, как показатель tps для md3 может быть намного выше, чем показатель tps для sda и sdb?

Параметр -m для iostat показывает одинаковый объем данных (5,55 МБ / с), записываемых на диск как для md3, так и для sda / sdb:

$ sudo iostat -m
Linux 2.6.30-2-amd64 (lukahn)   12/12/2009  _x86_64_    (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           7.39    0.00    2.00   28.16    0.00   62.44

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda             145.16         0.10         5.55       4976     267768
sdb             144.90         0.09         5.55       4143     267716
hda               0.01         0.00         0.00          1          0
md0               0.66         0.00         0.00        154         16
md1               7.18         0.03         0.00       1580        172
md2               6.19         0.13         0.01       6153        443
md3            1418.41         0.02         5.53       1146     266994
md4               0.40         0.00         0.00         69          5

Страница справочника iostat гласит:

ТПС

Укажите количество передач в секунду, которые были выданы устройству. Передача - это запрос ввода-вывода на устройство. Несколько логических запросов могут быть объединены в один запрос ввода-вывода к устройству. Перевод имеет неопределенный размер.

Я не ожидаю, что они будут одинаковыми, но, конечно, не будут отличаться на 864%! Это признак узкого места из-за неправильной настройки устройства md или я просто ни о чем не беспокоюсь?

3 ответа

Это один вызов iostat, который не предоставляет значимых данных для значений "в секунду", полезны только счетчики - он не может рассчитать изменение в секунду из одного значения, ему нужно знать два значения и время между ними. Чтобы увидеть реальные значения, попробуйте что-то вроде:

iostat -d 1 2

Вторым выводом будут реальные значения.

Из справочной страницы iostat:

Первый отчет, сгенерированный командой iostat, предоставляет статистику времени, прошедшего с момента загрузки системы. Каждый последующий отчет охватывает время с момента предыдущего отчета.

Поскольку скорости передачи одинаковы, предоставленные вами данные говорят мне, что уровень MD кэширует транзакции, а затем записывает их на физический диск большими кусками.

Как вы сказали, медлительность, с которой вы сталкиваетесь при перезагрузке базы данных, вероятно, вызвана индексами. Вы можете избежать этого, просто не обновляя индексы при загрузке данных, а затем просто воссоздайте индексы в конце.

Частота транзакций, поддерживаемая данным диском, является функцией времени поиска дорожки. Для дисков SATA это обычно около 5-8 мс, так что я бы ожидал где-то около 125-200 транзакций в секунду.

Вы видите ~145 т / с на каждом из дисков, так что это кажется довольно разумным.

Другие вопросы по тегам