Почему запросы MySQL накапливают в “Передающих данных” состояние?

Вы попробовали что-то вроде этого?

ssh user@host1 "ssh user@host2 'cat file.txt' " > local_file.txt
6
задан 30 November 2010 в 21:07
3 ответа

Оказалось, что это недостаток в комбинации innodb_file_per_table , default-storage-engine = innodb и часто просматриваемая страница, на которой создана временная таблица. Каждый раз при закрытии соединения таблица удалялась , а страницы из пула буферов LRU отбрасывались. Это заставит сервер ненадолго остановиться, но никогда не будет обрабатывать запрос, который действительно вызвал проблему.

Хуже того, параметр innodb_file_per_table томился в нашем файле my.cnf в течение нескольких месяцев, прежде чем сервер пришлось перезапустить по совершенно не связанной причине, в течение которых мы использовали эти временные таблицы без проблема. (NOC внезапно отключил DNS-сервер, в результате чего каждое новое соединение зависало, потому что мы не включили skip-name-resolve и часами не признавали, что что-то изменилось.)

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

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

К счастью, мы смогли переписать страницу с нарушением, чтобы использовать еще более быстрый набор запросов, которые загружали большую часть работы на интерфейсные веб-серверы и с тех пор не обнаружили никаких проблем.

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

К счастью, мы смогли переписать страницу с нарушением, чтобы использовать еще более быстрый набор запросов, которые загружали большую часть работы на интерфейсные веб-серверы и с тех пор не обнаружили никаких проблем.

3
ответ дан 3 December 2019 в 00:20

Ну, действительно обратите внимание, что, если я вспоминаю хорошо (это было некоторое время, так как я сделал работу DB) КОЛИЧЕСТВО (*) запросы без оператора Where на innodb таблицах известно медленнее, чем на таблицах MyISAM и Memory.

Кроме того, это - случайно Xen DomU?

Каков frontend язык? Если PHP, это использует MySQL или MySQLi? Они используют постоянные соединения?

Вы не упомянули базовую операционную систему, но в случае Linux я запустил бы, уставившись на вывод free -m, обращение особого внимания на последние две строки, которые будут видеть, трудна ли память в целом.

[0:504] callisto:cyanotype $ free -m
             total       used       free     shared    buffers     cached
Mem:          3961       3816        144          0        184       1454
-/+ buffers/cache:       2177       1784
Swap:         2898          0       2898

Здесь у нас есть система, это здорово (это - моя рабочая станция). Второй столбец исключает буферы и кэш, таким образом, я на самом деле использую 2177 МБ памяти и имею легко доступные 1 784 мегабайта.

Последняя строка показывает, что я не использую подкачку вообще до сих пор.

Затем предоставление vmstat(8), видеть, повреждает ли Ваша система как безумный, было бы полезно, также.

[0:505] callisto:cyanotype $ vmstat 5 10
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 134116 189828 1499948    0    0    11     3   44   49  1  1 98  0
 0  0      0 143112 189836 1489688    0    0     0     6  526 2177  1  1 98  0
 0  0      0 139268 190504 1491864    0    0   512     4  663 4704  2  1 96  1
 2  0      0 136688 191084 1493484    0    0   473     5  641 3039  1  1 97  1
 0  0      0  52636 191712 1518620    0    0  5066     4 1321 6600  8  2 86  4
 5  0      0  72992 193264 1377324    0    0 10742    31 1602 7441 12  3 80  5
 2  1      0  84036 193896 1202012    0    0 10126    43 2621 4305 31  2 57 10
 3  0      0  42456 195812 1060904    0    0  3970    75 55327 9806 43 5 41 10
 8  1      0  34620 197040 942940     0    0  3554    64 50892 12531 43 6 44 6
^C
[0:506] callisto:cyanotype $ 

(Мой рабочий стол действительно не делает всего так очень здесь, извините. Какая трата 8 совершенно хороших ядер)

Если Вы видите много времени проводящего процесса в 'b' столбце, который означает, что они заблокированы, ожидая чего-то. Часто это - IO. Важные столбцы здесь si и so. Проверьте, заполняются ли они с высокими значениями. Если так, это может быть Вашей проблемой - что-то использует большую память, больше, чем Вы можете на самом деле усилие. Используя top(4) и упорядочивание столбцов % памяти (shift+m, в то время как в вершине) могло бы показать преступнику (преступникам).

Не невозможно, что Ваша система повреждает к и от подкачки и насыщает диски, вызывая заблокированные потоки и процессы. Инструмент iostat(8)(часть пакета sysstat, обычно), должен быть дан водоворот, чтобы видеть, есть ли у Вас процессы, которые заблокированы, застревают на IO_WAIT. Влажный диск может записать плохие новости для целой системы при высокой загрузке, особенно если система подкачивает много.

Вы могли бы выполнить iostat с расширенной статистикой, каждые пять секунд, например:

