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

3 ответа

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

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

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

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

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

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

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

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

-отметка

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