Monitoring d'applications/environnements PHP: APM et Pinba

3,893 views
3,809 views

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,893
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Surveiller d'eventuellle erreur comportementale de l'application. Surveiller au niveau des performances, afin de prevoir d'eventuel probleme
  • Page de demo avec E_NOTICE et autre, Display avec tail
  • Tail -f /var/log/php/error.log Page vide de apm.php Puis generation d'une page d'erreur Affichage de apm.php Recommecer avec mutilple erreur
  • Rappel, qu'est ce que APC, Xdebug, … Compatbilité totale avec le monde du LL
  • Compatbilité totale avec le monde du LL
  • L'extension PHP Pinba envoie un paquet UDP lors de la terminaison d'une requête qui contient des informations comme: hostname - gethostname() result request_count - number of requests served by this process server_name script_name document_size - size of the response body memory_peak - memory allocation peak request_time - time spent of processing the request ru_utime - resource usage (user) ru_stime - resource usage (system) timers - array of timers (optional) De la nature UDP, aucune connexion n'est réalisée, ce qui permet d'avoir aucun impacte de performance, mais des pertes de paquets pourraient se produire. De l'autre coté, le plugin MySQL Pinba écoute sur le port configuré pour récupérer les paquets et les décoder afin de les stocker dans ses pools d'enregistrements ainsi que de mettre à jour les index, les rapports de bases et rapports de tags si ils existent.
  • Raw data tables contain raw request data (surprise!). Please bear in mind that access to the raw data is relatively slow (the number of records might reach millions and there are NO indexes except for primary keys, so almost any operation requires full table scan). Reports were created in order to speed up the most frequent operations by aggregating data on-the-fly, when new request data arrives.
  • 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 ?

    ×