[0:508] callisto:cyanotype $ iostat -x 5
Linux 2.6.35-23-generic (callisto)  2010-11-30  _x86_64_    (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          16,55    0,12    2,70    2,60    0,00   78,02

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm      %util
sdc               0,00     2,00    1,00    0,80    27,20    22,40    27,56     0,01    3,33   3,33       0,60
sdd               0,00    12,60   67,60    4,80  4222,40   139,20    60,24     0,62    8,62   3,29      23,80
sde               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00       0,00
sdf               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00   0,00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          32,02    0,10    1,83    0,44    0,00   65,61

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdc               0,60     3,20   11,00    0,80   265,60    32,00    25,22     0,05    3,90   2,88   3,40
sdd               0,00     8,20    0,00    3,00     0,00    89,60    29,87     0,02    8,00   7,33   2,20
sde               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00   0,00
sdf               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00   0,00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          49,26    0,22    3,12    0,12    0,00   47,28

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdc               6,20     3,00    7,40    3,80   208,00    54,40    23,43     0,09    7,86   2,50   2,80
sdd               0,00    15,20    0,20    4,00     1,60   152,00    36,57     0,03    6,67   6,19   2,60
sde               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00   0,00
sdf               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00   0,00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          16,00    0,54    1,05    1,07    0,00   81,35

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdc               4,20     0,00   31,40    0,00  3204,80     0,00   102,06     0,17    4,90   2,68   8,40
sdd               0,00    28,20    0,20    2,60     1,60   246,40    88,57     0,02    7,14   7,14   2,00
sde               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00   0,00
sdf               0,00     0,00    0,00    0,00     0,00     0,00     0,00     0,00    0,00   0,00   0,00

^C

Это должно позволить Вам легко видеть, насыщаются ли Ваши объемы. Например, здесь, Вы видите, что мои диски ужасно недостаточно используются, что система тратит большую часть своего бездействия циклов CPU и т.д. и т.д. Если тот процент находится главным образом в столбце IOWAIT %, хорошо у Вас есть узкое место IO здесь. Вы, вероятно, уже знаете, что все это, но просто покрывающий все основания удостоверяется.

Идея состоит в том, что Ваш файл конфигурации изменился, и у Вас нет истории его (подвергание Ваших файлов конфигурации при управлении версиями является прекрасной идеей по той самой причине) - и это не невозможно размер буфера suddendly измененный таким образом, делающие дорогие запросы как КОЛИЧЕСТВО (*) без ВЫБОРА suddendly начинают проглатывать ресурсы.

На основе того, что Вы узнали из предыдущего использования инструментов abive - необходимо, вероятно, осмотреть конфигурационный файл (являющийся единственной вещью, которая изменилась, это вероятно преступник) видеть, нормальны ли буферности для средней загрузки.

Насколько большой буферы, как query_cache_size значение, и особенно sort_buffer размеры? (Если это не уместится в памяти, то это будет выполненный на диске по крупной стоимости, поскольку я уверен, что можно вообразить).

Насколько большой innodb_buffer_pool_size?

Насколько большой table_cacheи самое главное, который оценивает соответствия в системных пределах для дескрипторов файлов? (и открытый предел файлов в [mysqld] и на уровне ОС).

Кроме того, я не помню первое, что пришло на ум, если это все еще верно, но я вполне уверен, что innodb на самом деле блокирует всю таблицу каждый раз, когда это должно фиксировать автоинкрементные поля. Я погуглил, и я не мог найти, было ли это все еще верно или нет.

Вы могли также использовать innotop(1) видеть, что продолжается больше подробно, также.

Я надеюсь, что это помогает так или иначе или дает Вам начальную точку :)

6
ответ дан 3 December 2019 в 00:20

Вероятно, этому есть много причин. В нашем конкретном случае это происходило, когда количество наблюдаемых запросов резко увеличивалось в течение короткого промежутка времени, что вызывало перегрузку ЦП, поскольку количество потоков превышало в 4 раза количество ядер на сервере. Наша проблема заключается в том, что скачок количества запросов на самом деле является нормальным для нашего приложения, и реализация POSIX работала приемлемо «большую часть» времени, но периодически останавливалась. После долгих исследований мы наткнулись на корпоративный плагин Oracle mySQL под названием thread-pool, который предлагает альтернативную реализацию для обработки потоков. Еще лучше - сервер Percona реализовал это изначально (плагин не нужен), и изменение было однострочным для тестирования в нашем файле cnf. В результате производительность при тяжелых нагрузках значительно улучшилась. Хотя это вряд ли будет проблемой для многих реализаций, я надеюсь, что это может быть для некоторых, и это простое изменение стоит протестировать.

Percona Thread-pool mySQL5.7

а вот еще один пример использования:

Percona 100k соединений

0
ответ дан 19 October 2020 в 14:13

Теги

Похожие вопросы