Это обычный модуль Apache 2.x для Linux:
-
модуль предназначен для сбора и накопления статистики по использованию ресурсов(CPU и memory, время выполнения скрипта и пр.) веб-сервером Apache 2.4/2.2/2.0;
-
модуль позволяет производить анализ собранных данных. Он позволяет отслеживать за тем, сколько ресурсов потребляет поступивший веб-серверу запрос. Каждый раз сохраняя следующую информацию:
-
виртуальный хост, которому поступил запрос;
-
файл, который запрашивается;
-
URI запроса;
-
CPU нагрузка в %;
-
использование памяти в %;
-
время обработки запроса.
А накопившуюся статистику — позволяет анализировать. В качестве базы данных для сохранения и анализа используется SQLite (MySQL, PostgreSQL, error_log). Модуль позволяет отслеживать как абсолютно все запросы, так и конкретные, отфильтрованные по правилу с помощью регулярных выражений. Точнее будет сказано, что модуль ВСЕГДА обрабатывает только те запросы, которые соответствуют фильтру, содержащему регулярное выражение
Модуль адаптирован под Apache 2.0/2.2/2.4
- отключить selinux
- yum install httpd-devel apr-devel gd-devel sqlite3
- mkdir ~/tmp
- cd ~/tmp
- wget https://github.com/bayrepo/mod_performance/archive/master.zip --no-check-certificate -O mod_performance.zip
- unzip mod_performance.zip
- cd mod_performance-master/
- make
- cp .libs/mod_performance.so /etc/httpd/modules/
- cp mod_performance.conf /etc/httpd/conf.d/
- раскомментировать LoadModule performance_module modules/mod_performance.so
- mkdir -p /opt/performance/
- chown apache:apache /opt/performance/
- chmod 755 /opt/performance/
- раскомментировать в mod_performance.conf строки #PerformanceDB и #PerformanceSocket
- service httpd restart
- cp libmodperformance.so.0.4 /usr/lib64/
- ln -s libmodperformance.so.0.4 /usr/lib64/libmodperformance.so
- ldconfig
- отключить selinux
- apt-get install make apache2-prefork-dev libgd2-xpm-dev sqlite3
- mkdir ~/tmp
- cd ~/tmp
- wget https://github.com/bayrepo/mod_performance/archive/master.zip --no-check-certificate -O mod_performance.tar.gz
- unzip mod_performance.zip
- cd mod_performance-master/
- make
- cp .libs/mod_performance.so /usr/lib/apache2/modules/
- cp mod_performance.conf /etc/apache2/mods-available/
- echo "LoadModule performance_module /usr/lib/apache2/modules/mod_performance.so" > /etc/apache2/mods-available/mod_performance.load
- a2enmod mod_performance
- /etc/init.d/apache2 restart
- mkdir -p /opt/performance/
- chown www-data:www-data /opt/performance/
- chmod 755 /opt/performance/
- раскомментировать в mod_performance.conf строки #PerformanceDB и #PerformanceSocket
- service apache2 restart
- cp libmodperformance.so.0.4 /usr/lib64/
- ln -s libmodperformance.so.0.4 /usr/lib64/libmodperformance.so
- ldconfig
- отключить selinux
- yast2 -i apache2-devel gd-devel libapr1-devel sqlite3 make
- mkdir ~/tmp
- cd ~/tmp
- wget https://github.com/bayrepo/mod_performance/archive/master.zip --no-check-certificate -O mod_performance.tar.gz
- unzip mod_performance.zip
- cd mod_performance-master/
- make
- cp .libs/mod_performance.so /usr/lib/apache2-prefork/
- cp mod_performance.conf /etc/apache2/conf.d/
- раскомментировать LoadModule performance_module /usr/lib/apache2-prefork/mod_performance.so
- mkdir -p /opt/performance/
- chown wwwrun:wwwrun /opt/performance/
- chmod 755 /opt/performance/
- раскомментировать в mod_performance.conf строки #PerformanceDB и #PerformanceSocket
- service apache2 restart
- cp libmodperformance.so.0.4 /usr/lib64/
- ln -s libmodperformance.so.0.4 /usr/lib64/libmodperformance.so
- ldconfig
- pkg_add -rv apache
- pkg_add -rv apr-ipv6-devrandom-gdbm-db42
- pkg_add -rv gd
- pkg_add -rv wget
- cd ~/tmp
- wget https://github.com/bayrepo/mod_performance/archive/master.zip --no-check-certificate -O mod_performance.tar.gz
- unzip mod_performance.zip
- cd mod_performance-master/
- gmake
- cp .libs/mod_performance.so /usr/local/libexec/apache22/
- cp mod_performance.conf /usr/local/etc/apache22/Includes/
- раскомментировать LoadModule performance_module libexec/apache22/mod_performance.so
- mkdir -p /opt/performance/
- chown www:www /opt/performance/
- chmod 755 /opt/performance/
- раскомментировать в mod_performance.conf строки #PerformanceDB и #PerformanceSocket
- /usr/local/etc/rc.d/apache22 restart
- pkg install apache24
- pkg install graphics/gd
- pkg install wget
- pkg install sqlite3
- mkdir ~/tmp
- cd ~/tmp
- wget https://github.com/bayrepo/mod_performance/archive/master.zip --no-check-certificate -O mod_performance.zip
- unzip mod_performance.zip
- cd mod_performance-master/
- gmake
- cp .libs/mod_performance.so /usr/local/libexec/apache24/
- cp mod_performance.conf /usr/local/etc/apache24/Includes/
- раскомментировать или добавить LoadModule performance_module libexec/apache24/mod_performance.so
- mkdir -p /opt/performance/
- chown www:www /opt/performance/
- chmod 755 /opt/performance/
- раскомментировать в mod_performance.conf строки #PerformanceDB и #PerformanceSocket
- service apache24 start
- cp libmodperformance.so.0.4 /usr/lib/
- ln -s libmodperformance.so.0.4 /usr/lib/libmodperformance.so
- ldconfig
Устанавливает путь к сокету, посредством которого модуль общается с демоном. Параметр глобальный и не может переопределяться в виртуальных хостах и htaccess файлах. Значение по умолчанию logs/perfsocket — что означает, что сокет будет создан в директории logs Apache. Т.е там, где сервер складывает свои логи.
Не рекомендуется использовать значение по умолчанию,т.к. не на всех системах модуль будет иметь доступ к сокету послестарта и создания. Рекомендуется придерживаться инструкций и хранить сокет в отдельном каталоге /opt/performance/, созданном специально для нужд модуля.
Название: | PerformanceSocket |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | logs/perfsocket |
Пример: | PerformanceSocket /etc/httpd/logs/perf.sock |
Флажок — On/Off. Если этот флажок установлен глобально, то ведется наблюдение за всеми виртуальными хостами. Если параметр глобально выключен, то возможно включение его в отдельных виртуальных хостах, тогда наблюдение будет производится только за этими хостами.
Название: | PerformanceEnabled |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | Off |
Пример: | PerformanceEnabled On |
Фильтр хостов, за которыми производится отслеживание.Список хостов через пробел.
При наличии трех условий PerformanceHostFilter, PerformanceScript, PerformanceURI условие выполняется только при положительной проверке трех фильтров. При наличии двух — условие выполняется при положительной проверке двумя фильтрами — третий не учитывается. Если не указан ни один фильтр — статистика не ведется ни для одного сайта. Отключить учет статистики можно можно установкой параметра PerformanceEnabled Off.
Название: | PerformanceHostFilter |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | Null |
Пример: | PerformanceHostFilter example.host1.com example.host2.com … |
Фильтр хостов, за которыми производится отслеживание.Список хостов через пробел. Список хостов для конфигурации с расширением php
Название: | PerformanceHostFilterExternal |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | Null |
Пример: | PerformanceHostFilterExternal example.host1.com example.host2.com … |
Регулярное выражение, для обработки только определенных выражением URI, иными словами – фильтр отслеживаемых запросов по URI(regexp синтаксис).
Название: | PerformanceURI |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | Null |
Пример: | PerformanceURI .html$ |
Фильтр отслеживаемых запросов по вызываемому скрипту(regexp синтаксис).
Название: | PerformanceScript |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | Null |
Пример: | PerformanceScript .php$ |
Хендлер веб-сервера — для вывода страницы отчета модуля. Статистика по всем хостам:
Название: | PerformanceWorkHandler |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | performance-status |
Пример: | PerformanceWorkHandler performance-status |
Хендлер веб-сервера — для вывода страницы отчета модуля. Статистика по вызываемому хосту:
Название: | PerformanceUserHandler |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | user-status |
Пример: | PerformanceUserHandler user-status |
Тип логирования — Log(сохранять информацию в лог PerformanceLog, PerformanceLogFormat), SQLite — сохранение информации в SQLite базу (PerformanceDB, PerformanceHistory), MySQL — сохранение информации в базу MySQL(PerformanceDbUserName, PerformanceDBPassword, PerformanceDBName, PerformanceDBHost, PerformanceHistory), Postgres — сохранение информации в базу PostgreSQL(PerformanceDbUserName, PerformanceDBPassword, PerformanceDBName, PerformanceDBHost, PerformanceHistory).
Название: | PerformanceLogType |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | SQLite |
Пример: | PerformanceLogType Log |
Путь к базе данных типа – SQLite
Название: | PerformanceDB |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | logs/perfdb |
Пример: | PerformanceDB /etc/httpd/log/perf.db |
Имя базы данных MySQL, PostgreSQL хранящей данные:
Название: | PerformanceDbName |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | perf_db |
Пример: | PerformanceDBName perfdb |
Пользователь базы данных MySQL, PostgreSQL хранящей данные:
Название: | PerformanceDbUserName |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | perf_user |
Пример: | PerformanceDbUserName perf |
Пароль базы данных MySQL, PostgreSQL хранящей данные:
Название: | PerformanceDBPassword |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | perf_password |
Пример: | PerformanceDBPassword pass |
Хост базы данных MySQL, PostgreSQL хранящей данные:
Название: | PerformanceDBHost |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | localhost |
Пример: | PerformanceDBHost host1.com |
Путь к файлу логов, где сохраняется информация по запросам в режиме Log:
Название: | PerformanceLog |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | Null |
Пример: | PerformanceLog logs/perf.log |
Формат выводимой в лог информации в режиме Log. Служебные переменные:
- %DATE% -дата запроса,
- %HOST% – хост запроса,
- %URI% – uri запроса,
- %SCRIPT% – скрипт исполняющий запрос,
- %CPU% – использование процессора,
- %MEM% – использование памяти,
- %EXCTIME% – время исполнения скрипта,
-
% – знак процента:
Название: PerformanceLogFormat Расположение в конфигурационном файле: Global Значение по умолчанию: [%DATE%] from %HOST% (%URI%) script %SCRIPT%: cpu %CPU%, memory %MEM%, execution time %EXCTIME% Пример: PerformanceLogFormat [%DATE%] from %HOST% (%URI%) script %SCRIPT%: cpu %CPU%, memory %MEM%, execution time %EXCTIME%
Число дней хранения истории для SQLite, MySQL, Postgres.
Название: | PerformanceHistory |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | 30 |
Пример: | PerformanceHistory 10 |
Позволяет игнорировать redirect-handler. Если для анализируемого скрипта или сайта используется mod_rewrite. Рекомендуется установить его в On:
Название: | PerformanceUseCanonical |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | Off |
Пример: | PerformanceUseCanonical On |
Режим подсчета % CPU. Solaris – 100% – это когда загружены все ядра, например 4 ядра и одно загружено на 100%, то будет отображено 25%. Irix – 100% – это когда одно ядро загружено на 100%. Например, если 2 ядра загружены на 100%, то будет отображаться – 200%
Название: | PerformanceUseCPUTopMode |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | Irix |
Пример: | PerformanceUseCPUTopMode Solaris |
Период выполнения демона или время перезапуска демона. В общем, временной интервал через который демон перезапустится. Необходим в случае, если демон потребляет много памяти.
В формате HH:MM:SS или HH-MM-SS или ddddd.
Если задано время, то ежедневно в это время демон будет перезапущен. Если задано число, то по истечении стольких секунд — демон будет перезапущен.
Название: | PerformanceCheckDaemonTimeExec |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | NULL |
Пример: | PerformanceCheckDaemonTimeExec 20:00:00 |
Экспериментальный параметр для MySQL базы данных. Запускает оптимизацию базы данных модуля в указанное параметром время — ежедневно. Время указывается в формате HH:MM:SS или HH-MM-SS.
Название: | PerformanceFragmentationTime |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | NULL |
Пример: | PerformanceFragmentationTime 20:00:00 |
два параметра
- число(в 1/100 секунды),
-
HARD/SOFT – задает минимальное время выполнения скрипта и способ его сохранения HARD(не сохранять)/SOFT(сохранять с 0 %CPU)
Название: PerformanceMinExecTime Расположение в конфигурационном файле: Global Значение по умолчанию: NULL Пример: PerformanceMinExecTime 10 SOFT
Фильтр отслеживаемых запросов по вызываемому скрипту(regexp синтаксис) для таких модулей как mod_suphp и пр.
Название: | PerformanceExternalScript |
---|---|
Расположение в конфигурационном файле: | Global, VirtualHost |
Значение по умолчанию: | NULL |
Пример: | PerformanceExternalScript .php$ |
On или Off тихий режим, когда сообщения о том, что клиентский скрипт не смог соединиться с демоном или окончить сессию не падают в лог сервера
Название: | PerformanceSilentMode |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | On |
Пример: | PerformanceSilentMode Off |
Данный параметр и режим введены для уменьшения нагрузки на свободное пространство сервера. Невозможность соединения с демоном или неоконченная сессия не критичны для сервера и запроса, а также статистики
Используется в виде PerformanceSocketPermType 600 PID или PerformanceSocketPermType 777 NOPID. Используется для режимов работы mod_performance+mod_fcgid+php-cgi. Устанавливает права на сокет, указанные в этом параметре, а также модификацию имени сокета. По умолчанию, имя сокета задается как PerformanceSocket+.pid процесса. А для режима mod_fcgid, php-cgi должен знать точный путь к сокету, и чтоб он не менялся, задается режим NOPID. Если необходимо омтавить станадртные права, то задается PerformanceSocketPermType 000 NOPID. Для изменения прав сокета без смены названия – PerformanceSocketPermType 755 PID
Название: | PerformanceSocketPermType |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | 000 PID |
Пример: | PerformanceSocketPermType 777 NOPID |
Для слежения за птоком/процессом использовать идентификатор потока (TID) – если On или идентификатор процесса (PID), если Off:
Название: | PerformanceUseTid |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | Off |
Пример: | PerformanceUseTid On |
Устанавливает имя хоста, которое логируется вместе с параметрами запросов. Необходимо для одной глобальной базы данных, в которую собирается статистика со многих серверов:
Название: | PerformanceHostId |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | localhost |
Пример: | PerformanceHostId server1 |
Путь к файлу пользовательских отчетов:
Название: | PerformanceCustomReports |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | NULL |
Пример: | PerformanceCustomReports /opt/performance/customrep.tpl |
Для создания пользовательского отчета используется следующий синтаксис в файле custom.tpl:
[название отчета]
header=Fld 1|Fld 2|Fld 3;
ssql=запрос в синтаксисе SQLite;
msql=запрос в синтаксисе MySQL;
psql=запрос в синтаксисе PostgerSQL;
sort=1,2;
В квадратных скобках пишется название отчета, оно будет выводится в заголовке отчета.
Header – название и список выводимых полей по порядку в select разделенные знаком «|». В примере, первое подхваченное поле из select будет выведено в столбце Fld 1, второе в столбце Fld 2 и т.д.
Ssql, msql, psql – запросы к базе. Рекомендую использовать не прямые названия полей таблицы, а их псевдонимы. Отчет отображается, если для текущей конфигурации БД есть запрос(SSQL,MSQL,PSQL)
Соответствие поля таблицы и псевдонима:
- id :ITEMNUMBER: – идентификатор записи
- dateadd :DATEADD: – дата добавления записи
- host :FORHOST: – хост, к которому осуществлялся запрос
- uri :REQUESTURI: – URI запроса
- script :CALLEDSCRIPT: – вызываемый скрипт
- cpu :CPUUSAGE: – CPU в %
- memory :MEMUSAGEINPRCT: – память в %
- exc_time :EXECUTIONTIME: – время исполнения запроса
- cpu_sec :CPUUSAGEINSEC:
- memory_mb :MEMUSAGEINMB: – память в Mb
- bytes_read :BYTESREAD:- байт прочитано
- bytes_write :BYTESWRITE: – байт записано
- hostnm :HOSTNAME: – запрос осуществлялся на сервере …
Поля для фильтра:
- :FILTER: – учитывать поля фильтра
- :PERIOD: – учитывать введенный период
- performance – :TBL: – псевдоним таблицы
Пример:
file mysql custom.tpl
select count(*) as t1, sum(:CPUUSAGE:)/count(*) as t2, sum(:MEMUSAGEINPRCT:)/count(*) as t3, sum(:BYTESREAD:+:BYTESWRITE:)/count(*) as t4, :CALLEDSCRIPT:, :FORHOST: from :TBL: where :FILTER: and :PERIOD: group by :CALLEDSCRIPT:,:FORHOST:
Установить этап сбора статистики модулем. LogHook - в logtransaction hook апача или Filter - в выходном фильтре. LogHook - рекомендуется для: mpm-prefork, mpm-itk, а Filter - для mpm-worker, mpm-event.
Название: | PerformanceWorkMode |
---|---|
Расположение в конфигурационном файле: | Global |
Значение по умолчанию: | LogHook |
Пример: | PerformanceWorkMode Filter |
Для работы mod_performance с любым типом php(кроме dso) необходимо использовать расширение php: modperf_ext.so. Расширение доступно в исходниках mod_performance. Что необходимо для сборки:
- Собрать модуль (описано выше)
- yum install php-devel
- cd ~/tmp/mod_performance-master/php_ext/modperf_ext
- phpize
- ./configure %%--%%enable-modperf_ext
- make
- cp .libs/modperf_ext.so /usr/lib64/php/modules/
- cp modperf_ext.ini /etc/php.d/
- в php.ini в конце добавить:
[modperf_ext]
modperf_ext.enabled = On
-
в файле /etc/httpd/conf.d/mod_performance.conf
- раскомментировать строку LoadModule performance_module /opt/lexvit/mod_performance04/mod_performance.so
- закомментировать строку #PerformanceScript .php
- раскомментировать или добавить строки
PerformanceDB /opt/performance/perfdb PerformanceSocket /opt/performance/perfsock PerformanceSocketPermType 777 NOPID
Если необходимо собрать расширения для нескольких версий php то вместо phpize и ./configure %%--%%enable-modperf_ext необходимо сделать:
- вызвать phpize того php для которого собирается расширение
- вызвать ./configure %%--%%enable-modperf_ext %%--%%with-php-config=[путь к php-config]
Пример
/usr/local/php53/bin/phpize
./configure --enable-modperf_ext --with-php-config=/usr/local/php53/bin/php-config
для каждой версии php
Пример настройки пользовательских отчетов (для CentOS/Redhat/Fedora) поставляемых с исходным кодом модуля:
- mkdir ~/tmp
- cd ~/tmp
- wget https://github.com/bayrepo/mod_performance/archive/master.zip --no-check-certificate -O mod_performance.zip
- unzip mod_performance.zip
- cd mod_performance-master/
- mkdir -p /opt/performance/
- chown apache:apache /opt/performance/
- chmod 755 /opt/performance/
- cp custom.tpl /opt/performance/
- добавить в mod_performance.conf параметр PerformanceCustomReports /opt/performance/custom.tpl
- service httpd restart
Список пользовательских отчетов доступных по-умолчанию:
- Show site average usage in different time period – показать среднюю нагрузку создаваемую сайтом в различные временные периоды
- Show most popular script by site – показать наиболее часто вызываемый скрипт по каждому сайту
- Show CPU load range by site – показать распределение нагрузки CPU по каждому сайту
- Show Memory Usage range by site — показать распределение использования памяти по каждому сайту
- Show Max CPU load in different time periods by site – показать максимальную нагрузку CPU в различные временные периоды по каждому сайту
- Show Max Memory Usage in different time periods by site — показать максимальное использование памяти в различные временные периоды по каждому сайту
- Show Max IO Usage in different time periods by site — показать максимальную IO нагрузку в различные временные периоды по каждому сайту
Для создания пользовательского отчета используется следующий синтаксис в файле custom.tpl:
[название отчета]
header=Fld 1|Fld 2|Fld 3;
ssql=запрос в синтаксисе SQLite;
msql=запрос в синтаксисе MySQL;
psql=запрос в синтаксисе PostgerSQL;
sort=1,2;
В квадратных скобках пишется название отчета.
- Header – название и список выводимых полей по порядку в select разделенные знаком «|». В примере, первое подхваченное поле из select будет выведено в столбце Fld 1, второе в столбце Fld 2 и т.д.
- Ssql, msql, psql – запросы к базе. Рекомендую использовать не прямые названия полей таблицы, а их псевдонимы. Отчет отображается, если для текущей конфигурации БД есть запрос(SSQL,MSQL,PSQL) Соответствие поля таблицы и псевдонима:
- id :ITEMNUMBER: – идентификатор записи
- dateadd :DATEADD: — дата добавления записи
- host :FORHOST: — хост, к которому осуществлялся запрос
- uri :REQUESTURI: — URI запроса
- script :CALLEDSCRIPT: — вызываемый скрипт
- cpu :CPUUSAGE: — CPU в %
- memory :MEMUSAGEINPRCT: — память в %
- exc_time :EXECUTIONTIME: — время исполнения запроса
- cpu_sec :CPUUSAGEINSEC:
- memory_mb :MEMUSAGEINMB: — память в Mb
- bytes_read :BYTESREAD:- байт прочитано
- bytes_write :BYTESWRITE: — ,fqn pfgbcfyj
- hostnm :HOSTNAME: — запрос осуществлялся на сервере …
Поля для фильтра:
- :FILTER: — учитывать поля фильтра
- :PERIOD: — учитывать введенный период
- performance — :TBL: – псевдоним таблицы
Пример:
select count(*) as t1, sum(:CPUUSAGE:)/count(*) as t2, sum(:MEMUSAGEINPRC
T:)/count(*) as t3, sum(:BYTESREAD:+:BYTESWRITE:)/count(*) as t4, :CALLEDSCRIPT:, :FORHOST: from :TBL: where :FILTER: and :PERIOD: group by :CALLEDSCRIPT:,:
FORHOST:
Настройка модуля для работы с централизованным хранилищем:
- в централизованном хранилище(MySQL, PostgreSQL) необходимо создать пользователя, базу данных и таблицу.
MySQL: CREATE TABLE IF NOT EXISTS performance(id INT NOT NULL AUTO_INCREMENT, dateadd DATETIME, host VARCHAR(255), uri VARCHAR(512), script VARCHAR(512), cpu FLOAT(15,5), memory FLOAT(15,5), exc_time FLOAT(15,5), cpu_sec FLOAT(15,5), memory_mb FLOAT(15,5), bytes_read FLOAT(15,5), bytes_write FLOAT(15,5), hostnm CHAR(32), PRIMARY KEY(id))
PostgreSQL: create table performance(id SERIAL, dateadd timestamp, host varchar(255), uri varchar(512), script varchar(512), cpu float(4), memory float(4), exc_time float(4), cpu_sec float(4), memory_mb float(4), bytes_read float(4), bytes_write float(4), hostnm char(32), PRIMARY KEY(id))
- на серверах, с которых будут собираться данные прописать в mod_performance.conf
PerformanceLogType MySQL или Postgres
PerformanceHostId HostName (вписать уникальное имя для каждого хоста, например его IP или прочее)
PerformanceDbUserName username
PerformanceDBPassword userpassword
PerformanceDBName dbname
PerformanceDBHost hostname – IP адрес или имя сервера с централизованным хранилищем данных
Скачать исходные коды модуля на github здесь
При запуске веб-сервера Apache — запускается демон модуля mod_performance. Успешный запуск демона отмечается в логе сервера строками ниже:
[timestamp] mod_performance: module enabled :)
[timestamp] mod_performance: server started :)
Запустившийся демон открывает unix-сокет и ожидает соединений.
При обработке запроса сервером, происходит проверка запроса на условие: необходимо ли для запроса сохранять статистику или нет. Если проверка прошла успешно, процесс сервера, принявший соединение отправляет демону информацию из procfs и PID(TID) процесса/потока, который будет обрабатывать запрос. По окончании работы отслеживаемого процесса, демон записывает данные в базу данных статистики. На текущий момент, модуль может работать в режиме сервера:
- Apache mod_php (prefork, worker);
- Apache itk + mod_php
- Apache mod_ruid2 + mod_php
- Apache + suphp (c наложенным патчем на suphp)((устаревший метод))
- Apache + php-fpm (c наложенным патчем на php-fpm)((устаревший метод))
- Apache + любой тип php (с помощью расширения php)(описан выше)
Полный список параметров описан выше.
Приведу пример сборки и конфигурирование модуля для CentOS:
- отключить selinux
- yum install httpd-devel apr-devel gd-devel sqlite3
- mkdir ~/tmp
- cd ~/tmp
- wget https://github.com/bayrepo/mod_performance/archive/master.zip %%--%%no-check-certificate -O mod_performance.zip
- unzip mod_performance.zip
- cd mod_performance-master/
- make
- cp .libs/mod_performance.so /etc/httpd/modules/
- cp mod_performance.conf /etc/httpd/conf.d/
- раскомментировать LoadModule performance_module modules/mod_performance.so
- mkdir -p /opt/performance/
- chown apache:apache /opt/performance/
- chmod 755 /opt/performance/
- раскомментировать в mod_performance.conf строки #PerformanceDB и #PerformanceSocket
- service httpd restart
- cp libmodperformance.so.0.4 /usr/lib64/
- ln -s libmodperformance.so.0.4 /usr/lib64/libmodperformance.so
- ldconfig
Типовая конфигурация для DSO: CentOS
file mod_performance.conf
LoadModule performance_module modules/mod_performance.so
`<IfModule mod_performance.c>`
PerformanceEnabled On
PerformanceUseCanonical On
PerformanceScript .php
PerformanceLogType SQLite
PerformanceDB /opt/performance/perfdb
PerformanceSocket /opt/performance/perfsock
#Minimal script execution time, wich accounts by script as load
PerformanceMinExecTime 50 SOFT
<Location /performance-status>
SetHandler performance-status
Allow from 1.1.1.1
</Location>
</IfModule>
Объясню, что задано в конфигурационном файле.
PerformanceEnabled — этим параметром активируется демон. Если его не включить, то модуль пудет работать в пассивном режиме. Т.е просто загружаться но не обрабатывать запросы.
PerformanceScript — здесть самое сердце модуля. Этот параметр задает — за чем следить. За какими скриптами. Я установил, что необходима слежка именно за PHP-скриптами.Параметр принимает регулярное выражение.
PerformanceUseCanonical -параметр позволяет игнорировать redirect-handler, генерируемый модулем mod_rewrite. Например, если не включить этот параметр, то можно в итоге получит не путь к скрипту, а нечто нижеследующее:
redirect: /index.php
если этот парметр включить,то будем получать нормальное отображение выполняющегося скрипта.
Далее, подобно mod_status, я прикрепляю админский хендлер модуля ко всем хостам по запросу /admin-status. И разрешаю доступ к этой странице только с адреса 1.1.1.1.
PerformanceLogType – этим параметром задается , что данные о запросах будут накапливаться в базе данных sqlite.
PerformanceDB и PerformanceSocket задают путь к базе дынных и сокету.
Типовая конфигурация для php как cgi,suphp,php-fpm,cgid,fastcgi. Предварительно устанавливается расширение:
file mod_performance.conf
LoadModule performance_module modules/mod_performance.so
<IfModule mod_performance.c>
PerformanceEnabled On
PerformanceUseCanonical On
PerformanceLogType SQLite
PerformanceDB /opt/performance/perfdb
PerformanceSocket /opt/performance/perfsock
#Minimal script execution time, wich accounts by script as load
PerformanceMinExecTime 50 SOFT
PerformanceSocketPermType 777 NOPID
<Location /performance-status>
SetHandler performance-status
Allow from 1.1.1.1
</Location>
</IfModule>
Доступен при PerformanceLogType = SQLite, MySQL, Postgres.
Расскажу немного о его особенностях (рис 1).
Рис 1.
- Hide/Show – кнопка «Скрыть/Показать фильтр» – предназначена для сворачивания и разворачивания окна фильтров.\
- Report – выпадающий список доступных отчетов (отчеты анализа накопленных данных)\
- Sort Field – номер выводимого поля, по которому будет производится сортировка (не действует на пользовательские отчеты)\
- Sort Type – тип сортировки выбранного поля – по-возрастанию или по-убыванию (не действует на пользовательские отчеты)\
- Period(days) – интервал в днях от текущего дня за который будут проанализированы данные\
- Period begin (Period End) – точная дата и время начала и конца анализируемого периода (если указаны эти значения, то поле Period(days) игнорируется)\
- Дополнительные параметры фильтра анализируемых данных. Возможно как строгое совпадение, так и не строгое – например значение заканчивающееся на test – %test.\
- Дополнительные параметры фильтра анализируемых данных. Возможно как строгое совпадение, так и не строгое – например значение заканчивающееся на test – %test.\
- Дополнительные параметры фильтра анализируемых данных. Возможно как строгое совпадение, так и не строгое – например значение заканчивающееся на test – %test.\
- Ссылка на скачивание самой последней версии\
- Ссылка на документацию по модулю\
- Значок сортировки данных на странице (v – по-убыванию, ^-по-возрастанию)\
- Строка заголовков столбцов\
- Фиксированная строка номера столбца. Не сдвигается даже при прокрутке страницы.\
Интерфейс модуля использует JavaScript.
- Show output without analytics – вывести собранную информацию без анализа, отфильтрованную по хосту, скрипту и URI(графический и текстовый режим);
- Maximal %CPU – вывести только записи с максимальным значением %CPU(с учетом фильтрации);
- Maximal memory % — вывести только записи с максимальным значением %memory(с учетом фильтрации);
- Maximal execution request time – вывести самыйдолго выполняющийся скрипт;
- Host requests statistics – вывести статистику обращений к хостам с сортировкой по убыванию (в % от общего числа с учетом фильтров);
- Number of requests per domain — вывести статистику обращений к хостам с сортировкой по убыванию(не в процентах а количество);
- Average usage per host — вывести среднюю загрузку сервера каждым хостом(сумма % CPU, сумма % MEMORY, сумма выполнения скриптов, средний % CPU за период, средний % использования памяти, среднее время выполнения скриптов);
Выводимые поля в отчетах:
- ID — идентификатор записи;
- DATE ADD — когда прошел запрос;
- HOSTNAME — имя виртуального хоста;
- URI — uri запроса;
- SCRIPT — выполнявшийся скрипт;
- CPU(%) — использование CPU в %;
- MEM(%) — использование памяти в %;
- TIME EXEC(sec) — время выполнения запроса;
- CPU TM(sec) — процессорное время в секундах;
- MEM USE(Mb) — использование памяти в мегабайтах;
- IO READ(Kb) — прочитано Кбайт процессом;
- IO WRITE(Kb) — записано Кбайт процессом.
Отчеты доступны в режиме: SQLite, MySQL, Postgres
Если текстовой информации не достаточно, есть возможность посмотреть на диаграмму:
Добавлена возможность создавать свои отчеты (отчет – это метод анализа собираемых модулем данных). Модуль по-прежнему несет определенный набор отчетов, так называемый «из коробки». Но в исходных кодах модуля присутствует файл custom.tpl, который расширяет число доступных отчетов модуля. А также позволяет создавать свои собственные запросы к базе данных и отображение полученных результатов. Как это сделать я опишу далее.
Пример настройки пользовательских отчетов (для CentOS/Redhat/Fedora) поставляемых с исходным кодом модуля:
Пользовательские отчеты - описаны выше.
Показатель CPU usage вычисляется по следующей схеме. Модуль при поступлении запроса снимает показания jiffies процесса (системы в целом и текущего процесса) и в конце запроса еще раз производится замер и эти данные посылаются демону. На их основании принимается решение об использовании процессора. Т.е. если наблюдая с помощью top вы увидели загрузку: 0%, 10%, 100%, 20%, то не ожидайте, что модуль сохранит 100%, т.к. сохранится именно то количество временни, которое за время существования запроса было выделено именно на этот процесс. «На глазок» для вышеприведенного примера это число будет равно — 32%.
А вот показатель памяти собирается по другому принципу. Во время обработки запроса, демон каждые 10 миллисекунд производит замер использования памяти процессом обрабатывающим запрос и в конце сохраняет самое максимальное значение.
Показатель IO (read & write) отслеживается подобно CPU — производится замер прочитанных и записанных данных процесса в начале запроса и в конце запроса. Разница этих величин переводится в килобайты и сохраняется в базе. Т.е. фактически этот показатель отслеживает число записанных/прочитанных байт в течении существования запроса. Сразу скажу, что в качестве анализируемого источника используется показатель: /proc/[pid]/io — read_bytes, write_bytes, cancelled_write_bytes.
Вот он важный вопрос — куда сохранить собираемую статистику. Для упрощения этой головоломки в новой версии модуля встроена поддержка таких БД как: SQLite, MySQL, PostgreSQL, а так же экзотика — сохранение в файл логов. Теперь не нужно подстраиваться под модуль — он подстроится под вас. Для успешной работы модуля(не в режиме «Сохранение в лог») необходимо наличие на машине хотя бы одной из следующих библиотек:
- libsqlite3.so;
- libmysqlclient_r.so;
- libpq.so.
При сборке пакета наличие mysql-devel, sqlite-devel, postgresql-devel не требуется. Эти библиотеки подгрузятся динамически во время работы модуля. Точнее подгрузится нужная для выбранного режима библиотека.
Пример 1. Работа с SQLite. Самый простой вариант, база данных создается автоматически, таблица создается автоматически, нет необходимости в пользователях и прочее. Только одно очень важное замечание для тех кто уже использовал модуль версии 0.1: в старой базе и новой различаются структуры таблиц, поэтому для успешной работы старую базу лучше удалить. Т.к. cам модуль не пересоздает существующую таблицу.
Для работы с SQLite необходимо:
PerformanceDB /statistics/apache/perfdb
PerformanceLogType SQLite
Пример 2. Работа с MySQL. Более сложный вариант. Создайте базу данных, например, perf и пользователя perf с правами на эту базу:
mysql> create database perf;
mysql> CREATE USER 'perf'@'localhost' IDENTIFIED BY 'perf';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'perf'@'localhost' WITH GRANT OPTION;
таблицу модуль создаст сам. И теперь в настройках модуля:
PerformanceLogType MySQL
PerformanceDbUserName perf
PerformanceDBPassword perf
PerformanceDBName perf
И опять же очень важное замечание для тех кто уже использовал модуль версии 0.2 более ранних версий чем 0.2-8: в старой базе и новой различаются структуры таблиц, поэтому для успешной работы старую базу лучше удалить. Т.к. cам модуль не пересоздает существующую таблицу.
Пример 3. Работа с PostgreSQL. Более сложный вариант. Так же необходимо создать базу и пользователя для доступа:
postgres=# CREATE USER perf WITH PASSWORD 'perf';
postgres=# CREATE DATABASE perf;
postgres=# GRANT ALL PRIVILEGES ON DATABASE perf to perf;
в файле /var/lib/pgsql/data/pg_hba.conf
file /var/lib/pgsql/data/pg_hba.conf
local all all trust
host all all 0.0.0.0/0 trust
host all all : : : 1/128 trust
и наконец настройки модуля:
PerformanceLogType Postgres
PerformanceDbUserName perf
PerformanceDBPassword perf
PerformanceDBName perf
Пример 4. Работа с текстовым логом. В данном режиме не требуется никаких дополнительных библиотек. Достаточно приписать файл, куда будет консолидироваться статистика.
PerformanceLogType Log
PerformanceLog /statistics/apache/perf.log
По умолчанию данные в этот файл попадают в таком формате:
[%DATE%] from %HOST% (%URI%) script %SCRIPT%: cpu %CPU% (%CPUS%), memory %MEM% (%MEMMB%), execution time %EXCTIME%, IO: R — %BYTES_R% W — %BYTES_W%
что разворачивается в:
[2011-06-05 19:28:28] from example.com (/index.php) script /var/www/example.com/index.php: cpu 0.093897 (0.010000), memory 0.558202 (5.597656), execution time 10.298639, IO: R — 104.000000 W — 248.000000
[2011-06-05 19:28:39] from example.com (/index2.php) script /var/www/example.com/index2.php: cpu 0.000000 (0.000000), memory 0.558202 (5.597656), execution time 10.159158, IO: R — 0.000000 W — 0.000000
А сейчас более подробно. Для этого режима можно задать формат выводимой в лог строки. Для этого существуют предопределенные макроимена:
- %DATE% — преобразуется в дату начала запроса;
- %CPU% — использование CPU в процентах;
- %MEM% — использование памяти в процентах;
- %URI% — URI запроса
- %HOST% — имя виртуального хоста, к которому адресовался запрос;
- %SCRIPT% — имя скрипта;
- %EXCTIME% — длительность выполнения скрипта в секундах;
- %CPUS% — сколько секунд система потратило именно на этот процесс в секундах;
- %MEMMB% — использование памяти в мегабайтах;
- %BYTES_W% — килобайт записано;
- %BYTES_R% — килобайт прочитано;
- %% — вывести знак процента.
К примеру: Hello from %HOST% I use %CPU% %% cpu today %DATE% развернется в Hello from example.com I use 0.23 % cpu today 2011-06-05 19:28:28
Такой лог может быть глобальным, а также и для каждого виртуального хоста свой. Также как и каждый хост может иметь свой уникальный формат вывода в лог.
Еще одной важной особенностью является то, что в этом режиме не доступен экран анализа накопленных данных. Т.е. не отрабатывают хендлеры модуля. В этом случае утилиты анализирующие логи нужно писать отдельно.
В версии 0.4 поменялся формат таблицы данных. Для корректного функционирования 0.4 версии старую таблицу необходимо модифицировать:
:::sql
SQLITE: ALTER TABLE performance ADD hostnm CHAR(32);
MySQL: ALTER TABLE performance ADD hostnm CHAR(32);
PostreSQL: ALTER TABLE performance ADD hostnm CHAR(32);