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

Вставка MySQL вызывает ожидание высокого ввода-вывода диска?

Я получаю то, что кажется большим временем ожидания при выполнении больших вставок в Mysql. Правильно ли я предполагаю, что у меня проблема с дисковым вводом-выводом? Да, я запускаю Mysql на виртуальной машине.

Innodb_buffer_pool hit rate is %100
innodb_flush_method = ''
innodb_log_file_size = 250M
innodb_flush_log_at_trx_commit=1

$iostat -dx 10
Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvda              0.00  2514.09  0.10 1483.22     0.80 31958.44    21.55    39.04   26.00   0.64  94.91
xvda1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
xvda2             0.00  2514.09  0.10 1483.22     0.80 31958.44    21.55    39.04   26.00   0.64  94.91
dm-0              0.00     0.00  0.10 3983.82     0.80 31870.53     8.00   163.34   39.84   0.24  94.91
dm-1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
xvda              0.00  2206.21  0.00 1336.24     0.00 28342.74    21.21    41.85   31.43   0.72  96.02
xvda1             0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
xvda2             0.00  2206.21  0.00 1336.24     0.00 28342.74    21.21    41.85   31.43   0.72  96.02
dm-0              0.00     0.00  0.00 3542.44     0.00 28339.54     8.00   165.48   47.09   0.27  96.02
dm-1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

$ top
top - 11:57:19 up 88 days, 11:38,  3 users,  load average: 1.44, 1.54, 1.60
Tasks:  80 total,   2 running,  78 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.7%us,  1.0%sy,  0.0%ni, 44.5%id, 53.2%wa,  0.0%hi,  0.0%si,  0.7%st
Mem:  16777216k total, 13791264k used,  2985952k free,   166988k buffers
Swap:  2129912k total,       44k used,  2129868k free,  7157368k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3910 mysql     15   0 13.2g 5.6g 6760 S  1.7 34.8   4:50.09 mysqld
    1 root      15   0 10364  740  620 S  0.0  0.0   0:00.29 init
    2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 migration/0
    3 root      34  19     0    0    0 S  0.0  0.0   0:02.77 ksoftirqd/0
    4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
    5 root      10  -5     0    0    0 S  0.0  0.0   0:00.08 events/0
    6 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 khelper
    7 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kthread
    9 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 xenwatch
   10 root      10  -5     0    0    0 S  0.0  0.0   0:01.95 xenbus
   15 root      10  -5     0    0    0 S  0.0  0.0   0:00.04 kblockd/0
   16 root      20  -5     0    0    0 S  0.0  0.0   0:00.00 cqueue/0
   20 root      20  -5     0    0    0 S  0.0  0.0   0:00.00 khubd
   22 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kseriod
   84 root      15   0     0    0    0 S  0.0  0.0   0:00.01 khungtaskd
   87 root      10  -5     0    0    0 S  0.0  0.0   1:37.10 kswapd0
   88 root      20  -5     0    0    0 S  0.0  0.0   0:00.00 aio/0
  218 root      11  -5     0    0    0 S  0.0  0.0   0:00.00 kpsmoused
  239 root      17  -5     0    0    0 S  0.0  0.0   0:00.00 kstriped
  248 root      20  -5     0    0    0 S  0.0  0.0   0:00.00 ksnapd
  259 root      10  -5     0    0    0 S  0.0  0.0   1:56.45 kjournald
  281 root      10  -5     0    0    0 S  0.0  0.0   0:01.04 kauditd
  309 root      16  -4 12632  744  408 S  0.0  0.0   0:00.37 udevd
  636 root      12  -5     0    0    0 S  0.0  0.0   0:00.00 kmpathd/0
  637 root      12  -5     0    0    0 S  0.0  0.0   0:00.00 kmpath_handlerd
  656 root      11  -5     0    0    0 S  0.0  0.0   0:00.00 kjournald

Чтобы ответить на него просто, да.

Главный показатель - это 53.2% время ожидания на ЦП. Если ваш процент ожидания ввода-вывода превышает (1 / # ядер ЦП), то ваши ЦП ждут значительное количество времени, пока дисковая подсистема наверстает упущенное.

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

Кроме того, когда вы смешиваете большую базу данных и / или базу данных, которая находится под большой нагрузкой, с дисковой системой, которая не предназначена для интенсивного ввода-вывода и уже испытывает большой объем операций ввода-вывода (например, дисковая подсистема виртуальной машины ), это усугубляет проблему и создает серьезные проблемы с дисковым вводом-выводом.

За исключением перемещения сервера в выделенный ящик с дисковой подсистемой, оптимизированной для SQL (что было бы вашим долгосрочным решением), лучше всего снять любую ненужную нагрузку с виртуальной машины (например, веб-сервера), и просто запустите на нем голые кости и SQL. Кроме того, убедитесь, что вы настраиваете свои индексы и запросы, и попробуйте выполнить большинство запросов вставки в часы низкой нагрузки, если это возможно.

Да, вы правы, у вас проблема с дисковым вводом-выводом. Кстати, почему вы используете innodb_flush_log_at_trx_commit=1? Он не работает в условиях большой нагрузки, используя innodb_flush_log_at_trx_commit=2 Рекомендовано. Но я не думаю, что это поможет вам, потому что у вас большие вставки, поэтому я предполагаю, что скорость транзакций не слишком высока (не сотни в секунду). Поэтому вам следует подумать об улучшении вашей дисковой подсистемы, как-то добавив больше шпинделей.

Чтобы быть противником, я должен не согласиться с некоторым анализом. Прежде всего, я думаю, что время iowait может ввести в заблуждение. Все, что он на самом деле говорит, это то, что пока процессор свободен, больше ничего не происходит. Другими словами, низкий уровень iowait не означает, что диск не занят или система не ждет, это просто означает, что у него есть дела поважнее, чем бездельничать, вертя пальцами руки, ожидая завершения io.

Лично я считаю, что время ожидания и обслуживания в выводе iostat намного более информативно, хотя я не являюсь поклонником формата вывода, так как мне гораздо труднее читать, чем вывод collectl. В любом случае, время ожидания в этом выводе составляет всего порядка 20-40 мсек, что на самом деле не так уж и плохо.

-отметка