Прелюдия: я сбросил базу данных 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 транзакций в секунду на каждом из дисков, так что это кажется вполне разумным.