Сайт на WordPress тупит? Без паники! Показываем, как с помощью strace и lsof увидеть, на чём висит PHP, и быстро вернуть скорость.
Введение
Сайт на WordPress перестал быстро отвечать, даже простой лендинг стал грузиться медленно. Это знакомая ситуация для многих, ведь сложные плагины и темы, нагруженные запросы к базе данных или внешним API нередко замедляют работу сайта. Вместо того чтобы паниковать или отключать плагины вслепую, стоит сперва понять, где именно зарыта проблема, что тормозит запуск PHP-скриптов и отдачу страниц. На сервере есть мощные утилиты, которые показывают работу под капотом сайта и помогают находить причины ухудшения производительности.
В статье объяснили, как поэтапно найти причину долгого отклика WordPress с помощью инструментов strace и lsof. Показали какие команды ввести в консоли для отслеживания запросов и процессов, как определять системные задержки и что именно делает сайт на сервере во время подвисания.
Что такое strace и lsof
Небольшая справка для начала. Утилита strace отслеживает все системные вызовы, которые выполняет любой процесс в Linux. Проще говоря, она показывает каждую операцию, которую делает программа: открывает файлы, читает или записывает данные, обращается к сети и так далее. При запуске strace вы сразу увидите последовательный список таких вызовов с указанием времени выполнения. Именно так легко заметить, какая операция надолго задерживает сайт.
Второй инструмент — lsof. Он выводит список всех открытых файлов и сетевых соединений в системе. С помощью lsof можно узнать, к каким файлам или сокетам обращается конкретный процесс. Если strace указывает на файловый дескриптор, например, 13u, команда lsof быстро покажет, какой файл или какое сетевое соединение скрывается за этим дескриптором. Совместно эти утилиты дают полное представление о том, какие вызовы выполняет процесс и какие ресурсы он использует. Чтобы ускорить вывод lsof, можно добавить флаги -nP. Так команда не будет резолвить DNS-имена и порты, что заметно экономит время.
Для работы strace и lsof нужны права суперпользователя, root или sudo, так как они исследуют процессы других пользователей. Вывод команд может быть очень объёмным, и сам strace накладывает некоторую нагрузку на систему. На продакшене лучше проводить такие эксперименты в часы наименьшей нагрузки или на отдельном тестовом стенде. И ещё один совет: всегда делайте бекапы всех важных данных и конфигураций перед сложными операциями. Резервные копии пригодятся, если настройки изменятся ошибочно.
Пошаговая диагностика медленного ответа
Сначала воспроизведите замедление: откройте медленно загружающуюся страницу вашего сайта. Лучше сделать это с самого сервера, например, через curl в терминале. Так вы точно свяжете запрос с конкретным процессом. Запустите команду:
curl -s -o /dev/null http://example.com
Она выполнит запрос и сразу его закроет, не показывая содержимое. Пока выполняется curl, найдите процесс, который обрабатывает этот запрос. Если сайт слушает 80-й порт (HTTP) или 443-й (HTTPS), выполните проверку соединений для 80 порта:
lsof -i TCP:80 | grep ESTABLISHED
Или для 443 порта:
lsof -i TCP:443 | grep ESTABLISHED
В выводе найдите строку с именем процесса, например, httpd, apache2 или php-fpm, и соответствующим портом. Обратите внимание на PID — это идентификатор процесса, который сейчас занят отдачей страницы. Далее подключитесь к этому процессу через strace:
strace -ttT -f -p <PID>
<PID> — номер найденного процесса. Ключи -ttT добавляют в вывод метки времени и показывают длительность каждой операции, а -f отслеживает все потоки, такие как дочерние процессы Apache или разные потоки PHP. Strace начнёт выводить последовательность системных вызовов, куда входит открытие файлов, сетевые запросы, чтение, запись данных и так далее. Внимательно смотрите на значения времени выполнения. Например, если вы увидите что-то вроде (0.125) или <0.125>, это значит, что вызов занял 0.125 секунды (125 миллисекунд). Чтобы сузить вывод, используйте параметр -e trace=.... Например, -e trace=network покажет только сетевые операции (connect/read/write), а -e trace=file отобразит работу с файлами. Это поможет быстрее найти задержку в нужной части кода.
Во время работы strace вы можете заметить длинные паузы. Если встретится строка вроде:
poll([{fd=13, events=POLLIN}], 1, 5000) = 0 (Timeout)
это будет значить, что процесс ждал события на файловом дескрипторе 13 целых и 5 секунд. Чтобы выяснить, какой ресурс скрывается за этим дескриптором, ещё раз используйте lsof:
lsof -a -d 13 -p <PID>
Эта команда покажет, к какому файлу или соединению прикреплён fd=13. В выводе может быть IP-адрес внешнего сервиса и порт, TCP-соединение. Так вы поймёте, что сайт зависает на подключении к этому адресу, например, ожидает ответа от внешнего API или платёжного шлюза.
Если в выводе strace вы обнаружили 5‑секундный таймаут и сразу после этого видите вызов shutdown(13, SHUT_WR), возможно, это просто стандартный KeepAlive веб-сервера. Apache или другой веб-сервер по умолчанию держит соединение открытым несколько секунд после ответа и лишь затем закрывает его. В таких случаях задержка не связана с работой WordPress, а является нормальным сетевым поведением. Главное обратите внимание, есть ли после этого ещё ожидание или нет.
Когда вы нашли операцию, которая явно занимает слишком много времени, переходите к решению проблемы. Если strace показал долгую операцию чтения из MySQL или загрузку данных из БД, оптимизируйте запрос или настройку базы данных. Если зависание связано с внешним сервером, допустим, lsof указал на URL или IP, подумайте, можно ли временно отключить этот вызов или добавить кеширование его результата. Если проблема в файловой системе, то есть, сайт читает большие файлы или логи, проверьте, не перегружены ли диски кешируются ли данные правильно.
После исправлений запустите strace ещё раз, чтобы убедиться, что задержка исчезла и процесс отрабатывается быстро. Для анализа можно перенаправить вывод strace в файл (ключ -o), а затем изучить его в спокойной обстановке.
Если сайт работает на связке Nginx + PHP-FPM, то поищите соответствующий процесс php-fpm, а не httpd. Например, команда:
ps aux | grep php-fpm
покажет текущие процессы PHP, после чего подключитесь к нужному PID через strace. Такие знания пригодятся не только для WordPress. Если вы работаете с любыми веб-проектами на своём сервере, эти приёмы помогут быстро понять, какие обращения и файлы становятся узким местом. Особенно эффективно эти методы работают при отладке любых других сервисов на Linux, ведь strace и lsof являются универсальными средствами анализа.
Заключение
Теперь вам понятна внутренняя жизнь WordPress. Вы получили инструменты, которые покажут, что именно тормозит сайт. Эти навыки пригодятся и при отладке любых других веб-проектов на сервере. Теперь вы точно не растеряетесь, если сайт вновь начнёт тормозить, вы уже знаете, к каким командам обращаться. Вы обрели навык находить и исправлять узкие места в производительности, а регулярные бекапы помогут вам всегда вернуть систему в рабочее состояние, если что-то пойдёт не так.
Читайте в блоге:
- Как ускорить OpenCart на недорогом хостинге
- Как включить OPcache и ускорить PHP-сайт на VPS
- Оптимизация CSS и JavaScript: как ускорить загрузку сайта