Skip to content

Instantly share code, notes, and snippets.

@dovg
Created September 23, 2011 13:48
Show Gist options
  • Select an option

  • Save dovg/1237368 to your computer and use it in GitHub Desktop.

Select an option

Save dovg/1237368 to your computer and use it in GitHub Desktop.
Как сказано на <a href="http://pinba.org/wiki/Main_Page">официальном сайте</a> -
<pre>
Pinba is a realtime monitoring/statistics server for PHP using MySQL as a read-only interface.
</pre>
И это действительно так. Она позволит вам в реальном времени получать статистику по работающему приложению, при этом не замедляя само приложение.
Что делать со статистикой - это уже ваше дело, например мы выводим ее в <a href="http://www.zabbix.com/">заббикс</a> и используем как для мониторинга стабильности (нет ошибок, мало число длинных запросов), так и для аналитики.
Удивительно что про это действительно замечательное изобретение не было еще ни одной статьи на хабре.
<img src="http://pinba.org/img/top-cnt-1d.png" />
<habracut text="Прочитать еще" />
Мне захотелось сделать что-нибудь хорошее для этого opensource проекта, а что может быть лучше известности ;)
<h2>Установка</h2>
Сама пинба состоит из двух частей - это php extention и engine (движок для mysql).
И то и другое поставляется в исходном коде. Сама установка достаточно тривиальна и хорошо описана в <a href="http://pinba.org/wiki/Manual:Installation">справочном руководстве</a>.
<h2>Прицип работы и конфигурация</h2>
Клиент (модуль)
На каждом сервере, где выполняется php вы устанавливаете модуль и добавляете в php.ini следующие строки:
<code>
; configuration for php pinba module
extension=pinba.so
pinba.enabled=1
pinba.server=192.168.1.42:3300 ; адрес и порт сервера пинбы
</code>
После этого каждый php скрипт, cli в том числе перед завершением работы будет посылать отчет по udp на указанный адрес и порт.
Вы не поверите, но больше делать ничего не надо, клиент настроен.
Сервер (движок mysql).
При первом прочтении я не мог понять зачем там mysql. Оказалось, что все просто - mysql - это интерфейс/точка входа в систему аналитики.
Это очень удобно, ведь под данную субд есть уже куча решений и все умет с ним работать.
Сервер pinba конфигурируется как движок mysql. Настроек не много и имена их очевидны:
<code>
[mysqld]
pinba_port=3300
pinba_address=192.168.1.205
pinba_stats_gathering_period=10000 #(microseconds)
pinba_stats_history=900 #(seconds)
pinba_temp_pool_size=10000
pinba_request_pool_size=1000000 #<max expected requests per second> * <stats_history> = <request pool size>
pinba_tag_report_timeout=-1 #Default value is -1, i.e. keep the data updated forever.
</code>
Думаю, комментировать тут нечего.
После того, как вы установите сервер и включите модуль на клиентах в пинбу (mysql) будут поступать данные о всех скриптах, которые были выполнены с этим модулем.
Данные о всех уникальных запросах попадут в табличку request. Так же вам доступны группировки:
report_by_hostname, report_by_hostname_and_script, report_by_hostname_and_server, report_by_hostname_server_and_script, report_by_script_name, report_by_server_and_script, report_by_server_name.
И вообще, это же mysql, так что:
<code>
show tables;
</code>
Резюмирую - не настраивая практически ничего мы получили систему аналитики всего php в продакшене.
Например, мы знаем суммарное число обращений (rps):
<pre>
mysql> select req_per_sec from report_by_server_name where server_name = 'ro.plus1.wapstart.ru';
+-------------+
| req_per_sec |
+-------------+
| 547.161 |
+-------------+
1 row in set (0.00 sec)
</pre>
То же самое, но по каждому хосту (серверу прода):
<pre>
mysql> select hostname, req_per_sec from report_by_hostname_and_server where server_name = 'ro.plus1.wapstart.ru';
+----------+-------------+
| hostname | req_per_sec |
+----------+-------------+
| a.... | 81.7561 |
| b.. | 59.0298 |
| c... | 90.8049 |
| f.... | 54.5014 |
| f.... | 54.5122 |
| h...... | 63.5664 |
| k... | 54.5068 |
| s.... | 90.8211 |
+----------+-------------+
8 rows in set (0.00 sec)
</pre>
И еще большую кучу различных отчетов. Все отчеты будут обновляться оперативно и содержать самые свежие данные.
Это не анализ логов apache, это профайлинг и мониторинг прямо на продакшене!
<h2>Таймеры и теги</h2>
Теперь о самом вкусном.
Вы можете <a href="http://pinba.org/wiki/Manual:PHP_extension#PHP_API">измерять</a> продолжительность какого-либо события у вас в скриптах и тэггировать его. Эти данные так же будут доступны для отчетов.
Например, если у вас есть длинная выборка пользователей из базы, то можно сделать так:
<code>
$t = pinba_timer_start(array("group"=>"mysql", "server"=>"dbs2", "operation"=>"select"));
//работа с базой
pinba_timer_stop($t);
</code>
Я добавил таймеры прямо в фреймворк, который мы используем, и сейчас в той или иной мере у меня измеряются все запросы к базам, memcached и т.д.
Отдельно отмечу, что эти данные легко доступны в интерфейсе сервера.
Их можно выбрать или из сырых данных - см таблицы report, timer, timertag, либо создать таблицы, в которых данные будут находится уже в аггрегированном состоянии.
Пример (из <a href="http://pinba.org/wiki/Manual:Usage_examples#Complex_reports">вики</a>):
<code>
CREATE TABLE `tag_info_group_server` (
`group_value` varchar(32) DEFAULT NULL,
`server_value` varchar(32) DEFAULT NULL,
`req_count` int(11) DEFAULT NULL,
`req_per_sec` float DEFAULT NULL,
`hit_count` int(11) DEFAULT NULL,
`hit_per_sec` float DEFAULT NULL,
`timer_value` float DEFAULT NULL
) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag2_info:group,server'
</code>
<b>NOTE</b>: Комментарий к таблице важен.
После создания, в эту таблицу будут автоматически (!) аггрегироваться данные по тегу group и серверу (server).
<h2>Стабильность</h2>
Мы используем ее в продакшене. Она работает ;)
<hr />
Я не ставлю целью сделать какое-то законченное описание pinba, тем более мне не хочется скопировать мануал.
Если вы используете php в продакшене, попробуйте pinba. Она действительно хороша!
Литература:
* <a href="http://pinba.org/wiki/Main_Page">wiki</a>
* <a href="http://groups.google.com/group/pinba-engine/post?hl=en">группа google</a>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment