Hébergement et scalabilité des applications PHP Olivier Duquesne & Christian Lefebvre (CLX / L'Autre Net / Atos Worldline)...
Introduction <ul><li>Une vision pluridisciplinaire </li><ul><li>La théorie avec le Club Linux Nord-Pas de Calais
La pratique avec L'Autre Net
L'expertise avec Atos Worldline </li></ul></ul>
Club Linux Nord-Pas de Calais <ul><li>Association loi 1901 créée en 1999
30 bénévoles et près de 300 sympathisants
La première de la région
Un GULL
Animation de réseau </li><ul><li>Les GULLs amis ou partenaires
Le relais AFUL
La convention avec l'UFJ </li></ul><li>Les projets de l'association </li></ul>
Logiciel Libre <ul><li>Liberté d'exécuter
Liberté d'étudier
Liberté de copier et redistribuer
Liberté de modifier
Plusieurs licences possibles </li><ul><li>GPL, BSD, LGPL, Cecill, Apache,  PHP </li></ul></ul>
Pourquoi PHP ? <ul><li>Logiciel Libre
Gratuit
Forte communauté d'utilisateurs et développeurs : stabilité et sécurité
Facile à comprendre et utiliser
Portable : Apache / ligthttpd / IIs / iPlanet / ... / Linux / Windows / HP-UX / BSD / ...
Mode web ou CGI
Un standard du web ? </li></ul>
Comment ? <ul><li>Chez soit : LAMP, EasyPHP
Chez un hébergeur &quot;gratuit&quot; : Free.fr , PagesPerso, ...
Chez un hébergeur &quot;associatif&quot; : L'Autre Net, TuxFamily, APINC, Marsnet, ...
Chez un hébergeur &quot;commercial&quot; : OVH, Nexen, Atos Worldline, AlterWay, ... </li></ul>
L'Autre Net <ul><li>Association loi 1901 crée en 2001
Suite à la fermeture d'Altern
Hébergeur Associatif Autogéré Non-Marchand
Bénévoles (root et collège solidaire)
Espace de liberté
Mutualisation de plateforme </li></ul>
AlternB <ul><li>En 2001 : un serveur 1U/PIII/500M : une centaine de comptes
100 Mo (web + mail + listes + bdd)
RedHat bricolée / Apache / PHP2 / Qmail / ...
Usine à gaz !! Temps de réponse déplorables, une affaire de geek
Un public novice et militant (associations en tous genres, pages perso) </li></ul>
AlternC (1) <ul><li>En 2011, L'Autre Net c'est 10 serveurs (biXeon ou v210) , 2 serveurs de fichiers, 1 Lan-to-Lan vers Gi...
1200 comptes, 2500 noms de domaines, des listes de diffusions, statistiques, mail, webmail, machines à la demande ...
Un transit de 5Mbs
Debian, Apache, PHP5, Mailman, Awstats, Postfix, Courier-*, vServer, OSPF, IPVS, .... </li></ul>
AlternC (2) <ul><li>Un outil simple pour </li><ul><li>les administrateurs (root)
les utilisateurs (bénévoles)
Prochain SlideShare
Chargement dans…5
×

Hébergement et scalabilité des applications PHP, par Olivier Duquesne et Christian Lefebvre

4 900 vues

Publié le

Présentation d'Olivier Duquesne et Christian Lefebvre pour le RDV AFUP Lille du 31 mai 2011 sur la montée en charge avec PHP

Publié dans : Technologie, Formation
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
4 900
Sur SlideShare
0
Issues des intégrations
0
Intégrations
26
Actions
Partages
0
Téléchargements
27
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Hébergement et scalabilité des applications PHP, par Olivier Duquesne et Christian Lefebvre

  1. 1. Hébergement et scalabilité des applications PHP Olivier Duquesne & Christian Lefebvre (CLX / L'Autre Net / Atos Worldline) [email_address]
  2. 2. Introduction <ul><li>Une vision pluridisciplinaire </li><ul><li>La théorie avec le Club Linux Nord-Pas de Calais
  3. 3. La pratique avec L'Autre Net
  4. 4. L'expertise avec Atos Worldline </li></ul></ul>
  5. 5. Club Linux Nord-Pas de Calais <ul><li>Association loi 1901 créée en 1999
  6. 6. 30 bénévoles et près de 300 sympathisants
  7. 7. La première de la région
  8. 8. Un GULL
  9. 9. Animation de réseau </li><ul><li>Les GULLs amis ou partenaires
  10. 10. Le relais AFUL
  11. 11. La convention avec l'UFJ </li></ul><li>Les projets de l'association </li></ul>
  12. 12. Logiciel Libre <ul><li>Liberté d'exécuter
  13. 13. Liberté d'étudier
  14. 14. Liberté de copier et redistribuer
  15. 15. Liberté de modifier
  16. 16. Plusieurs licences possibles </li><ul><li>GPL, BSD, LGPL, Cecill, Apache, PHP </li></ul></ul>
  17. 17. Pourquoi PHP ? <ul><li>Logiciel Libre
  18. 18. Gratuit
  19. 19. Forte communauté d'utilisateurs et développeurs : stabilité et sécurité
  20. 20. Facile à comprendre et utiliser
  21. 21. Portable : Apache / ligthttpd / IIs / iPlanet / ... / Linux / Windows / HP-UX / BSD / ...
  22. 22. Mode web ou CGI
  23. 23. Un standard du web ? </li></ul>
  24. 24. Comment ? <ul><li>Chez soit : LAMP, EasyPHP
  25. 25. Chez un hébergeur &quot;gratuit&quot; : Free.fr , PagesPerso, ...
  26. 26. Chez un hébergeur &quot;associatif&quot; : L'Autre Net, TuxFamily, APINC, Marsnet, ...
  27. 27. Chez un hébergeur &quot;commercial&quot; : OVH, Nexen, Atos Worldline, AlterWay, ... </li></ul>
  28. 28. L'Autre Net <ul><li>Association loi 1901 crée en 2001
  29. 29. Suite à la fermeture d'Altern
  30. 30. Hébergeur Associatif Autogéré Non-Marchand
  31. 31. Bénévoles (root et collège solidaire)
  32. 32. Espace de liberté
  33. 33. Mutualisation de plateforme </li></ul>
  34. 34. AlternB <ul><li>En 2001 : un serveur 1U/PIII/500M : une centaine de comptes
  35. 35. 100 Mo (web + mail + listes + bdd)
  36. 36. RedHat bricolée / Apache / PHP2 / Qmail / ...
  37. 37. Usine à gaz !! Temps de réponse déplorables, une affaire de geek
  38. 38. Un public novice et militant (associations en tous genres, pages perso) </li></ul>
  39. 39. AlternC (1) <ul><li>En 2011, L'Autre Net c'est 10 serveurs (biXeon ou v210) , 2 serveurs de fichiers, 1 Lan-to-Lan vers Gitoyen Fibre 1Gb, monitoring externe, accès distant ....
  40. 40. 1200 comptes, 2500 noms de domaines, des listes de diffusions, statistiques, mail, webmail, machines à la demande ...
  41. 41. Un transit de 5Mbs
  42. 42. Debian, Apache, PHP5, Mailman, Awstats, Postfix, Courier-*, vServer, OSPF, IPVS, .... </li></ul>
  43. 43. AlternC (2) <ul><li>Un outil simple pour </li><ul><li>les administrateurs (root)
  44. 44. les utilisateurs (bénévoles)
  45. 45. les usagers (membres, toujours aussi novices) </li></ul><li>Pour tout faire : DNS, BDD, Édition, Web, ...
  46. 46. Logiciel Libre maintenu par L'Autre Net, Globenet, Octopuce, Koumbit
  47. 47. Packagé (Debian), mais peu scalable .... </li></ul>
  48. 48. AlternC (3)
  49. 49. Sécuriser les données (1) <ul><li>Depuis PHP3, le cloisonnement des données est permis grâce au safe_mode </li><ul><li>contrainte pour l'utilisateur (de la nécessité de bien écrire)
  50. 50. contrainte pour l'administrateur (bien actualiser les répertoires autorisés lors de la création de comptes)
  51. 51. safe_mode_gid : chaque utilisateur AlternC a un GID unix pour cloisonner l'accès aux données et positionner des quotas disques </li></ul></ul>
  52. 52. Sécuriser les données (2) <ul><li>Plusieurs machines frontales (loadbalancing)
  53. 53. Un stockage unique (NFSv3) en RAID5
  54. 54. Sauvegardes incrémentales et complètes </li><ul><li>des données
  55. 55. des bases de données </li></ul><li>Protections des machines </li><ul><li>iptables, rootkit hunter, fail2ban, logwatch, ...
  56. 56. memory_limit & co </li></ul></ul>
  57. 57. Les difficultés <ul><li>Une instance apache : des milliers de vhosts
  58. 58. Un process PHP peut ralentir l'ensemble de la plateforme.
  59. 59. Les utilisateurs codent ce qu'ils veulent
  60. 60. La plupart du temps, ils n'y connaissent rien et récupèrent des applications toutes faites </li><ul><li>SPIP, Joomla, phpBB,Wordpress, ... </li></ul></ul>
  61. 61. Problèmes courants <ul><li>&quot;Oups, j'ai tout perdu&quot; => restauration
  62. 62. &quot;Je ne peux plus écrire&quot; => full / quota
  63. 63. &quot;ça marche plus&quot; => cache, DNS, restaure
  64. 64. &quot;ça rame&quot; => chez moi ça marche (tm) </li><ul><li>CPU ? RAM ? I/Owait ? In/OutRx ?
  65. 65. MaxServer Apache
  66. 66. Max Established Sockets
  67. 67. Slow Query </li></ul></ul>
  68. 68. Tuning Système (1) <ul><li>Tuning Apache </li><ul><li>Augmenter le nombre de threads apache : mode prefok : 1 thread par connexion
  69. 69. Attention, un thread apache+PHP arrive facilement à 50 Mo en RSS
  70. 70. Diminuer le keepalive et timeout (bonne idée si beaucoup de RAM)
  71. 71. Utilisation de mod_bandwith : quota BP </li></ul><li>Tuning PHP léger finalement ... </li></ul>
  72. 72. Tuning Système (2) <ul><li>Tuning OS </li><ul><li>Utilisation de eAccelerator abandonné (dégradation sur de nombreux SPIP)
  73. 73. Utilisation de memcached : problèmes de session (Joomla, Moodle) </li></ul></ul>
  74. 74. Réussites <ul><li>Aide de la communauté SPIP </li><ul><li>700 SPIP déployés, debug sur des pconnect() en 2006
  75. 75. hébergement de spip-contrib.net (et son départ transparent en 2009 ...)
  76. 76. contributions plugins SPIP-Mutu, SPIPTeX, SPIPOrtho </li></ul><li>Utilisation de memcached
  77. 77. Aides diverses : patch Drupal, Dokuwiki, Moodle </li></ul>
  78. 79. Atos Worldline <ul><li>Leader dans les transactions électroniques
  79. 80. Spécialisé dans les paiements électroniques, les eCS et les marchés financiers.
  80. 81. Un chiffre d’affaires de 867 millions d’euros, emploie plus de 5 400 personnes en Europe et en Inde et réalise plus de 15 Milliards de transactions par an. </li></ul>
  81. 82. Les chiffres en 2008 <ul><li>250 millions de SMS
  82. 83. 45 Mds d’emails échangés par 23 M bàl
  83. 84. 2 milliards de transactions d’acquisition
  84. 85. 21 millions d’opérations de carte de crédit
  85. 86. 100 millions de paiements internet
  86. 87. 36 millions de cartes de fidélité
  87. 88. 50 milliards de pages vues </li></ul>
  88. 89. Offres commerciales <ul><li>Offre d'hébergement web mutualisé </li><ul><li>en silo Front/Middle/Back
  89. 90. autour des technologies J2EE
  90. 91. framework issus des labos R&D </li></ul><li>Offre d'hébergement dédié </li><ul><li>à la demande : J2EE, PHP, Ruby, ...
  91. 92. en silo Front/Middle/Back (ou pas)
  92. 93. flexibilité </li></ul><li>Business Unit par métier </li></ul>
  93. 94. Scalabilité <ul><li>Un matériel homogène
  94. 95. Un OS homogène (Atos LFS) </li><ul><li>flexibilité - packagé
  95. 96. sécurité - expertise </li></ul><li>Des outils d'administration </li><ul><li>livtools - servicetools - referencetools </li></ul><li>Répartition de charge </li><ul><li>applicative, matérielle, silos clônables </li></ul></ul>
  96. 97. Cas concret : e-Commerce <ul><li>Une plateforme Magento
  97. 98. Serveur Web maîtrisé </li><ul><li>Apache 2.2.23 : le moins de modules possibles, mode prefork
  98. 99. PHP 5.2.5 : les options minimales, modules externalisés, sans debug </li></ul><li>Cluster BDD : </li><ul><li>MySQL : Heartbeat en mode failover </li></ul><li>État : 10 minutes de disponibilité en benchmark </li></ul>
  99. 100. Optimisations Système (Web) <ul><li>Pile TCP : tcp_keepalive_time et tcp_syncookie
  100. 101. Changement ioscheduler : [deadline] cfq
  101. 102. Déploiement de machines supplémentaires </li><ul><li>OpenQRM : clônage de machines Xen
  102. 103. Templates de configurations </li></ul><li>Mise en cache PHP : Alternative PHP Cache (APC) : cache opcode
  103. 104. Mise en cache SQL : memcached : 5 à 10% des hits en cache </li></ul>
  104. 105. Optimisations Système (HTTP) <ul><li>Worldline Booster : mise en cache HTTP </li><ul><li>datacenter à forte connectivité : latence à surveiller
  105. 106. Technologie propriétaire + xcache
  106. 107. Administration via un Web dédié (Tomcat) </li></ul><li>Varnish : mise en cache HTTP </li><ul><li>Macros en ESI
  107. 108. Administration via un Web dédié (Erlang)
  108. 109. Temps de réponse divisé par 3 ! </li></ul></ul>
  109. 110. Optimisations Système (NFS) <ul><li>Jumbo Frame (MTU=9000) sur client, serveur, switch
  110. 111. TCP, bg, hard, timeo=300 : garder la ligne
  111. 112. noatime : force la désactivation de l'accounting
  112. 113. sunrpc.tcp_slot_table_entries=128 : table de montage
  113. 114. rsize=32768, wsize=32768 : bits en read et write
  114. 115. actimeo=0 : désactivation du cache NFS
  115. 116. CONFIG_NFS_DIRECTIO=y (kernel) </li><ul><li>innodb_flush_logsat_trx_commit=1 (MySQL)
  116. 117. innodb_flush_methods = O_DIRECT (MySQL) </li></ul><li>minra = off (Data OnTapp) </li></ul>
  117. 118. Optimisations Base de Données <ul><li>Changement de version de MySQL </li><ul><li>5.0.46 au profit de 5.1.46 Enterprise
  118. 119. Atos est Gold Partner MySQL </li></ul><li>Répartition via Heartbeat2 </li><ul><li>Outil de livraison de configuration
  119. 120. Industrialisation, homogénéisation
  120. 121. Séparation écritures / lectures via Réplication </li></ul><li>Tuning MySQL </li><ul><li>Optimisations requêtes Magento
  121. 122. Optimisations query_cache_size
  122. 123. Compression : slave_compressed_protocol=1 </li></ul></ul>
  123. 124. Autre cas concret : Portail sportif <ul><li>But : refonte intégrale d'un site lié au sport
  124. 125. Refonte graphique + multilingue </li><ul><li>Revue de l'ergonomie du site d'admin
  125. 126. Dialogue avec le nouveau SI du client
  126. 127. Module de statistiques sportives </li></ul><li>Contrainte : tenir les pics de charge pendant les événements sportifs </li></ul>
  127. 128. Solution retenue <ul><li>Architecture LAMP
  128. 129. Framework Symfony 1.4
  129. 130. ORM Doctrine
  130. 131. Plusieurs plugins : </li><ul><li>Standards : Gestion des droits, I18N
  131. 132. Maison : Surcharge des données, traçabilité </li></ul><li>Pas mal de batchs (imports, prétraitements)
  132. 133. Cache applicatif (memcached) </li></ul>
  133. 134. Déroulement des développements <ul><li>Plusieurs centaines d'HJ
  134. 135. Pas mal de mouvements dans les specs
  135. 136. Quelques dérapages qui empêchent de bencher suffisamment tôt
  136. 137. L'idéal pour avoir de mauvaises surprises en fin de projet ... </li></ul>
  137. 138. Les ORM c'est cool <ul><li>On décrit ses données (via DBDesigner, en YML, directement en SQL ...)
  138. 139. Doctrine génère les classes de mapping et les tables SQL
  139. 140. Symfony génère les classes de CRUD et d'admin </li></ul>En théorie, y'a plus qu'à affiner les détails
  140. 141. Mais c'est gourmand <ul><li>84 tables et 91 « sous tables » (générées par les plugins)
  141. 142. 568 classes auto générées et 337 surcharges
  142. 143. 2Mo de code rien que pour le 'M' de MVC ... </li></ul>
  143. 144. Les ORM c'est cool (suite) Les classes générées emballent les accès aux données Doctrine::getTable('Bidule')->findOneByMachin($machin)- >getMaColonne() Mais ça masque toute la complexité : La 1ère version de la homepage générait plus de 1000 requêtes BDD ! Et de belles horreurs bien cachées : Doctrine::getTable('Bidule')->findByXyz(…)->getFirst() Le select retourne éventuellement des centaines de lignes, que doctrine parse pour instancier autant d'objets qu'il peuple un par un pour finalement attraper le premier et jeter tout le reste
  144. 145. Le CRUD généré c'est cool <ul><li>Pour chaque table, Symfony génère des classes de CRUD
  145. 146. Ce code contient des templates à tiroir, en quantité
  146. 147. Un sous-sous-template peut accéder à un champ « induit » qui entraîne une requête BDD </li></ul>
  147. 148. Mais ça fait des trucs louches <ul><li>L'I18N par exemple provoque une requête sur une sous table, pour chaque itération
  148. 149. On se retrouve avec 1+N requêtes au lieu d'une seule
  149. 150. Il faut donc adapter la config des « admin generators » pour forcer des « join » </li></ul>
  150. 151. PHP, ça rame <ul><li>Dès qu'il y a des algo un peu tordus, on explose les temps d'exécution
  151. 152. Le calcul des statistiques nécessite des calculs assez lourds, dans les « postSave » </li></ul>Solution en 2 étapes : <ul><li>Système « producteur/consommateur » pour « sortir » les calculs de l'admin
  152. 153. Recodage des algos en procédures stockées (sauvage, mais efficace) </li></ul>
  153. 154. Le cache c'est cool <ul><li>Le cache de template permet d'alléger énormément la charge
  154. 155. Les TTL permettent de gérer facilement le renouvellement des données cachées </li></ul>Mais pendant un live, il faut que les infos arrivent sur le site dès réception Donc décache explicite, mais le plus fin possible (si on décache trop large en pleine charge, on explose tout) Ça implique des règles très complexes
  155. 156. Memcached c'est cool <ul><li>Permet de stocker des éléments en cache
  156. 157. Tous les fronts peuvent accéder au même cache et le décache peut être déclenché de partout
  157. 158. On peut stocker des milliers d'éléments sans pertes de perfs
  158. 159. Mais le protocole ne permet pas de delete par pattern </li></ul>
  159. 160. Mais symfony réserve des surprises Alors comment symfony implémente la méthode removePattern()  ? Une entrée « meta » stocke la liste des clés de toutes les entrées (donc potentiellement des milliers) foreach ( $this ->getCacheInfo() as $key ) { if (preg_match( $regexp , $key )) { $this ->remove(substr( $key , strlen( $this ->getOption( 'prefix' )))); } } Et paf le php ...
  160. 161. Et maintenant, qu'est-ce qu'on fait ? <ul><li>Séparez en plugins qu'on active seulement dans les applis nécessaires (pour éviter de charger du code inutile)
  161. 162. Évitez de générer du code inutile (dans schema.yml ) symfony: { form: false, filter: false }
  162. 163. Testez et benchez dès le début, comptez les requêtes et analysez les pour détecter les appels cachés avant qu'ils se fondent dans la masse
  163. 164. Prenez en compte le cache dès le début
  164. 165. N'ayez confiance en personne, même pas dans les produits les plus réputés :-) </li></ul>
  165. 166. Quelques outils utiles <ul><li>MemCached, CouchDB et autres NoSql
  166. 167. Varnish (ESI notamment)
  167. 168. APC (pour l'opcode, mais aussi le cache local)
  168. 169. Procédures stockées (un curseur va plus vite qu'une boucle PHP)
  169. 170. Symfony Web Debug Toolbar (logs et détails sur les requêtes SQL)
  170. 171. netstat, ps, gdb … et autres outils de diagnostic car les soucis n'apparaissent souvent qu'en vraie charge
  171. 172. Jmeter et autres outils de bench
  172. 173. Xdebug (profiling) </li></ul>
  173. 174. Ressources <ul><li>Qui sommes nous ? </li><ul><li>Club Linux Nord-Pas de Calais : http://clx.asso.fr
  174. 175. L'Autre Net : http://lautre.net
  175. 176. Atos Worldline : http://www.atosworldline.fr </li></ul><li>Les outils </li><ul><li>Varnish : http://www.varnish-cache.org
  176. 177. Symfony : http://www.symfony-project.org
  177. 178. Doctrine : http://www.doctrine-project.org
  178. 179. Heartbeat : http://www.linux-ha.org </li></ul></ul>
  179. 180. Questions ? <ul><li>Olivier Duquesne : [email_address]
  180. 181. Christian Lefebvre : [email_address]
  181. 182. CLX : [email_address]
  182. 183. L'Autre Net : [email_address] </li></ul>

×