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

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

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

$ 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 говорится:

tps

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

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

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

iostat -d 1 2

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

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

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

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

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

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

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