- Анализ нагрузки на веб-сервер Linux
- Нагрузка на сервер
- Нагрузка по процессам
- Оперативная память
- Нагрузка на диск
- Сетевая активность
- Что грузит систему
- Использование lsof
- Анализ error-логов
- Статистика веб-сервера
- Apache
- NGINX + PHP-FPM
- Долгие запросы
- MySQL / MariDB
- PHP-FPM
- Мониторинг производительности MySQL при помощи Mytop
- Требования
- 1: Установка mytop
- 2: Настройка mytop
- 3: Подключение к mytop
- 4: Просмотр и интерпретация вывода mytop
- Заключение
Анализ нагрузки на веб-сервер Linux
В данной статье пойдет речь о мониторинге нагрузки, именно, в контексте веб-сервера. Мы не будем особо заострять внимание на проверке производительности системы, как, например, командами top, htop, free и так далее.
Нагрузка на сервер
Анализ нагрузки стоит начать с общих метрик — потребление процессорного времени, памяти, нагрузки на сеть и дисковую систему.
Нагрузка по процессам
Проверить, нагружен ли сервер, а также понять, какой именно процесс больше всего потребляет ресурсов можно с помощью команд:
* по сути, все 3 вышеперечисленные команды выдают одну и туже информацию в разном виде. Какой-то из них может оказаться удобнее пользоваться. Утилита top встроена в систему, для использования остальных необходимо установить одноименные пакеты.
Оперативная память
Для определения объема свободной и занимаемой памяти можно воспользоваться командой:
* предыдущие команды тоже показывали утилизацию памяти, но кому-то команда free может показаться нагляднее.
Нагрузка на диск
Для определения нагрузки на дисковую систему, используем утилиту iotop. Сначала ее нужно установить.
а) На системы Debian / Ubuntu:
apt-get install iotop
б) На системы Red Hat / CentOS:
yum install iotop
После выполняем следующую команду:
Сетевая активность
Для измерения нагрузки на сеть необходимо установить утилиту nload.
а) В CentOS / Red Hat:
yum install nload
б) В Ubuntu / Debian:
apt-get install nload
После установки, запускаем утилиту командой:
* в данном примере будет запущена статистика для использования сетевого интерфейса eth0.
Что грузит систему
Даже, если мы увидим, что на веб-сервере заканчивается оперативная память или загружен процессор, мы не сможем найти источник проблемы, которым, чаще всего, является некорректно работающий скрипт. Поэтому, определяем, какой файл на сервере вызывает нагрузку.
Использование lsof
lsof — утилита командной строки, которая отображает какие файлы используются процессами. Она позволит определить, к каким скриптам идет обращение со стороны веб-сервера. Для начала, необходимо установить lsof.
а) В CentOS / Red Hat:
yum install lsof
б) В Ubuntu / Debian:
apt-get install lsof
Теперь можно выполнить следующие команды:
* первая команда покажет, к каким файлам обращается apache, вторая — php-fpm (часто можно увидеть в связке с nginx).
Анализ error-логов
Анализ логов ошибок позволит не только обнаружить проблемы в работе сайта, но и найти причину его медленной работы. По умолчанию, логи находятся в каталоге /var/log. Если мы не меняли расположение логов, запускаем следующие команды:
tail -f /var/log/nginx/error.log
* лог ошибок nginx.
tail -f /var/log/php-fpm/error.log
* лог ошибок php-fpm.
tail -f /var/log/httpd/error_log
* лог ошибок apache в CentOS.
tail -f /var/log/apache2/error_log
* лог ошибок apache в Ubuntu.
В первую очередь, нужно обратить внимание на повторяющиеся ошибки — они могут быть причиной проблем. Лучше всего, добиться полного отсутствия ошибок, внеся исправления в работу сайта. Возможно, это устранит проблемы производительности.
Статистика веб-сервера
Для веб-серверов можно воспользоваться служебной страницей просмотра статуса. Она может показать статистику запросов к веб-серверу.
Apache
Для Apache необходим модуль mod_status, который идет в комплекте с данным веб-сервером. Проверить подключение модуля можно в конфигурационном файле httpd.conf (в разных Linux системах может находится в различных каталогах).
По умолчанию, server-status не активен. Создаем конфигурационный файл.
Для CentOS / Red Hat:
Для Ubuntu / Debian:
* где 2 — используемая версия apache.
В открытый конфигурационный файл добавим:
servername 111.111.111.111
Sethandler server-status
* где 111.111.111.111 — IP-адрес нашего веб-сервера; 80 — порт, на котором слушает apache.
* в данном примере мы прописали два варианта просмотра статистики: первый — обращение в браузере к серверу по IP-адресу + /server-status; второй — обращение к любому сайту + /server-status. Разные способы оправданы для разных настроек самих сайтов и используемых CMS.
Проверим корректность внесенных данных и перезапустим веб-сервер apache:
systemctl restart httpd || systemctl restart apache2
Теперь открываем браузер и вводим название сайта + /server-status, например, http://www.dmosk.ru/server-status. Или обращаемся к серверу по IP-адресу, например, http://111.111.111.111/server-status.
NGINX + PHP-FPM
Открываем конфигурационный файл nginx:
В секцию http добавляем:
.
server <
listen 80;
server_name 111.111.111.111;
location /server-status <
stub_status on;
>
>
.
* где 111.111.111.111 — IP-адрес нашего веб-сервера.
Проверяем корректность настройки и перезапускаем nginx:
systemctl restart nginx
Открываем браузер и заходим на страницу 111.111.111.111/server-status. Мы должны увидеть статистику использования сервера:
Теперь настроим статистику для php-fpm. В конфигурационном файле nginx в нашу директиву server добавим:
.
server <
listen 80;
server_name 78.110.63.31;
location /server-status <
stub_status on;
>
location /status <
access_log off;
include fastcgi_params;
#fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
>
>
.
* обратите внимание на закомментированную строку и строку под ней. В зависимости от того, как настроен php-fpm (слушает на порту или через сокетный файл) необходимо настроить nginx. В данном примере подразумевается, что php-fpm слушает на 9000 порту.
Открываем конфигурационный файл php-fpm:
Снимаем комментарий со следующей строки:
Проверяем настройку nginx, перезапускаем его и php-fpm:
systemctl restart nginx
systemctl restart php-fpm
Открываем браузер и заходим на страницу 111.111.111.111/server-status. Мы должны увидеть статистику использования сервера:
Долгие запросы
С помощью длительных запросов к веб-серверу или СУБД можно сделать выводы о том, что является узким местом в работе сервиса.
MySQL / MariDB
Для начала, воспользуемся инструкцией, чтобы настроить ведение лога медленных запросов (для MySQL или MariaDB).
После, воспользовавшись статистикой, находим неоптимальные запросы. В одних случаях необходимо будет переписать сам запрос, в других — создать индексы базы данных.
PHP-FPM
Открываем конфигурационный файл:
Редактируем следующие параметры:
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/www-slow.log
* request_slowlog_timeout определяет время, в течение которого должен выполняться запрос, чтобы он считался медленным; slowlog — путь до лога, куда будет сохранена информация о медленных запросах.
systemctl restart php-fpm
Непрерывный просмотр лога можно запустить командой:
Источник
Мониторинг производительности MySQL при помощи Mytop
Mytop – это открытый инструмент командной строки для мониторинга производительности MySQL, разработанный по примеру инструмента мониторинга системы Linux под названием top. Mytop подключается к MySQL и периодически запускает команды show processlist и show global status, а затем резюмирует информацию в удобном формате. При помощи Mytop можно в режиме реального времени отслеживать потоки, запросы и аптайм MySQL, узнать, какой пользователь отправляет запросы к той или иной базе данных, определить медленные запросы и многое другое. Вся эта информация может быть использована для оптимизации производительности сервера MySQL.
Данное руководство поможет установить и настроить mytop.
Требования
- Сервер CentOS 7 с 64-битной архитектурой (CentOS 6 также подойдёт).
- Не-root пользователь с доступом к sudo (нужен для запуска команд руководства); чтобы создать такого пользователя, обратитесь к этой статье.
- Предварительно установленный сервер MySQL. Инструкции по установке можно найти здесь.
1: Установка mytop
Для начала нужно добавить репозиторий EPEL (Extra Packages for Enterprise Linux), который управляет высококачественными пакетами дополнительных программ с открытым исходным кодом. Выполните следующую команду, чтобы добавить и включить репозиторий EPEL:
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Прежде чем продолжить, убедитесь, что репозиторий EPEL включен:
sudo yum repolist
Если EPEL включен, он появится в выводе:
epel/x86_64 Extra Packages for Enterprise Linux 7 — x86_64
Теперь нужно защитить базовые пакеты системы от воздействия репозитория EPEL при помощи плагина protectbase.
sudo yum install yum-plugin-protectbase.noarch -y
Плагин protectbase защищает репозитории yum от обновления. Таким образом, пакеты в защищённых репозиториях не будут обновляться или переопределяться пакетами из других репозиториев (даже боле новыми).
Теперь можно установить пакет mytop:
sudo yum install mytop -y
Эта команда установит mytop и его зависимости, в основном это модули perl.
2: Настройка mytop
Прежде чем запустить mytop, создайте пользовательский конфигурационный файл по имени .mytop.
sudo nano /root/.mytop
Добавьте следующие настройки, а затем сохраните и закройте файл.
host=localhost
db=mysql
delay=5
port=3306
socket=
batchmode=0
color=1
idle=1
Этот конфигурационный файл будет использоваться при запуске mytop.
Отредактируйте этот файл согласно требованиям вашего сервера. К примеру, опция delay задаёт промежуток времени между обновлениями дисплея (в секундах). Чтобы дисплей mytop обновлялся каждые 3 секунды, отредактируйте файл /root/.mytop:
sudo nano /root/.mytop
delay=3
Параметр idle определяет, нужно ли выводить в mytop ожидающие потоки. По умолчанию такие потоки учитываются. Опуская ожидающие потоки, mytop меняет порядок сортировки по умолчанию, выводя длинные запросы в верхней части списка. Чтобы опустить ожидающие потоки, отредактируйте этот параметр:
При необходимости можно обратиться к справочнику по mytop, он содержит описание каждого параметра в конфигурационном файле. Чтобы получить доступ к справочнику, используйте команду:
Чтобы закрыть справочник, нажмите q.
3: Подключение к mytop
Теперь можно подключить mytop и MySQL.
Mytop необходимы учетные данные для доступа к БД, их можно предоставить через командную строку или указать в конфигурационном файле. Для большей безопасности рекомендуется использовать опцию –prompt, которая будет каждый раз запрашивать пароль.
Чтобы подключиться к mytop, введите:
sudo mytop —prompt
Предоставьте root-пароль MySQL. Также можно использовать аргументы (полный список аргументов можно найти в справочнике). К примеру, чтобы подключить к mytop другого пользователя mysql (в данном примере его зовут 8host), нужно добавить в команду его имя:
sudo mytop -u 8host —prompt
Чтобы подключить определённую БД, используйте команду:
sudo mytop -d databasename —prompt
Чтобы закрыть mytop и вернуться в сессию оболочки, введите q.
4: Просмотр и интерпретация вывода mytop
После подключения к mytop на экране появится просмотр потоков, который имеет примерно такой вид:
MySQL on localhost (5.5.41-MariaDB) up 0+00:05:52 [01:33:15] Queries: 148 qps: 0 Slow: 0.0 Se/In/Up/De(%): 09/00/00/00
qps now: 2 Slow qps: 0.0 Threads: 6 ( 5/ 0) 67/00/00/00
Key Efficiency: 2.0% Bps in/out: 14.7/320.7k Now in/out: 192.5/731.8k
Id User Host/IP DB Time Cmd Query or State
— —- ——- — —- — ———-
2 root localhost mysql 0 Query show full processlist
16 root localhost 0 Sleep
17 root localhost testdb 0 Query SELECT * FROM dept_emp
18 root localhost testdb 0 Query SELECT * FROM dept_emp
19 root localhost testdb 0 Query SELECT * FROM dept_emp
20 root localhost testdb 0 Query SELECT * FROM dept_emp
Примечание: Чтобы вернуться в этот список, нажмите t.
Как видите, этот экран разделён на две части. Первые четыре линии – это заголовки, которые можно включить или выключить с помощью комбинации клавиш Shift-H. Заголовок содержит сводную информацию о сервере MySQL.
- Первая строка определяет имя сервера и версию MySQL. Справа показан аптайм процесса MySQL в формате дни + часы: минуты: секунды.
- Вторая строка отображает общее количество обработанных запросов (в данном случае), среднее количество запросов в секунду, количество медленных запросов, и процентное соотношение запросов Select, Insert, Update и Delete.
- Третья строка показывает значения в режиме реального времени с момента последнего обновления mytop. Нормальным периодом обновления mytop считается 5 секунд, так что если за последние 5 секунд были проведены100 запросов с момента обновления, то qps now будет показывать 20. Первое поле показывает количество запросов в секунду (qps now: 2). Второе значение показывает количество медленных запросов в секунду. В Тем: 6 (5/0) сегмента указывает есть всего 6 связанные темы, 5 являются активными (один спит), и есть 0 нити в кэше потоков. Последнее поле в третьей строке показан процент запросов, как в предыдущей строке, но с прошлого MyTOP обновления. Сегмент Threads: 6 ( 5/ 0) показывает, что на данный момент всего есть 6 подключенных потоков, из которых 5 активны, 1 в ожидании и 0 в кэше потоков. Последнее поле в третьей строке показывает процентное соотношение запросов, как в предыдущей строке, но с момента последнего обновления mytop.
- Четвертая строка отображает производительность буфера ключей (т.е. как часто ключи считываются из буфера, а не с диска) и количество отправленных и полученных байт (общее и с момента последнего обновления mytop). К примеру, Key Efficiency: 2.0% говорит, что из буфера получено 2% ключей, а Bps in/out: 14.7/320.7k показывает, что с момента запуска сервер MySQL в среднем получил 14.7kbps входящего трафика и 320.7kbps исходящего трафика. Now in/out тоже показывает трафик, но с момента последнего обновления mytop.
Вторая часть вывода показывает текущие потоки MySQL, отсортированные по времени простоя (сначала идут потоки с наименьшим показателем простоя). Чтобы обратить порядок сортировки, нажмите клавишу О. Также здесь показаны идентификатор потока, имя пользователя, хост, с которого подключается пользователь, БД, к которой он подключен, количество секунд простоя, команда или состояние потока, и первая часть информации запроса. Если поток в состоянии Query (т.е. Cmd показывает Query), то столбец Query or State будет показывать первую часть запущенного запроса. Если состояние потока Sleep или Idle, то столбец Query or State будет пуст. В данном примере поток с id 2 это собственно mytop, запускающий команду show processlis. Поток с id 16 находится в режиме ожидания, а поток с id 17 выполняет запрос SELECT в БД testdb.
Теперь вы знакомы с основами интерпретации вывода mytop. Инструмент mytop можно использовать, чтобы собрать больше информации о потоках и запросах MySQL. Рассмотрим следующий вывод mytop:
MySQL on localhost (5.5.41-MariaDB) up 0+00:13:10 [23:54:45] Queries: 2.8k qps: 4 Slow: 51.0 Se/In/Up/De(%): 45/00/00/00
qps now: 17 Slow qps: 0.0 Threads: 52 ( 51/ 0) 96/00/00/00
Key Efficiency: 100.0% Bps in/out: 215.4/ 7.6M Now in/out: 2.0k/16.2M
Id User Host/IP DB Time Cmd Query or State
— —- ——- — —- — ———-
34 root localhost testdb 0 Query show full processlist
1241 root localhost 1 Sleep
1242 root localhost testdb 1 Query SELECT * FROM dept_emp
1243 root localhost testdb 1 Query SELECT * FROM dept_emp
1244 root localhost testdb 1 Query SELECT * FROM dept_emp
1245 root localhost testdb 1 Query SELECT * FROM dept_emp
1246 root localhost testdb 1 Query SELECT * FROM dept_emp
1247 root localhost testdb 1 Query SELECT * FROM dept_emp
В стандартном выводе mytop запросы сокращены. Чтобы просмотреть запись полностью, нажмите F. Программа спросит:
Full query for which thread id:
Введите id потока, чтобы просмотреть необходимый запрос. Для примера введём 1244, и на экране появится:
Thread 1244 was executing following query:
SELECT * FROM dept_emp WHERE .
— paused. press any key to resume or (e) to explain —
Чтобы получить объяснение запроса, нажмите Е, и тогда программа предоставит данные о запущенном запросе, которые помогут выяснить, оптимизируется ли запрос. EXPLAIN – один из самых производительных инструментов для понимания и оптимизации запросов MySQL. Например:
EXPLAIN SELECT * FROM dept_emp:
*** row 1 ***
table: dept_emp
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 332289
Extra: NULL
— paused. press any key to resume —
Чтобы закрыть этот режим, нажмите любую клавишу; чтобы вернуть стандартный вывод, нажмите t.
Еще один полезный вид mytop доступен при нажатии клавиши С. Он показывает запущенные команды.
Command Total Pct | Last Pct
——- —— — | —- —
select 1782 55% | 100 8%
show status 723 22% | 533 45%
show processlist 708 22% | 532 45%
change db 2 0% | 0 0%
show variables 1 0% | 0 0%
Compression 0 0% | 0 0%
Столбец Command показывает тип запущенной команды или запроса. Столбец Total указывает общее количество команд такого типа с момента запуска сервера, а Pct показывает это число в процентном соотношении. Столбец Last показывает количество команд такого типа с момента последнего обновления mytop. В целом эти данные дают представление о работе сервера MySQL в краткосрочной и долгосрочной перспективе.
Конечно, данное руководство не может охватить все функции mytop, но теперь вы знакомы с самыми основными функциями данного инструмента. Чтобы просмотреть полный список опций, нажмите клавишу со знаком вопроса, когда mytop запущен.
Заключение
Итак, теперь вы знакомы с основами работы с mytop. Этот инструмент позволяет вовремя обнаружить и оптимизировать сложные запросы SQL, тем самым увеличивая общую производительность сервера. Более подробную информацию об оптимизации запросов и таблиц MySQL и MariaDB можно найти здесь.
Источник