Mysql список процессов слишком длинный с убитыми запросами - PullRequest
1 голос
/ 08 января 2020

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

mysqldump --user=${mysql_username} --password=${mysql_password} $db --single-transaction --events -R >> $normal_output_filename    

Недавно я перешел с выделенного сервера (Centos 6, Apache 2.2, php5 .6, Mysql 5.0 - насколько я помню) на VPS с Centos 7, Apache 2.4, php 7.2 / 5.6, MariaDB 5.5)
В последнее время время от времени доступ к некоторым базам данных замедляется, и в конечном итоге "превышено время выполнения"
У меня есть задание cron для ежедневного резервного копирования после 03:00 всех баз данных.
От ps aux | grep mysql Я получаю

root 15840 0,0 0,0 126772 3456? SN 03:09 0:00 mysqldump --user = uuu --password = x xxxxxx information_schema - одиночная транзакция --events -R

, которая удерживается в течение нескольких часов.
Однажды я осознал эту проблему после шести дней, когда mysqldump находился в режиме ожидания, и новые резервные копии БД не выполнялись.

show status like '%conn%';    

ничего не выводит, он остается в режиме ожидания.

mysqladmin -uuser1 -p*** processlist     

(user1 - суперпользователь) перечисляет почти 8000 строк уничтоженных процессов, например

| 671958 | user1  | localhost | database1 | Killed  | 3 |   |                  | 0.000    |
| 671959 | user1  | localhost | database1 | Killed  | 3 |   |                  | 0.000    |
| 671961 | user1  | localhost | database1 | Killed  | 2 |   |                  | 0.000    |
| 671962 | user1  | localhost | database1 | Killed  | 2 |   |                  | 0.000    |
| 671963 | user1  | localhost | database2 | Killed  | 2 |   |                  | 0.000    |
| 671964 | user2  | localhost | database3 | Killed  | 1 |   |                  | 0.000    |
| 671965 | user1  | localhost |           | Killed  | 1 |   |                  | 0.000    |
| 671966 | user1  | localhost |           | Query   | 0 |   | show processlist | 0.000    |
+--------+-----+--------------+-----------+---------+---+---+------------------+----------+

Я еще не перезагружал сервер mysql. Я вижу, как некоторые веб-сайты быстро загружают свои страницы, которые имеют несколько обращений к БД, в то время как почтовые сообщения Horde и Roundcube достигают тайм-аута и ошибки 500.

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

ОБНОВЛЕНИЕ 1:
VPS на Contabo, 200 ГБ SSD диск. Используется 61,93 ГиБ / 134,78 ГиБ / 196,71 ГиБ всего
Процессор Intel® R Xeon® R E5-2620 v3 @ 2,40 ГГц, 4 ядра
CentOS Linux 7.7.1908
Linux 3,10 .0-1062.9.1.el7.x86_64 на x86_64
В это время: загрузка процессора в среднем составляет 0,88 (1 мин), 1,03 (5 мин), 0,95 (15 мин),
8 ГБ ОЗУ - в настоящее время используется 1,81 ГБ. / 2,21 ГБ кэшировано / 7,63 ГБ всего
В это время: время безотказной работы 2 дня, 17 часов

БОЛЬШЕ ДАННЫХ

ОБНОВЛЕНИЕ 2

Добавлено thread_handling=pool-of-threads в my.cnf

Ответы [ 2 ]

1 голос
/ 22 января 2020

Некоторые вещи изменились ...

Наблюдения:

  • Версия: 5.5.64-MariaDB
  • 8 ГБ ОЗУ
  • Время безотказной работы = 5д 15:01:27
  • Вы не работаете на Windows.
  • Запуск 64-разрядной версии
  • Похоже, что вы используете MyISAM и InnoDB.

Более важные проблемы:

Для 8 ГБ и смеси MyISAM и InnoDB:

key_buffer_size = 800M
innodb_buffer_pool_size = 3000M

ulimit -n равно 1024 И все же open_files_limit - это всего лишь 760. Я не знаю, как поднять и поднять их.

