Рейтинг:0

Высокая загрузка ЦП Apache/MySQL

флаг cn
a b

У меня проблема с использованием ЦП на веб-сайте, использующем WordPress, Apache и MySQL. В течение дня время от времени загрузка процессора MySQL и Apache доходит до 2400% (всего у меня 24 ядра), сервер зависает, средняя нагрузка доходит до 24.

В последнее время трафика было немного больше, чем обычно, но это не должно быть постоянным, верно? Обновлял ядро, базу, библиотеки, много раз перезагружал. И все равно замерзает. Я посмотрел список процессов БД, но ничего экстраординарного там нет. В базе есть довольно большие объемы данных. Буквально пару недель назад все работало нормально, а сейчас нет. Таким образом, это не должны быть неоптимизированные запросы.

Какие могут быть причины такого поведения?

Обновлять:

результат A) SHOW GLOBAL STATUS LIKE 'com_%r%_table';

+-----------------------+-------+
| Имя_переменной | Значение |
+-----------------------+-------+
| Com_alter_table | 5 |
| Com_create_table | 34 |
| Com_drop_table | 0 |
| Com_rename_table | 0 |
| Com_show_create_table | 0 |
+-----------------------+-------+
5 рядов в сете (3,04 сек)

B) ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС, КАК 'uptime%';

+---------------------------+---------+
| Имя_переменной | Значение |
+---------------------------+---------+
| Время работы | 455524 |
| Uptime_since_flush_status | 455524 |
+---------------------------+---------+
2 ряда в сете (0,01 сек)

C) ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС, КАК '%dirty%';

+-----------------+--------+
| Имя_переменной | Значение |
+-----------------+--------+
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_bytes_dirty | 0 |
+-----------------+--------+
2 ряда в наборе (0,00 сек)

p.s. У меня до сих пор проблемы с сервером. Мне нужно было изменить набор символов в одной из баз данных, и это заняло чуть больше суток, всего 400 000 строк. Раньше это занимало некоторое время, но не так много. Мне было интересно, может ли быть так, что после DDOS-атаки могут быть какие-то изменения в базе данных, чтобы она работала хуже?

Обновление 2:

результаты mysqltuner:

[--] Пропущена проверка версии для скрипта MySQLTuner
[OK] Выполнен вход с использованием учетных данных из учетной записи обслуживания Debian.
[OK] В настоящее время работает поддерживаемая версия MySQL 8.0.26-0ubuntu0.20.04.2
[OK] Работа на 64-битной архитектуре
 
-------- Файл журнала Рекомендации --------------------------------------- ---------------------------
[OK] Файл журнала /var/log/mysql/error.log существует
[--] Лог-файл: /var/log/mysql/error.log(0B)
[--] Лог-файл /var/log/mysql/error.log пуст. Предполагая ротацию логов. Используйте --server-log={file} для явного файла
 
-------- Статистика механизма хранения --------------------------------------- --------------------------
[--] Статус: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +MyISAM +PERFORMANCE_SCHEMA 
[--] Данные в таблицах InnoDB: 262.4G (Таблицы: 179)
[OK] Всего фрагментированных таблиц: 0
 
-------- Показатели производительности анализа --------------------------------------- -----------------------
[--] innodb_stats_on_metadata: ВЫКЛ.
[OK] Статистические данные не обновляются при запросе INFORMATION_SCHEMA.
 
-------- Рекомендации по безопасности ---------------------------------------- --------------------------
[--] Пропущено из-за неподдерживаемой функции для MySQL 8
 
-------- Рекомендации по безопасности CVE --------------------------------------- -----------------------
[OK] ДЛЯ ВАШЕЙ ВЕРСИИ НЕ НАЙДЕНО CVE БЕЗОПАСНОСТИ
 
