Created
September 23, 2011 13:48
-
-
Save dovg/1237368 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Как сказано на <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