Monitoring d'applications/environnements PHP : APM et Pinba Davide Mendolia - Patrick Allaert FORUM PHP Paris 2009
Davide Mendolia <ul><li>http://davidemendolia.blogspot.com/
dmendolia@php.net ou @davideme (Twitter)
Développeur principal  APM .
Contributeur de  php-benchmark .
http://www.php-ci.net/
Travaille chez  Tuenti . </li></ul>
<ul><li>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!!! </li></ul>
Patrick Allaert <ul><li>http://patrickallaert.blogspot.com/
patrickallaert@php.net ou @patrick_allaert (Twitter)
Développeur principal  APM .
Travaille chez  eZ Systems  (eZ Publish, eZ Components).
Organisateur  PHPBenelux ( http://www.phpbenelux.eu/ ). </li></ul>
Patrick Allaert <ul><li>Démarre la programmation avec PHP 3.
Dix ans d'évangélisme sur le Logiciel Libre.
Contributions à : </li><ul><li>PHP (ext/ldap, QA : PHPT),
KDESvn (client Subversion pour KDE),
XOo°f (eXtensible Open Object Oriented Framework),
Tabellio (suite collaborative pour assemblée parlementaire). </li></ul></ul>
Monitoring : Définition ? <ul><li>Activité de surveillance et de mesure.
Domaines : </li><ul><li>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. </li></ul></ul>
Monitoring : Pourquoi ? <ul><li>Besoin en terme de disponibilité grandissant.
Souci d'économie.
Expérience utilisateur. </li></ul>
Monitoring : Pourquoi ? « Quand j'arrive sur la page d'accueil j'ai une page blanche […] » « Sérieux? Un moment, je regard...
Monitoring: Présentation <ul>Monitoring du P de LAMP. En particulier : <ul><li>gestion d'erreurs en PHP,
performance d'exécution. </li></ul></ul>
Quelles sont les solutions ? <ul><li>Actuelles : </li><ul><li>PHP;
Zend Platform. </li></ul><li>Nouveaux venus : </li><ul><li>APM (Alternative PHP Monitor);
Pinba. </li></ul></ul>
PHP : fonctions intégrées <ul><li>error_reporting;
Prochain SlideShare
Chargement dans…5
×

Monitoring d'applications/environnements PHP: APM et Pinba

4 234 vues

Publié le

Présentation de l'Altenative PHP Monitor (APM): une solution de monitoring d'erreurs et de Pinba: une solution de monitoring de performance.

Publié dans : Technologie
  • Soyez le premier à commenter

Monitoring d'applications/environnements PHP: APM et Pinba

  1. 1. Monitoring d'applications/environnements PHP : APM et Pinba Davide Mendolia - Patrick Allaert FORUM PHP Paris 2009
  2. 2. Davide Mendolia <ul><li>http://davidemendolia.blogspot.com/
  3. 3. dmendolia@php.net ou @davideme (Twitter)
  4. 4. Développeur principal APM .
  5. 5. Contributeur de php-benchmark .
  6. 6. http://www.php-ci.net/
  7. 7. Travaille chez Tuenti . </li></ul>
  8. 8. <ul><li>Réseau social , basé à Madrid.
  9. 9. Plus de 20 milliards de pages vues/mois.
  10. 10. Premier site web espagnol devant Google, Microsoft et Facebook (Comscore).
  11. 11. Environnement de travail international (15 différentes nationalités).
  12. 12. On recherche des développeurs!!! </li></ul>
  13. 13. Patrick Allaert <ul><li>http://patrickallaert.blogspot.com/
  14. 14. patrickallaert@php.net ou @patrick_allaert (Twitter)
  15. 15. Développeur principal APM .
  16. 16. Travaille chez eZ Systems (eZ Publish, eZ Components).
  17. 17. Organisateur PHPBenelux ( http://www.phpbenelux.eu/ ). </li></ul>
  18. 18. Patrick Allaert <ul><li>Démarre la programmation avec PHP 3.
  19. 19. Dix ans d'évangélisme sur le Logiciel Libre.
  20. 20. Contributions à : </li><ul><li>PHP (ext/ldap, QA : PHPT),
  21. 21. KDESvn (client Subversion pour KDE),
  22. 22. XOo°f (eXtensible Open Object Oriented Framework),
  23. 23. Tabellio (suite collaborative pour assemblée parlementaire). </li></ul></ul>
  24. 24. Monitoring : Définition ? <ul><li>Activité de surveillance et de mesure.
  25. 25. Domaines : </li><ul><li>l'état physique d'une machine;
  26. 26. la charge d'une machine;
  27. 27. disponibilité applicative;
  28. 28. les messages inscrits en logs systèmes;
  29. 29. les performances du réseau;
  30. 30. les attaques connues. </li></ul></ul>
  31. 31. Monitoring : Pourquoi ? <ul><li>Besoin en terme de disponibilité grandissant.
  32. 32. Souci d'économie.
  33. 33. Expérience utilisateur. </li></ul>
  34. 34. Monitoring : Pourquoi ? « Quand j'arrive sur la page d'accueil j'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 dans 5 minutes » « Ho, oui, vous avez raison!? »
  35. 35. Monitoring: Présentation <ul>Monitoring du P de LAMP. En particulier : <ul><li>gestion d'erreurs en PHP,
  36. 36. performance d'exécution. </li></ul></ul>
  37. 37. Quelles sont les solutions ? <ul><li>Actuelles : </li><ul><li>PHP;
  38. 38. Zend Platform. </li></ul><li>Nouveaux venus : </li><ul><li>APM (Alternative PHP Monitor);
  39. 39. Pinba. </li></ul></ul>
  40. 40. PHP : fonctions intégrées <ul><li>error_reporting;
  41. 41. display_errors;
  42. 42. error_log; </li><ul><li>fichier,
  43. 43. syslog, </li><ul><li>Windows => journal d'évènements; </li></ul></ul><li>set_error_handler(). </li></ul>
  44. 44. Zend Platform <ul>Solution commerciale tout-en-un de Zend. Comprend : <ul><li>monitoring;
  45. 45. performance;
  46. 46. haute disponibilité;
  47. 47. … </li></ul></ul>
  48. 48. APM <ul><li>A lternative P HP M onitor.
  49. 49. http://code.google.com/p/peclapm/
  50. 50. @php_apm (Twitter)
  51. 51. Liste de diffusion : [email_address]
  52. 52. Dédié au monitoring d'erreurs.
  53. 53. Naissance en octobre 2008. </li></ul>
  54. 54. Démo APM !
  55. 55. Pourquoi ? <ul><li>LAMP + APC + Xdebug
  56. 56. Brique manquante dans le paysage du logiciel libre.
  57. 57. Problèmes de performance indirectement lié à la Zend Platform, besoin d'une solution à l'impact minimum. </li></ul>+ APM (LAMPAXA)
  58. 58. Architecture
  59. 59. Base de données event id INTEGER ts TEXT type INTEGER file TEXT line INTEGER message TEXT backtrace TEXT slow_request id INTEGER ts TEXT duration FLOAT file TEXT
  60. 60. Fonctions PHP <ul><li>void apm_get_events (void) </li><ul><li>Imprime une table HTML remplie des évènements enregistrés dans la base de données en ordre inverse. </li></ul><li>void apm_get_slow_requests (void) </li><ul><li>Imprime une table HTML remplie des requêtes lentes enregistrées dans la base de données en ordre inverse. </li></ul></ul>
  61. 61. Futur <ul><li>Déclencheurs : </li><ul><li>SNMP;
  62. 62. courrier électronique;
  63. 63. commande paramétrée. </li></ul><li>Backends alternatifs à SQLite : </li><ul><li>MySQL;
  64. 64. Memcache;
  65. 65. Tokyo Tyrant. </li></ul></ul>
  66. 66. Appel à contribution
  67. 67. Pinba <ul><li>P HP i s n ot a b ottleneck a nymore.
  68. 68. http://pinba.org/
  69. 69. Liste de diffusion : [email_address] .
  70. 70. Dédié au monitoring de performance en temps réel.
  71. 71. Naissance en 2009. </li></ul>
  72. 72. Pourquoi ? <ul><li>LAMP + APC + Xdebug + APM
  73. 73. LAMPAXAP
  74. 74. Brique manquante dans le paysage PHP.
  75. 75. Collecte de statistiques de performance dans un environnement de production. </li></ul>+ Pinba
  76. 76. Architecture
  77. 77. Démo Pinba !
  78. 78. Données envoyées <ul><li>string hostname – résultat de gethostname();
  79. 79. int request_count – numéro de la requête servie par le processus;
  80. 80. string server_name – $_SERVER[&quot;SERVER_NAME&quot;];
  81. 81. string script_name – $_SERVER[&quot;SCRIPT_NAME&quot;];
  82. 82. int document_size – taille de la réponse;
  83. 83. int memory_peak – pic d'allocation mémoire;
  84. 84. float request_time – temps passé à traiter la requête;
  85. 85. float ru_utime – utilisation de ressource (utilisateur);
  86. 86. float ru_stime – utilisation de ressource (système);
  87. 87. array timers – tableau de timers (optionnel). </li></ul>
  88. 88. Fonctions PHP <ul><li>resource pinba_timer_start (array tags[, array data]) </li><ul><li>Crée et démarre un nouveau timer. </li></ul><li>bool pinba_timer_stop (resource timer) </li><ul><li>Arrête un timer. </li></ul><li>bool pinba_timers_stop (void) </li><ul><li>Arrête tous les timers. </li></ul><li>bool pinba_script_name_set (string script_name) </li><ul><li>Défini un nom de script à la place de $_SERVER['SCRIPT_NAME'] utilisé par défaut. </li></ul></ul>
  89. 89. Fonctions PHP <ul><li>array pinba_timer_get_info (resource timer) </li><ul><li>Retourne les données liées à un timer.
  90. 90. Exemple:
  91. 91. array(4) { [&quot;value&quot;]=>float(0.0213) [&quot;tags&quot;]=>array(1) { [&quot;foo&quot;]=>string(3) &quot;bar&quot; } [&quot;started&quot;]=>bool(true) [&quot;data&quot;]=>NULL } </li></ul></ul>
  92. 92. Fonctions PHP <ul><li>array pinba_get_info (void) </li><ul><li>Retourne toutes les données liées à Pinba.
  93. 93. Exemple: array(9) { [&quot;mem_peak_usage&quot;]=> int(786432) [&quot;req_time&quot;]=> float(0.001529) [&quot;ru_utime&quot;]=> float(0) [&quot;ru_stime&quot;]=> float(0) [&quot;req_count&quot;]=> int(1) [&quot;doc_size&quot;]=> int(0) [&quot;server_name&quot;]=> string(7) &quot;unknown&quot; [&quot;script_name&quot;]=> string(1) &quot;-&quot; [&quot;timers&quot;]=> array(1) { [0]=> array(4) { [...] } } } </li></ul></ul>
  94. 94. Tables <ul>Le plugin Pinba fourni deux types de tables : <ul><li>tables de données brutes;
  95. 95. rapports. </li></ul></ul>
  96. 96. Tables de données brutes <ul><li>request  : </li><ul><li>enregistre toutes les données,
  97. 97. buffer circulaire d'une taille donnée; </li></ul><li>timer  : </li><ul><li>enregistre les données relatives aux timers; </li></ul><li>tag  : </li><ul><li>enregistre de manière unique les tags; </li></ul><li>timertag  : </li><ul><li>enregistre l'association entre tags et timers. </li></ul></ul>
  98. 98. Rapports <ul><li>info;
  99. 99. report_by_script_name;
  100. 100. report_by_server_name;
  101. 101. report_by_hostname;
  102. 102. report_by_server_and_script;
  103. 103. report_by_hostname_and_script;
  104. 104. report_by_hostname_and_server;
  105. 105. report_by_hostname_server_and_script. </li></ul>
  106. 106. Champs des rapports <ul><li>req_count;
  107. 107. req_per_sec;
  108. 108. req_time_total;
  109. 109. req_time_percent;
  110. 110. req_time_per_sec;
  111. 111. ru_utime_total;
  112. 112. ru_utime_percent;
  113. 113. ru_utime_per_sec; </li></ul><ul><li>ru_stime_total;
  114. 114. ru_stime_percent;
  115. 115. ru_stime_per_sec;
  116. 116. traffic_total;
  117. 117. traffic_percent;
  118. 118. traffic_per_sec. </li></ul>
  119. 119. Rapports de tag(s) <ul>Deux types de rapports : <ul><li>« tag info »;
  120. 120. « tag report ». </li></ul>Chacun d'eux étant disponibles en deux versions : <ul><li>pour 1 tag;
  121. 121. pour 2 tags. </li></ul></ul>
  122. 122. 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'
  123. 123. 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'
  124. 124. 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'
  125. 125. 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'
  126. 126. Performance <ul><li>Overhead +/- 2 µs/requête sur un ordinateur commun;
  127. 127. invariable de la disponibilité de MySQL (rappel: protocole UDP). </li></ul>
  128. 128. Crédits <ul><li>Andrei Nigmatulin - initial design and first implementation.
  129. 129. Alexey Rybak - design, ideas and lots of (useful) critics.
  130. 130. Special thanks to Sergey Frolovichev.
  131. 131. Current implementation is done by Antony Dovgal. </li></ul>
  132. 132. Questions ? Suggestions ?

×