innodb_log_file_size = 5M - это слишком мало. Тем не менее, это будет грязно, чтобы изменить.

24 ОПТИМИЗИРУЕТ / очень много, даже для MyISAM. 1 / месяц может быть более реалистичным c.

Есть признаки медленных запросов; см. мой блог для того, чтобы преследовать это.

thread_cache_size - установите в 30; это может значительно ускорить соединения.

Подробности и другие наблюдения:

Преобразование из MyISAM в InnoDB

( (key_buffer_size / 0.20 + innodb_buffer_pool_size / 0.70) ) = ((200M / 0.20 + 128M / 0.70)) / 8192M = 14.4% - Большинство доступных оперативной памяти должно быть доступно для кэширования. - http://mysql.rjweb.org/doc.php/memory

( open_files_limit ) = 760 - ulimit -n - Чтобы разрешить больше файлов, измените ulimit или /etc/security/limits.conf или в sysctl.conf (kern .maxfiles & kern.maxfilesperpro c) или что-то еще (в зависимости от ОС)

( innodb_buffer_pool_size ) = 128M - Кэш данных InnoDB + Index - 128M (старое значение по умолчанию) очень мало.

( innodb_log_buffer_size / innodb_log_file_size ) = 8M / 5M = 160.0% - буфер находится в оперативной памяти; файл находится на диске. - Параметр buffer_size должен быть меньше, а размер файла file_size должен быть больше.

( innodb_flush_method ) = innodb_flush_method = - Как InnoDB должен запрашивать у ОС запись блоков. Предложите O_DIRECT или O_ALL_DIRECT (Percona), чтобы избежать двойной буферизации. (По крайней мере, для Unix.) См. Chrischandler для предупреждения о O_ALL_DIRECT

( innodb_io_capacity ) = 200 - число операций ввода-вывода в секунду на диске. 100 для медленных дисков; 200 для прядильных дисков; 1000-2000 для твердотельных накопителей; умножить на коэффициент RAID.

( innodb_stats_on_metadata ) = innodb_stats_on_metadata = ON - Повторно анализировать таблицу при касании статистики. - ON, вероятно, замедляет определенные SHOW и обращения к information_schema.

( innodb_recovery_update_relay_log ) = innodb_recovery_update_relay_log = OFF - Помогает избежать ошибок репликации после cra * sh.

( innodb_import_table_from_xtrabackup ) = 0 - Полезно для транспортабельных табличные пространства

( sync_binlog ) = 0 - использование 1 для дополнительной безопасности, при некоторой стоимости ввода-вывода = 1 может привести к большому количеству «конца запроса»; = 0 может привести к «binlog в невозможной позиции» и потерять транзакции в cra sh, но быстрее.

( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF - регистрировать ли все тупики. - Если вы страдаете от тупиков, включите это. Внимание: если у вас много взаимоблокировок, это может привести к большой записи на диск.

( character_set_server ) = character_set_server = latin1 - Проблемам с кодировкой можно помочь, установив для character_set_server (теперь latin1) значение utf8mb4. Это будущее значение по умолчанию.

( local_infile ) = local_infile = ON - local_infile (теперь ON) = ON - потенциальная проблема безопасности

( Created_tmp_disk_tables / Created_tmp_tables ) = 98,045 / 181066 = 54.1% - Процент временных таблиц, которые были переданы на диск - Возможно, увеличьте tmp_table_size (сейчас 16777216) и max_heap_table_size (теперь 16777216); улучшить показатели; избегайте больших двоичных объектов и т. д. c.

( (Com_insert + Com_update + Com_delete + Com_replace) / Com_commit ) = (388211 + 19570 + 3890 + 330) / 0 = INF - Операции на коммит (с учетом всех InnoDB) - Низкий: может помочь объединить запросы в транзакции; Высокий: длинные транзакции напрягают разные вещи.

( Select_scan ) = 945,274 / 486087 = 1.9 /sec - полное сканирование таблицы - добавление индексов / оптимизация запросов (если они не являются крошечными таблицами)

( Com_optimize ) = 3,202 / 486087 = 24 /HR - как часто ОПТИМИЗИРОВАТЬ ТАБЛИЦА выполняется. - OPTIMIZE TABLE редко используется, конечно, не на высокой частоте.

( binlog_format ) = binlog_format = STATEMENT - ЗАЯВЛЕНИЕ / СТРОКА / СМЕШАННАЯ. - ROW предпочтительнее на 5,7 (10,3)

( expire_logs_days ) = 0 - как скоро автоматически очистить binlog (после этого много дней) - слишком большой (или ноль) = занимает дисковое пространство; слишком маленький = нужно быстро реагировать на сеть / машину cra sh. (Не актуально, если log_bin (теперь OFF) = OFF)

( log_slow_queries ) = log_slow_queries = OFF - регистрировать ли медленные запросы. (До 5.1.29, 5.6.1)

( slow_query_log ) = slow_query_log = OFF - регистрировать ли медленные запросы. (5.1.12)

( long_query_time ) = 10 - Обрезание (секунды) для определения «медленного» запроса. - Предложить 2

( back_log ) = 50 - (Размер по состоянию на 5.6. 6; на основе max_connections) - Повышение до минимума (150, max_connections (теперь 151)) может помочь при выполнении большого количества соединений.

( Com_change_db / Connections ) = 8,920,272 / 2392646 = 3.73 - Переключатели базы данных на соединение - (минорные) Рассмотрите возможность использования "db .table "синтаксис

( Com_change_db ) = 8,920,272 / 486087 = 18 /sec - возможно, исходит из операторов USE. - Рассмотрите возможность подключения к БД, используя синтаксис db.tbl, исключая ложные операторы USE и т. Д. c.

У вас есть полупериод кеша запросов. Вы должны установить и query_cache_type = OFF, и query_cache_size = 0. Существует (согласно слухам) «ошибка» в коде Q C, которая оставляет некоторый код включенным, если вы не отключите обе эти настройки.

Аномально маленький:

Innodb_adaptive_hash_non_hash_searches = 46 /sec
Innodb_buffer_pool_bytes_data = 272 /sec
Innodb_checkpoint_max_age = 7.78e+6
Innodb_master_thread_10_second_loops = 17,345
Innodb_master_thread_1_second_loops = 184,979
Innodb_master_thread_sleeps = 0.38 /sec
Innodb_mem_adaptive_hash = 4.17e+6
Innodb_mem_dictionary = 4.15e+6
Innodb_mem_total = 131.4MB
net_buffer_length = 8,192

Аномально большой:

Com_check = 24 /HR
Com_create_db = 0.15 /HR
Com_drop_db = 0.044 /HR
Com_rename_table = 0.49 /HR
Com_show_charsets = 16 /HR
Com_show_events = 17 /HR
Com_show_storage_engines = 1.9 /HR
Feature_gis = 1.1 /HR
Feature_locale = 20 /HR
Threadpool_idle_threads = 7
Threadpool_threads = 8

Аномальные строки:

binlog_checksum = NONE
innodb_fast_shutdown = 1
opt_s__engine_condition_pushdown = off
opt_s__extended_keys = off
thread_handling = pool-of-threads
1 голос
/ 17 января 2020

Следующее не напрямую отвечает на вопрос, который вы задаете, но указывает на некоторые очень низкие настройки и использование MyISAM. Я не знаю, поможет ли переключение на InnoDB и / или увеличение некоторых настроек.

Имейте в виду, что сброс таблиц MyISAM по существу блокирует пользователей от работы с базой данных. (С другой стороны, возможно, ваш набор данных довольно мал, а активность довольно низкая.)

Наблюдения:

  • Версия: 5.5.64- MariaDB
  • 8 ГБ ОЗУ
  • Время работы = 21:05:35; некоторые значения GLOBAL STATUS могут быть еще не значимыми.
  • Вы не работаете на Windows.
  • Работает на 64-битной версии
  • Вы, кажется, работаете полностью (или в основном) MyISAM.

Более важные вопросы:

Вы должны перейти от MyISAM к InnoDB; см. Преобразование из MyISAM в InnoDB

Посмотрите, можете ли вы поднять следующее (более подробное обсуждение ниже):

open_files_limit = 2000
table_open_cache = 300
key_buffer_size = 200M
innodb_buffer_pool_size = 600M  -- after moving tables to InnoDB

OPTIMIZE TABLE - нечастая задача; Вы делаете это слишком часто.

Подробности и другие наблюдения:

( (key_buffer_size / 0.20 + innodb_buffer_pool_size / 0.70) ) = ((16M / 0.20 + 128M / 0.70)) / 8192M = 3.2% - Большая часть доступного оперативного памяти должна быть доступна для кэширования. - http://mysql.rjweb.org/doc.php/memory

( open_files_limit ) = 760 - ulimit -n - Чтобы разрешить больше файлов, измените ulimit или /etc/security/limits.conf или в sysctl.conf (kern .maxfiles & kern.maxfilesperpro c) или что-то еще (зависит от ОС)

( table_open_cache ) = 64 - Количество дескрипторов таблиц для кэширования - обычно хорошо несколько сотен.

( innodb_buffer_pool_size ) = 128M - InnoDB Data + Index cache - 128M (старое значение по умолчанию) очень мало.

( Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total ) = 5,578 / 8191 = 68.1% - Pct of buffer_pool в настоящее время не используется - innodb_buffer_pool_size (сейчас 134217728) больше необходимого?

( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF - регистрировать ли все тупики. - Если вы страдаете от тупиков, включите это. Внимание: Если у вас много взаимоблокировок, это может привести к записи большого количества на диск.

( join_buffer_size ) = 131,072 / 8192M = 0.00% - 0-N на поток. Может ускорять СОЕДИНЕНИЯ (лучше исправить запросы / индексы) (все механизмы) Используется для сканирования индекса, сканирования индекса диапазона, полного сканирования таблицы, каждого полного JOIN и т. Д. c. - Если большое, уменьшите join_buffer_size (теперь 131072), чтобы избежать нехватки памяти. Рекомендовать менее 1% оперативной памяти. Если мало, увеличьте до 0,01% ОЗУ для улучшения некоторых запросов.

( innodb_buffer_pool_populate ) = OFF = 0 - управление NUMA

( query_prealloc_size ) = 8,192 / 8192M = 0.00% - для анализа. Количество оперативной памяти

( query_alloc_block_size ) = 8,192 / 8192M = 0.00% - для анализа. Pct of RAM

( character_set_server ) = character_set_server = latin1 - Проблемам с кодировкой можно помочь, установив для character_set_server (теперь latin1) значение utf8mb4. Это будущее значение по умолчанию.

( local_infile ) = local_infile = ON - local_infile (теперь ON) = ON - потенциальная проблема безопасности

( Key_writes / Key_write_requests ) = 5,804 / 9232 = 62.9% - эффективность key_buffer для записей - если у вас достаточно ОЗУ, было бы целесообразно увеличить key_buffer_size (сейчас 16777216).

( Created_tmp_disk_tables / Created_tmp_tables ) = 13,250 / 18108 = 73.2% - процент временных таблиц, которые вылились на диск - возможно, увеличить tmp_table_size (теперь 16777216) и max_heap_table_size (теперь 16777216); улучшить показатели; избегайте больших двоичных объектов и т. д. c.

( (Com_insert + Com_update + Com_delete + Com_replace) / Com_commit ) = (68440 + 1927 + 425 + 0) / 0 = INF - Операции на коммит (с учетом всех InnoDB) - Низкий: может помочь объединить запросы в транзакции; Высокий: длинные транзакции напрягают разные вещи.

( Select_scan ) = 165,862 / 75935 = 2.2 /sec - полное сканирование таблицы - добавление индексов / оптимизация запросов (если они не являются крошечными таблицами)

( Com_optimize ) = 464 / 75935 = 22 /HR - как часто OPTIMIZE ТАБЛИЦА выполняется. - OPTIMIZE TABLE редко используется, конечно, не на высокой частоте.

( binlog_format ) = binlog_format = STATEMENT - STATEMENT / ROW / MIXED. - ROW предпочтительнее на 5,7 (10,3)

( expire_logs_days ) = 0 - Как скоро автоматически очистить binlog (после этого много дней) - Слишком большой (или ноль) = занимает дисковое пространство; слишком маленький = нужно быстро реагировать на сеть / машину cra sh. (Не актуально, если log_bin (теперь OFF) = OFF)

( innodb_autoinc_lock_mode ) = 1 - Galera: желания 2 - 2 = "чередование"; 1 = "последовательный" типичный; 0 = "традиционный". - Галера желаний 2; 2 требует BINLOG_FORMAT = ROW или MIXED

( log_slow_queries ) = log_slow_queries = OFF - для регистрации медленных запросов. (До 5.1.29, 5.6.1)

( slow_query_log ) = slow_query_log = OFF - регистрировать ли медленные запросы. (5.1.12)

( long_query_time ) = 10 - Обрезание (секунды) для определения «медленного» запроса. - Предложите 2

( back_log ) = 50 - (Размер по состоянию на 5.6.6; основан на max_connections) - Повышение до минимума (150, max_connections (теперь 151)) может помочь при выполнении большого количества соединений.

( Com_change_db / Connections ) = 1,278,567 / 363881 = 3.51 - Переключатели базы данных на соединение - (второстепенно) Рассмотрите возможность использования синтаксиса "db.table"

( Com_change_db ) = 1,278,567 / 75935 = 17 /sec - Вероятно, из операторов USE. - Рассмотреть возможность соединения с БД, используя синтаксис db.tbl, исключить ложные операторы USE и т. Д. c.

( Threads_running / thread_cache_size ) = 1 / 0 = INF - Потоки: текущие / кэшированные (не относится к использованию пула потоков) - Оптимизировать запросы

У вас есть тайм Query Cache. Вы должны установить и query_cache_type = OFF, и query_cache_size = 0. Существует (согласно слухам) «ошибка» в коде Q C, которая оставляет некоторый код включенным, если вы не отключите обе эти настройки.

Аномально маленький:

( Innodb_pages_read + Innodb_pages_written ) / Uptime = 0.0672
(innodb_buffer_pool_size + innodb_log_buffer_size + key_buffer_size + query_cache_size + Max_used_connections * (thread_stack + net_buffer_length)) / _ram = 1.9%
Innodb_adaptive_hash_non_hash_searches = 1.1 /sec
Innodb_buffer_pool_pages_flushed / max(Questions, Queries) = 0.00056
Innodb_buffer_pool_pages_made_young = 0
Innodb_buffer_pool_pages_old = 943
Innodb_buffer_pool_read_ahead = 0
Innodb_checkpoint_max_age = 7.78e+6
Innodb_ibuf_merged_inserts = 0
Innodb_ibuf_merges = 0
Innodb_lsn_current = 2.52e+8
Innodb_lsn_flushed = 240.6MB
Innodb_lsn_last_checkpoint = 2.52e+8
Innodb_master_thread_10_second_loops = 945
Innodb_master_thread_1_second_loops = 10,439
Innodb_master_thread_sleeps = 0.14 /sec
Innodb_mem_adaptive_hash = 2.25e+6
Innodb_mem_dictionary = 2.1e+6
Innodb_mem_total = 131.4MB
Innodb_pages_read + Innodb_pages_written = 0.067 /sec
Innodb_x_lock_spin_waits = 0.047 /HR
Open_tables = 64
net_buffer_length = 8,192

Аномально большой:

Com_check = 22 /HR
Com_show_charsets = 28 /HR
Com_show_events = 1.2 /HR
Feature_gis = 0.66 /HR

Аномальные строки:

binlog_checksum = NONE
innodb_fast_shutdown = 1
opt_s__engine_condition_pushdown = off
opt_s__extended_keys = off
...