Поиск проблем на сервере (загрузка CPU 100%). Разбор.
Доброго времени друзья! В этой небольшой статья я расскажу о недавно проведенном анализе сервера на предмет поиска и последующего устранения проблем, которые негативно сказываются на его производительности, а именно периодически приводили к загрузке процессора по всем ядрам на 100%. Забегая вперед, сразу оговорюсь, что проблема была в работе службы сервера баз данных MySQL, но как оказалось не все так очевидно(почему и потребовался летальный анализ работы всех служб), а сами проблемы крылись далеко за пределами MySQL, но все-же влияли на его работу, что и приводило к такому печальному итогу. Далее обо всем по порядку.
Проблема
Периодически возникает нагрузка на CPU до 100% по всем ядрам, основной потребитель ресурсов служба MySQLd. Всплеск трафика укладывается в допустимые нормы, и к DDOS не относится.
Параметры сервера и сайта
- ПроцессорIntel Xeon W-2255 3.7 ГГц, 10 ядер
- Память 64 ГБ DDR4
- SSD NVME 400 Gb x 2
- Операционная система CentOS 7, Nginx + PHP-FPM + Apache + MySQL
- Защита от DDoS-атак на уровне внешнего проксирующего сервера
- PHP фреймворк Yii
- Трафик ~30 000 хостов, в сутки
Результат изучения и рекомендации
По результатам изучения настроек программного обеспечения на сервере, а также журналов ошибок, выделяю следующий перечень проблем, которые прямым образом могут влиять на ранее описанную проблему(связанную с производительностью). Рекомендую по возможности устранить их все.
1. На сайте используется версия PHP 5.4, эта версия устарела и перестала поддерживаться аж в 2015 году. В ряде её слабых мест в том числе расширения(mysql, mysqli, pdo) для работы с MySQL, которые могут работать медленно, а также слабая реализация ООП. В целом PHP 5.4 сам по себе медленный.
Рекомендация: Обновиться хотя-бы до версии PHP 5.6 (там существенно улучшена поддержка ООП), лучше 7.3 или 8.
2. На сайте, для частичной реализации функционала, используется PHP фреймворк Yii (похоже еще версии 1), который изначально спроектирован доя работы в парадигме ООП. Возможно ядро у него старое(из-за сильных переделок, сложно понять точную версию), и под PHP 5.4 он работает нормально, но тем не менее этот момент добавляет важности пункту 1.
3. База данных содержит почти четыре сотни таблиц, из них несколько десятков таблиц не имеют настроенных индексов, или имеют частично настроенные индексы! Это значит, что операции выборки данных из этих таблиц(даже при условии если там мало строк), могут приводить к очень большой нагрузке на БД. Этот момент критичен. Один из примеров, таблица tv_anons имеет почти 900 тысяч строк и только один индекс по ID, при этом в таблице есть поля использующиеся для выборки данных, такие как type_id, genre_id, category_id — и по ним индексы не настроены! Более того, у данных полей задан строковой тип varchar(45), вместо числового int. Одна лишь эта таблица, может положить весь сервер — создав нагрузку на MySQL и жесткий диск.
Рекомендация: Крайне рекомендую настроить индексы для всех таблиц.
4. Связка Nginx и PHP5.4-FPM имеет ограничения в конфигурации, которые ежедневно приводят к обвалу веб-сервера, по причине того, что веб-сервер не может обслужить несколько запросов одновременно. В логе ошибок, очень много строк(каждый день) с предупреждением о достижении лимита количества подключений. Ошибка server reached pm.max_children.
В логах множество записей о падении веб-сервера, даже без нагрузки (exited, sratred).
Рекомендация: Корректно настроить PHP-FPM.
5. На сервере 64 Gb памяти, плюс 32 Gb swap системы(на диске NVME). Но используется только 7 Gb памяти, а swap вообще не задействован. Т.е., вместо того, чтобы перераспределить нагрузку между жестким диском и ОЗУ, поместив в ОЗУ значительную часть часто используемых данных из БД, система подгружает данные с диска из файлового хранилища БД. То есть БД(сервер баз данных) сконфигурирована без учета возможности использовать ОЗУ для хранения большого кеша. Память ОЗУ просто не используется.
Рекомендация: Настроить MySQL с учетом большого объема ОЗУ. По возможности внедрить в Yii поддержку Memcached (кеширование на уровне PHP). Это существенно ускорит работу с БД и снизит нагрузку.
6. На сервере установлен Solr — служба полнотекстового поиска в PHP. Которая пишет в логи очень много данных(десятки строк в секунду), запросов, желательно настроить службы так, чтобы снизить нагрузку по части логирования(на жесткий диск). В пиковых нагрузках, это может усиливать общий эффект нагруженности системы (хоть на сервере и стоит NVME). Плюс иногда возникающие проблемы в подключении к MySQL со стороны Solr (возможно проблема в связке с п.8).
Рекомендация: Настроить корректно логирование Solr.
7. nGinx также в конфигах содержит ошибки, которые при падении PHP-FPM и перезагрузке nGinx, дают о себе знать(conflicting server name, ignored). На производительность это не влияет, но может замедлять перезапуск nGinx при падениях.
Рекомендация: Настроить корректно nGinx
8. Проблемы в MySQL. Частое падение БД — Процесс убивается системой. Вероятно проблема в конфигурировании БД. Но, точную причину не установил, может пункт 9(может в комплексе).
Рекомендация: Настроить корректно MySQL (MariaDB).
9. Проблема в настройка ОС CentOS на предмет максимально разрешенного открытия числа файлов, в логах ошибки вида: «Could not increase number of max_open_files to more than 32768 (request: 482095)». Проблема критичная. Также влияющая на работу БД и всех служб сервера.
Рекомендация: Настроить корректно директивы ОС CentOS 7.
10. Ошибки на уровня ядра, с вероятным падением PHP FPM: kernel: php-fpm[5981]: segfault at 1000705 ip 0000562c5d5b994a sp 00007ffec5276440 error 4 in php-fpm[562c5d344000+3d0000]. Возникает каждые 15-20 минут. Возможности причина в пункт 4 (или в совокупности). Не критично. Но в нормально работающей системе такого быть не должно, на производительность не влияет.
Рекомендация: Разобраться и устранить.
11. Иногда возникают проблемы в движке Java (Error parsing HTTP request header). На производительность не влияет, но желательно разобраться, на производительность не влияет.
Рекомендация: Разобраться и устранить.
12. На сервере установлен Redis. Есть проблемы с настройками прав доступа(Failed opening the RDB file crontab (in server root dir /etc) for saving: Permission denied), из-за чего задания вызываемые по Cron не могут быть выполнены, иногда происходит падение службы (redis.service stop-sigterm timed out. Killing.), на производительность не влияет.
Рекомендация: Разобраться и устранить.
13. Иногда возникают проблемы у Apache . Не может дождаться завершения выполнения скрипта и уход в перезагрузку (caught SIGWINCH, shutting down gracefully), на производительность не влияет.
Рекомендация: Разобраться и устранить.
Заключение
После выполнения всех рекомендаций, скорость работы сайта и сервера заметно возросли, все возникающие ошибки были устранены и больше не возникали. Нагрузка на CPU снизилась и более скачков нагрузки до 100% по всем ядрам не наблюдалось. Основными улучшениями можно назвать пункты 1, 3, 4, 5 — именно они существенно повлияли на производительность всей системы.
Друзья, если вам нужна помощь в анализе работы сервера, в поиске проблем с последующим решением их, пожалуйста обращайтесь, буду рад сотрудничеству!
Похожие записи
Оставить комментарий
Full Stack
Senior, Architect
предложить оффер
- jQuery: как получить значение атрибута?
- PHP работа с изображением, класс SimpleImage
- Интеграция с API ОСАГО сайта sravni.ru
- Комментарии на PHP, Ajax, mySQL
- PHP: Категории бесконечного уровня вложенности.
- Nginx редирект на другой сервис с сохранением URL спросил (а) Сергей
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Как создать Telegram-бота с авторизацией через сайт к записи
- PHP скрипт: каталог закладок на сайты к записи
- Валидация на PHP к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
Archive
- +2024 (25)
- Ноябрь 2024 (10)
- Октябрь 2024 (8)
- Сентябрь 2024 (1)
- Август 2024 (5)
- Май 2024 (1)
- +2023 (27)
- Ноябрь 2023 (1)
- Октябрь 2023 (13)
- Сентябрь 2023 (10)
- Апрель 2023 (1)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (36)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (41)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (7)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Интеграция платежной системы MoonPay на сайт по API 10.11.2024
- Парсер товаров с Taobao 08.11.2024
- Упаковка и минификация кода JavaScript онлайн 07.11.2024
- Как эффективно анализировать логи при DDOS атаке 07.11.2024
- Бот для автоматических заказов на OZON (плагин для Chrome) 07.11.2024