Monitoring d'applications/environnements PHP : APM et Pinba
description
Transcript of Monitoring d'applications/environnements PHP : APM et Pinba
{
Monitoring d'applications/environnements PHP :
APM et Pinba
Davide Mendolia - Patrick Allaert
FORUM PHP Paris 2009
{ Davide Mendolia
● http://davidemendolia.blogspot.com/● [email protected] ou
@davideme (Twitter)● Développeur principal APM.● Contributeur de php-benchmark.● http://www.php-ci.net/● Travaille chez Tuenti.
{● Réseau social, basé à Madrid.● Plus de 20 milliards de pages vues/mois.● Premier site web espagnol devant Google,
Microsoft et Facebook (Comscore).● Environnement de travail international
(15 différentes nationalités).● On recherche des développeurs!!!
{ Patrick Allaert
● http://patrickallaert.blogspot.com/● [email protected] ou
@patrick_allaert (Twitter)● Développeur principal APM.● Travaille chez eZ Systems (eZ Publish,
eZ Components).● Organisateur PHPBenelux
(http://www.phpbenelux.eu/).
{ Patrick Allaert
● Démarre la programmation avec PHP 3.
● Dix ans d'évangélisme sur le Logiciel Libre.
● Contributions à :
● PHP (ext/ldap, QA : PHPT),● KDESvn (client Subversion pour KDE),● XOo°f (eXtensible Open Object
Oriented Framework),● Tabellio (suite collaborative pour
assemblée parlementaire).
{Monitoring : Définition ?
● Activité de surveillance et de mesure.● Domaines :
● l'état physique d'une machine;● la charge d'une machine;● disponibilité applicative;● les messages inscrits en logs systèmes;● les performances du réseau;● les attaques connues.
{ Monitoring : Pourquoi ?
● Besoin en terme de disponibilité grandissant.
● Souci d'économie.● Expérience utilisateur.
{ Monitoring : Pourquoi ?
« Quand j'arrive sur la page d'accueilj'ai une page blanche […] »
« Sérieux? Un moment, je regarde […] »
« Nous sommes au courant du problème,nos ingénieurs ont trouvés la solution.Tout sera rentré dans l'ordre dans5 minutes »
« Ho, oui, vous avez raison!? »
{Monitoring: Présentation
Monitoring du P de LAMP.
En particulier :● gestion d'erreurs en PHP,● performance d'exécution.
{Quelles sont les solutions ?
● Actuelles :● PHP;● Zend Platform.
● Nouveaux venus :● APM (Alternative PHP Monitor);● Pinba.
{PHP : fonctions intégrées
● error_reporting;● display_errors;● error_log;
● fichier,● syslog,
– Windows => journal d'évènements;
● set_error_handler().
{ Zend Platform
Solution commerciale tout-en-un de Zend.
Comprend :● monitoring;● performance;● haute disponibilité;● …
{ APM
● Alternative PHP Monitor.● http://code.google.com/p/peclapm/● @php_apm (Twitter)● Liste de diffusion :
[email protected]● Dédié au monitoring d'erreurs.● Naissance en septembre-octobre 2008.
{
Démo APM !
{ Pourquoi ?
● LAMP + APC + Xdebug● Brique manquante dans le paysage du
logiciel libre.● Problèmes de performance indirectement
lié à la Zend Platform, besoin d'une solution à l'impact minimum.
+ APM (LAMPAXA)
{ Architecture
{ Base de données
eventid INTEGER
ts TEXTtype INTEGER
file TEXTline INTEGER
message TEXT
backtrace TEXT
slow_requestid INTEGER
ts TEXTduration FLOAT
file TEXT
{ Fonctions PHP
● void apm_get_events(void)
Imprime une table HTML remplie des évènements enregistrés dans la base de données en ordre inverse.
● void apm_get_slow_requests(void)
Imprime une table HTML remplie des requêtes lentes enregistrées dans la base de données en ordre inverse.
{ Futur
● Déclencheurs :● SNMP;● courrier électronique;● commande paramétrée.
● Backends alternatifs à SQLite :● MySQL;● Memcache;● Tokyo Tyrant.
{ Appel à contribution
{ Pinba
● PHP is not a bottleneck anymore.● http://pinba.org/● Liste de diffusion :
[email protected].● Dédié au monitoring de performance en
temps réel.● Naissance en 2009.
{ Pourquoi ?
● LAMP + APC + Xdebug + APM● LAMPAXAP● Brique manquante dans le paysage PHP.● Collecte de statistiques de performance
dans un environnement de production.
+ Pinba
{ Architecture
{
Démo Pinba « par défaut » !
{ Données envoyées
● string hostname – résultat de gethostname();
● int request_count – numéro de la requête servie par le processus;
● string server_name – $_SERVER["SERVER_NAME"];
● string script_name – $_SERVER["SCRIPT_NAME"];
● int document_size – taille de la réponse;
● int memory_peak – pic d'allocation mémoire;
● float request_time – temps passé à traiter la requête;
● float ru_utime – utilisation de ressource (utilisateur);
● float ru_stime – utilisation de ressource (système);
● array timers – tableau de timers (optionnel).
{
Démo Pinba « timers » !
{ Fonctions PHP
● resource pinba_timer_start(array tags[, array data])
Crée et démarre un nouveau timer.
● bool pinba_timer_stop(resource timer)
Arrête un timer.
● bool pinba_timers_stop(void)
Arrête tous les timers.
● bool pinba_script_name_set(string script_name)
Défini un nom de script à la place de $_SERVER['SCRIPT_NAME'] utilisé par défaut.
{ Fonctions PHP
● array pinba_timer_get_info(resource timer)
Retourne les données liées à un timer.
Exemple:
array(4) { ["value"]=>float(0.0213) ["tags"]=>array(1) { ["foo"]=>string(3) "bar" } ["started"]=>bool(true) ["data"]=>NULL}
{ Fonctions PHP
● array pinba_get_info(void)
Retourne toutes les données liées à Pinba.
Exemple:array(9) { ["mem_peak_usage"]=> int(786432) ["req_time"]=> float(0.001529) ["ru_utime"]=> float(0) ["ru_stime"]=> float(0) ["req_count"]=> int(1) ["doc_size"]=> int(0) ["server_name"]=> string(7) "unknown" ["script_name"]=> string(1) "-" ["timers"]=> array(1) { [0]=> array(4) { [...] } }}
{ Tables
Le plugin Pinba fourni deux types de tables :● tables de données brutes;● rapports.
{Tables de données brutes
● request :● enregistre toutes les données,● buffer circulaire d'une taille donnée;
● timer :● enregistre les données relatives aux timers;
● tag :● enregistre de manière unique les tags;
● timertag :● enregistre l'association entre tags et timers.
{ Rapports
● info;
● report_by_script_name;● report_by_server_name;
● report_by_hostname;● report_by_server_and_script;
● report_by_hostname_and_script;
● report_by_hostname_and_server;● report_by_hostname_server_and_script.
{ Champs des rapports
● req_count;
● req_per_sec;● req_time_total;
● req_time_percent;● req_time_per_sec;
● ru_utime_total;
● ru_utime_percent;● ru_utime_per_sec;
● ru_stime_total;
● ru_stime_percent;● ru_stime_per_sec;
● traffic_total;● traffic_percent;
● traffic_per_sec.
{ Rapports des tag(s)
Deux types de rapports :● « tag info »;● « tag report ».
Chacun d'eux étant disponibles en deux versions :● pour 1 tag;● pour 2 tags.
{ Tag info pour 1 tag
Données des timers regroupées par la valeur d'un tag spécifié.
CREATE TABLE `tag_info_foo` ( `tag_value` varchar(32) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `timer_value` float DEFAULT NULL) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag_info:foo'
{ Tag info pour 2 tags
Données des timers regroupées par la valeur de deux tags spécifiés.
CREATE TABLE `tag_info_foo_bar` ( `foo_value` varchar(32) DEFAULT NULL, `bar_value` varchar(32) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `timer_value` float DEFAULT NULL) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag2_info:foo,bar'
{ Tag report pour 1 tag
Données des timers regroupées par script et par la valeur d'un tag spécifié.
CREATE TABLE `tag_report_foo` ( `script_name` varchar(128) DEFAULT NULL, `tag_value` varchar(32) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `timer_value` float DEFAULT NULL) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag_report:foo'
{ Tag report pour 2 tags
Données des timers regroupées par script et par la valeur de deux tags spécifiés.
CREATE TABLE `tag_report_foo_bar` ( `script_name` varchar(128) DEFAULT NULL, `tag1_value` varchar(32) DEFAULT NULL, `tag2_value` varchar(32) DEFAULT NULL, `req_count` int(11) DEFAULT NULL, `hit_count` int(11) DEFAULT NULL, `timer_value` float DEFAULT NULL) ENGINE=PINBA DEFAULT CHARSET=latin1 COMMENT='tag2_report:foo,bar'
{ Performance
● Overhead +/- 2 µs/requête sur un portable;
● invariable de la disponibilité de MySQL (rappel: protocole UDP).
{ Crédits
● Andrei Nigmatulin - initial design and first implementation.
● Alexey Rybak - design, ideas and lots of (useful) critics.
● Special thanks to Sergey Frolovichev.● Current implementation is done by
Antony Dovgal.
{
Questions ?