-------- Показатели эффективности ---------------------------------------- -------------------------------
[--] Up for: 5d 11h 4m 6s (15M q [31,945 qps], 191K соединений, TX: 80G, RX: 2G)
[--] Чтение/запись: 99%/1%
[--] Включено бинарное логирование (GTID MODE: OFF)
[--] Физическая память: 31,4 ГБ
[--] Максимальный объем памяти MySQL: 9,8 ГБ
[--] Другая память процесса: 0B
[--] Всего буферов: 176.0M глобальных + 65.1M на поток (151 макс. поток)
[--] P_S Максимальное использование памяти: 72Б
[--] Galera GCache Максимальное использование памяти: 0B
[OK] Максимально достигнутое использование памяти: 9,8 ГБ (31,14% установленной оперативной памяти)
[OK] Максимально возможное использование памяти: 9,8 ГБ (31,14% установленной оперативной памяти)
[OK] Общее возможное использование памяти другим процессом совместимо с доступной памятью
[OK] Медленные запросы: 0% (0/15M)
[!!] Максимальное использование соединения: 100% (151/151)
[OK] Прерванные соединения: 0,09% (174/191712)
[!!] разрешение имен активно: для каждого нового соединения выполняется обратное разрешение имен, что может снизить производительность
[--] Кэш запросов удален в MySQL 8
[OK] Сортировки, требующие временных таблиц: 0% (0 временных сортировок / 5 миллионов сортировок)
[OK] Нет объединений без индексов
[OK] Временные таблицы, созданные на диске: 0% (0 на диске / всего 2M)
[OK] Показатель попаданий в кэш потоков: 92 % (15 000 созданных / 191 000 подключений)
[OK] Частота попаданий в табличный кэш: 99% (21 млн обращений / 21 млн запросов)
[OK] table_definition_cache(2000) превышает количество таблиц(506)
[OK] Используемый лимит открытых файлов: 0% (6/10K)
[OK] Блокировки таблицы получены немедленно: 100% (9 немедленных / 9 блокировок)
[OK] Доступ к кэш-памяти Binlog: 99,57% (25538 памяти / 25647 всего)
 
-------- Схема производительности ---------------------------------------- --------------------------------
[--] Память, используемая P_S: 72B
[--] Схема Sys установлена.
 
-------- Показатели ThreadPool ---------------------------------------- --------------------------------
[--] Статистика ThreadPool отключена.
 
-------- Показатели MyISAM ---------------------------------------- ------------------------------------
[--] Метрики MyISAM отключены в последних версиях MySQL.
 
-------- Метрики InnoDB ---------------------------------------- ------------------------------------
[--] InnoDB включен.
[--] Параллелизм потоков InnoDB: 0
[OK] Файл InnoDB для каждой таблицы активирован
[!!] Буферный пул InnoDB/размер данных: 128.0M/262.4G
[!!] Отношение размера файла журнала InnoDB к размеру буферного пула InnoDB (75%): 48,0M * 2/128,0M должно быть равно 25%
[OK] Экземпляры буферного пула InnoDB: 1
[--] Количество фрагментов буферного пула InnoDB: 1 на 1 экземпляр(ы) буферного пула
[OK] Innodb_buffer_pool_size приведен в соответствие с Innodb_buffer_pool_chunk_size и Innodb_buffer_pool_instances
[OK] Эффективность буфера чтения InnoDB: 98,29% (925392031 совпадений/всего 941450541)
[!!] Эффективность InnoDB Write Log: 309,39% (25100125 обращений/всего 8112662)
[!!] Ожидания журнала InnoDB: 0,00% (65 ожиданий / 33212787 записей)
 
-------- Метрики Арии ---------------------------------------- --------------------------------------
[--] Механизм хранения Aria недоступен.
 
-------- Показатели TokuDB ---------------------------------------- ------------------------------------
[--] TokuDB отключен.
 
-------- Метрики XtraDB ---------------------------------------- ------------------------------------
[--] XtraDB отключен.
 
-------- Галера Метрика ---------------------------------------- ------------------------------------
[--] Галера отключена.
 
-------- Показатели репликации ---------------------------------------- -------------------------------
[--] Galera Синхронная репликация: НЕТ
[--] Для этого сервера нет подчиненных(ых) репликации.
[--] Формат бинлога: ROW
[--] Поддержка XA включена: ВКЛ.
[--] Мастер полусинхронной репликации: не активирован
[--] Полусинхронная репликация Slave: не активирована
[--] Это автономный сервер
 
-------- Рекомендации ----------------------------------------- ----------------------------------
Общие рекомендации:
    Уменьшите или устраните постоянные подключения, чтобы уменьшить использование подключений.
    Настройте свои учетные записи только с IP-адресом или подсетями, затем обновите свою конфигурацию с помощью skip-name-resolve=1.
    Перед изменением innodb_log_file_size и/или innodb_log_files_in_group прочтите это: *ссылка*
Переменные для настройки:
    max_connections (> 151)
    ожидание_время ожидания (< 28800)
    интерактивный_тайм-аут (< 28800)
    innodb_buffer_pool_size (>= 262,4 ГБ), если это возможно.
    innodb_log_file_size должен быть (= 16M), если это возможно, поэтому общий размер файлов журнала InnoDB равен 25% размера буферного пула.
    innodb_log_buffer_size (>= 16M)

Обновление 3:

Сегодня мой сервер снова завис. Процесс, который перегрузил ЦП, был apache2. Мне удалось остановить службу. И вдруг все стало работать гладко. Я попытался сделать резервную копию базы данных с большим количеством строк, и это сработало просто отлично. Но через какое-то время опять все замерло: загрузка ЦП некоторыми процессами была на уровне 2400%, средняя загрузка превысила 24. Так что мое предположение, что не апач нагружает ЦП, и не MySQL. Некоторые процессы, такие как htop или gzip, которые я использую для резервного копирования, также время от времени сильно загружают ЦП. Что это может быть тогда? Может ли это быть результатом DDOS-атаки, и если да, то как это исправить?

Gerrit avatar
флаг cn
Запуск `perf top` во время этих случаев высокой загрузки ЦП может быть стартером. Удобочитаемости будет очень способствовать установка пакетов символов отладки Apache, PHP и Mysql для вашей платформы. Если проблема в базе данных, то может быть полезен расширенный статус mysqladmin. В частности, посмотрите, сильно ли увеличилось значение created_tmp_disk_tables или sort_merge_passes.
Wilson Hauck avatar
флаг jp
Не могли бы вы опубликовать ТЕКСТОВЫЕ результаты A) SHOW GLOBAL STATUS LIKE 'com_%r%_table'; и B) ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС, КАК 'uptime%'; и C) ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС, КАК '%dirty%'; для анализа? В ваших результатах могут быть подсказки. Добро пожаловать в serverfault.
a b avatar
флаг cn
a b
@WilsonHauck Я добавил запрошенные результаты
Michael Hampton avatar
флаг cz
Пожалуйста, опубликуйте полный вывод mysqltuner.pl
a b avatar
флаг cn
a b
@MichaelHampton добавил вывод mysqltuner
Wilson Hauck avatar
флаг jp
@ab Ваши результаты выборочной информации SHOW GLOBAL STATUS устраняют перегрузку таблицы DROP/CREATE, которая может вызвать кратковременное зависание. Нет ГРЯЗНЫХ страниц, вызывающих проблемы или задержки. Будет запрашивать дополнительную информацию, чтобы продолжить просмотр данных из вашего экземпляра.
Wilson Hauck avatar
флаг jp
Запрос дополнительной информации. Любые устройства SSD или NVME на хост-сервере MySQL? Опубликуйте на pastebin.com и поделитесь ссылками. Из вашего корня входа SSH, текстовые результаты: B) ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС; минимум через 24 часа UPTIME C) ПОКАЗАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ; D) ПОКАЗАТЬ ПОЛНЫЙ СПИСОК ПРОЦЕССОВ; д) СТАТУС; не ПОКАЗАТЬ СТАТУС, просто СТАТУС; И Необязательная очень полезная информация, если таковая имеется, включает: htop ИЛИ top для наиболее активных приложений, ulimit -a для списка ограничений Linux/Unix, iostat -xm 5 3 для IOPS по устройствам и количеству ядер/процессоров, для анализа настройки рабочей нагрузки сервера, чтобы предоставить предложения.
a b avatar
флаг cn
a b
@WilsonHauck A) Извините, я действительно не знаю об этом и не знаю, как это проверить. B) ПОКАЗАТЬ ГЛОБАЛЬНЫЙ СТАТУС; https://pastebin.com/hafPj9f3.C) ПОКАЗАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ; https://pastebin.com/WSEYa9EL. D) ПОКАЗАТЬ ПОЛНЫЙ СПИСОК ПРОЦЕССОВ; https://pastebin.com/LYhVkDR6. Запрос audio_records является резервной копией базы данных. д) СТАТУС; https://pastebin.com/ziTNcE0Z. htop - https://ibb.co/0sTy30r. ulimit -a - https://pastebin.com/F9XnG7hZ. iostat - https://ibb.co/5YrzvbJ
a b avatar
флаг cn
a b
Кроме того, я только что заметил, что даже когда средняя загрузка была меньше 5, а общая загрузка ЦП была довольно низкой, веб-сайту по-прежнему требовалось гораздо больше времени для ответа, чем обычно. Некоторые запросы были отменены из-за тайм-аута
Wilson Hauck avatar
флаг jp
@ab Выполняется анализ ваших данных. Надеемся опубликовать предложения в течение следующих 12 часов. Спасибо.
Рейтинг:1
флаг jp

Скорость в секунду = RPS

Предложения для вашего раздела my.cnf [mysqld]

innodb_buffer_pool_size=22G # вместо 128M, чтобы лучше разместить ваши 262G данных
max_connections=256 # из 151, так как вы использовали все подключения
thread_cache_size=150 # с 9, чтобы уменьшить threads_created RPhr со 111
innodb_log_file_size=4G # от 50M до поддержки более чем за час до ротации
innodb_log_buffer_size=1G # от 16M до поддержки ~ 30 минут до записи на носитель

Производительность должна быть значительно улучшена. Есть много других возможностей для повышения производительности. Просмотрите профиль для получения контактной информации и бесплатных загружаемых служебных сценариев для повышения производительности.

a b avatar
флаг cn
a b
Спасибо за предложения. Я добавил их, и на время производительность улучшилась. Но использование памяти увеличилось. У меня всего 32 ГБ памяти, а максимальное использование MySQL было 32 ГБ. Когда я пытался оптимизировать таблицу, она перегружала память. Теперь виртуальная память mysqld составляет 31,4Гб. Но проблема остается прежней. Я нашел способ повторить это. Когда я пытаюсь открыть 6-10 страниц одновременно, увеличивается загрузка процессора. В списке процессов много спящих процессов, которые запрашивают данные из базы данных сайта. Они не остаются там слишком долго, максимальное время, которое я видел, составляет ~ 500 секунд.
Wilson Hauck avatar
флаг jp
Ваш размещенный несколько дней назад htop показывает много процессов со временем более 1 часа, когда вы хотите их обсудить, свяжитесь с нами. Если какие-либо предложения были положительными, рассмотрите возможность голосования или примите их, пожалуйста. Пожалуйста, разместите запрос, который открывает 6-10 страниц.
Wilson Hauck avatar
флаг jp
@ab Не могли бы вы опубликовать ТЕКСТОВЫЕ результаты на pastebin.com, результаты show engine performance_schema status; Спасибо.
a b avatar
флаг cn
a b
Вот "показать статус engine performance_schema"; вывод: https://pastebin.com/yKjjqZPt. После этого я отключил MySQL, и проблема осталась, я не уверен, что это проблема с БД. Должно быть что-то на более глубоком уровне.
Wilson Hauck avatar
флаг jp
В последней строке публикации указано 228 МБ ОЗУ, используемое для хранения информации performance_schema. С 32G не проблема. Когда ты успеешь обсудить свой хтоп с процессами, которые работают часами. Вы размещаете программное обеспечение zabbix на этом же сервере? Программное обеспечение zabbix НИКОГДА не должно размещаться на рабочем сервере.
Рейтинг:0
флаг us

Очень сложно сказать, но вы говорите, что используете WordPress, и ваши 24 ядра работают на 100%, просто помните, что один запрос не может использовать только 1 поток за раз.

Итак, что-то звучит как очень плохая производительность запросов, а не напрямую на ваш веб-сервер Apache. Пробовали ли вы плагин «WP Redis Cache» для кэширования ваших запросов в Redis, чтобы сохранить поиск запросов?

Следующий плагин, который вы можете попробовать установить, это «Монитор запросов». Он покажет вам SQL-запросы, которые вы вызываете на лету, это очень хороший инструмент отладки для WordPress.

Помните, что если вы разрабатываете свои собственные плагины в WordPress, вы должны сами позаботиться о Redis, используя встроенные функции для кэширования результатов запроса.

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

Ответить или комментировать

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