Je suis développeur Java. L'application fonctionne parfaitement ou presque sur mon laptop. Je suis le seul utilisateur et ma base est quasiment vide... La campagne de tests de charge et ou la mise en prod révèlent un bilan alarmant: le projet ne tient pas ses objectifs en terme de performance et de scalabilité. La consommation mémoire et les temps de traitements dévissent complètement.
C'est l'horreur. Je ne sais pas par où prendre le problème. Est-ce le moment de mettre à jour mon CV?
Réveillez-vous de ce cauchemar! Je vous propose dans cette session de passer en revue les signes vitaux que la JVM met à notre disposition, comment les interpréter et de quelle façon il peuvent nous guider pour résoudre les problèmes de lenteur ou de scalabilité.
Monitoring applicatif : Pourquoi et comment ?Kenny Dits
Vous êtes développeur, chef de projet technique ou même responsable et vous souhaitez avoir de la visibilité sur le fonctionnement de vos applicatifs, ou sur la plateforme sur laquelle ils sont hébergés ?
Nous étudierons comment, grâce à des outils simples (StatD / Graphite / Log BDD) et nos expériences chez M6Web, mettre en place un monitoring applicatif ultra complet.
Ce monitoring vous permettra de retrouver la vue sur vos projets, pour mieux anticiper la charge, detecter la root cause en cas d'incident et connaitre l'état de chacun de vos services ...
Devoxx: Tribulation d'un développeur sur le CloudTugdual Grall
Comme beaucoup de développeurs une grande partie de mon temps libre est utilisé pour découvrir de nouvelles technologies et développer des applications avec celles-ci.
J'ai donc choisi de découvrir le développement d'application Java sur le cloud, avec Google AppEngine, pour créer le site http://www.resultri.com qui permet de gérer les resultats de triathlon (mon autre passion).
Développer cette application est une aventure interessante que je partage avec vous durant ce BOF:
découverte de GAE et des outils de developpement
les "surprises" du NoSQL, surtout pour un cerveau "cablé relationnel comme le mien"
hmmm tout n'est pas gratuit?
les quelques trucs à savoir : l'importance de memcache, utilisation de CloudSQL, les batchs....
Monitoring applicatif : Pourquoi et comment ?Kenny Dits
Vous êtes développeur, chef de projet technique ou même responsable et vous souhaitez avoir de la visibilité sur le fonctionnement de vos applicatifs, ou sur la plateforme sur laquelle ils sont hébergés ?
Nous étudierons comment, grâce à des outils simples (StatD / Graphite / Log BDD) et nos expériences chez M6Web, mettre en place un monitoring applicatif ultra complet.
Ce monitoring vous permettra de retrouver la vue sur vos projets, pour mieux anticiper la charge, detecter la root cause en cas d'incident et connaitre l'état de chacun de vos services ...
Devoxx: Tribulation d'un développeur sur le CloudTugdual Grall
Comme beaucoup de développeurs une grande partie de mon temps libre est utilisé pour découvrir de nouvelles technologies et développer des applications avec celles-ci.
J'ai donc choisi de découvrir le développement d'application Java sur le cloud, avec Google AppEngine, pour créer le site http://www.resultri.com qui permet de gérer les resultats de triathlon (mon autre passion).
Développer cette application est une aventure interessante que je partage avec vous durant ce BOF:
découverte de GAE et des outils de developpement
les "surprises" du NoSQL, surtout pour un cerveau "cablé relationnel comme le mien"
hmmm tout n'est pas gratuit?
les quelques trucs à savoir : l'importance de memcache, utilisation de CloudSQL, les batchs....
Introduction au langage Go, avec comparaisons à Java
Présentation donnée dans différents meetups et conférences en 2015 et 2016.
Sources : https://github.com/swallez/golang-talks/
Stockage et analyse temps réel d'événements avec Riak chez Booking.comDamien Krotkine
Chez Booking.com, un flux constant d'événements provient des différents systèmes et applications internes. Ces "events" sont des données critiques, et doivent être stockés pour être analysés en temps réel, ou bien sur du moyen et long terme. Ces données sont très peu structurées et de nature changeante, rendant difficile l'utilisation d'outils standards d'analyse.
Cette présentation montre comment fut construit un système de stockage complet avec analyse temps-réel, basé sur Riak.
Riak est une base de donnée NoSQL distribuée hybride très robuste et rapide.
Les points abordés seront: sérialisation et aggrégation des données, la configuration de Riak, les solutions pour diminuer la consommation de bande passante du cluster, l'implémentation de l'analyse temps-réel grace aux fonctions avancées de Riak: MapReduce, Secondary Indexes, commit-hooks.
Slides de la présentation "Cassandra Java Driver" à l'Ippevent du 20 juin 2013
http://blog.ippon.fr/2013/06/03/ippevent-utiliser-les-nouvelles-apis-cassandra-le-2-juin-2013/
Présentation sur Ajax dans le cadre du cours combiné GTI780 / MTI780, Sujets spéciaux en TI, donné par Claude Coulombe, à l\'Ecole de technologie supérieure, Montréal, Automne 2008
Ogury est la plateforme de data mobile qui permet d’accéder aux données comportementales des profils de plus de 400 millions de mobinautes répartis dans plus de 120 pays.
Une plateforme micro-services c’est cool et c’est à la mode … mais il y a aussi le revers de la médaille ! L’augmentation du traffic inter-services peut dégrader vos temps de réponses car les connexions HTTP sont lentes.
Cependant des solutions existent pour optimiser le trafic réseau, durant cette session, David et Carles vous parleront de la solution qu’ils ont expérimentée : gRPC.
David Caramelo, Développeur Craftsman passionné depuis 12 ans, actuellement Tech Lead full stack chez Ogury. David s'est forgé son expérience essentiellement dans des startups parisiennes comme Viadeo ou Ogury et dans des cabinets conseil IT comme Xebia.
Carles Sistaré, Architecte-Développeur dans les clouds, actuellement Tech Lead de la team Delivery et co-fondateur d’Ogury. Carles a évolué dans le monde de la AdTech en passant par Ad4Screen et en tant qu’amateur de l’open-source en tant que commiteur Node-Kafka et créateur du module grpc-promise.
Nouvelle application, la décision de partir sur Node.js est prise. L'application commence petite puis le nombre de features et de développeurs augmentent. Les 1ers refactoring cossus arrivent et ne se passent pas vraiment comme prévu pourtant nous avons 100% de coverage… Est ce lié au manque de typage de JS ? Est ce que TypeScript aurait évité ça ? Ou finalement est ce que c'est notre façon d'écrire notre code (et les tests) qu'il faut remettre en cause ?
Après quelques refactoring et bugfix l'application part en prod. Les utilisateurs commencent à remonter quelques soucis, en regardant les logs on prend peur, très difficile de s'y retrouver… Venant du monde Java on est surpris par le manque de maturité des frameworks et librairies Node.js, notamment au niveau de la gestion des logs et des erreurs.
Toutes ces (mes)aventures nous ont permis de prendre du recul sur le développement avec JS, nous vous proposons un retour d'expérience sur cette odyssée qui est toujours en cours.
Introduction au langage Go, avec comparaisons à Java
Présentation donnée dans différents meetups et conférences en 2015 et 2016.
Sources : https://github.com/swallez/golang-talks/
Stockage et analyse temps réel d'événements avec Riak chez Booking.comDamien Krotkine
Chez Booking.com, un flux constant d'événements provient des différents systèmes et applications internes. Ces "events" sont des données critiques, et doivent être stockés pour être analysés en temps réel, ou bien sur du moyen et long terme. Ces données sont très peu structurées et de nature changeante, rendant difficile l'utilisation d'outils standards d'analyse.
Cette présentation montre comment fut construit un système de stockage complet avec analyse temps-réel, basé sur Riak.
Riak est une base de donnée NoSQL distribuée hybride très robuste et rapide.
Les points abordés seront: sérialisation et aggrégation des données, la configuration de Riak, les solutions pour diminuer la consommation de bande passante du cluster, l'implémentation de l'analyse temps-réel grace aux fonctions avancées de Riak: MapReduce, Secondary Indexes, commit-hooks.
Slides de la présentation "Cassandra Java Driver" à l'Ippevent du 20 juin 2013
http://blog.ippon.fr/2013/06/03/ippevent-utiliser-les-nouvelles-apis-cassandra-le-2-juin-2013/
Présentation sur Ajax dans le cadre du cours combiné GTI780 / MTI780, Sujets spéciaux en TI, donné par Claude Coulombe, à l\'Ecole de technologie supérieure, Montréal, Automne 2008
Ogury est la plateforme de data mobile qui permet d’accéder aux données comportementales des profils de plus de 400 millions de mobinautes répartis dans plus de 120 pays.
Une plateforme micro-services c’est cool et c’est à la mode … mais il y a aussi le revers de la médaille ! L’augmentation du traffic inter-services peut dégrader vos temps de réponses car les connexions HTTP sont lentes.
Cependant des solutions existent pour optimiser le trafic réseau, durant cette session, David et Carles vous parleront de la solution qu’ils ont expérimentée : gRPC.
David Caramelo, Développeur Craftsman passionné depuis 12 ans, actuellement Tech Lead full stack chez Ogury. David s'est forgé son expérience essentiellement dans des startups parisiennes comme Viadeo ou Ogury et dans des cabinets conseil IT comme Xebia.
Carles Sistaré, Architecte-Développeur dans les clouds, actuellement Tech Lead de la team Delivery et co-fondateur d’Ogury. Carles a évolué dans le monde de la AdTech en passant par Ad4Screen et en tant qu’amateur de l’open-source en tant que commiteur Node-Kafka et créateur du module grpc-promise.
Nouvelle application, la décision de partir sur Node.js est prise. L'application commence petite puis le nombre de features et de développeurs augmentent. Les 1ers refactoring cossus arrivent et ne se passent pas vraiment comme prévu pourtant nous avons 100% de coverage… Est ce lié au manque de typage de JS ? Est ce que TypeScript aurait évité ça ? Ou finalement est ce que c'est notre façon d'écrire notre code (et les tests) qu'il faut remettre en cause ?
Après quelques refactoring et bugfix l'application part en prod. Les utilisateurs commencent à remonter quelques soucis, en regardant les logs on prend peur, très difficile de s'y retrouver… Venant du monde Java on est surpris par le manque de maturité des frameworks et librairies Node.js, notamment au niveau de la gestion des logs et des erreurs.
Toutes ces (mes)aventures nous ont permis de prendre du recul sur le développement avec JS, nous vous proposons un retour d'expérience sur cette odyssée qui est toujours en cours.
L'ORM de Django est particulièrement efficace, il permet au développeur de complètement abstraire la couche de stockage de données au point de pouvoir utiliser le même code avec SQLite, PostgreSQL ou d'autres bases plus exotiques encore. Lorsque les problèmes de performance surviennent faire le chemin inverse depuis la base vers le code devient un véritable chemin de croix. On verra dans cette présentation comment se faciliter la vie avec quelques outils et méthodes.
Codedarmor 2012 - 06/03 - HTML5, CSS3 et Javascriptcodedarmor
Le web, nouvelle définition : les possibilités étendues de HTML5 marquent un tournant dans le développement de sites et d'applications web riches. Lors de cette soirée, nous ferons une revue des possibilités offertes par HTML5, CSS3 et Javascript, des applications mobiles aux jeux vidéo en passant par la diffusion de médias audio et vidéo.
Présenté par Benjamin Anseaume de Sushee.fr et Erwan Hesry
Methodologie et outils d optimisation php mysqlCodizy
Méthodologie et outils d'optimisation PHP / MySQL lors des 3 phases du cycle de vie de vos applications :
1- Développement,
2- Mise en production,
3- Post Production
Pour toute information concernant Codizy :
@: http://www.codizy.com
Talk sur la "Performance Web : Enjeux, techniques et méthodologie" pour @RennesJS
Rappel du programme :
"Après la découverte de quelques success stories sur la performance web - des éléments pour se convaincre et savoir convaincre de l'importance de la webperf - nous aborderons les techniques élémentaires pour mettre vos pages web au régime (compression, optimisation des images, politique de cache, etc).
Ce sera aussi l'occasion d'aborder HTTP/2 : les bonnes pratiques de performance ne sont peut être plus celles que vous croyez et vos habitudes vont devoir changer, nous verrons pourquoi !
Nous n'oublierons pas d'évoquer les différents indicateurs de performance (speedindex, start render, etc), et il est fort possible que je m'égare à l'occasion sur d'autres outils de qualité front-end, comme la Content Security Policy...
En conclusion, on parlera de budget. Pas celui de la soirée, mais du budget de performance, à appliquer sur vos projets, pour créer une véritable culture de la performance web dans votre équipe !"
Agenda :
Les enjeux de la performance d'un site Web
Les différents éléments de performance d'un site Web
Infrastructure, architecture technique, tuning, architecture applicative, WebPerf
L'obsession de la mesure
Les outils
Les quickwins
Caches, upscaling, outscaling, sharding
La démarche de test de charge
Méthodologie, outils, types de test, données de test
La démarche PDCA
Intégrer les tests de charge au cycle de développement
Environnement éphémère
Oxalide MorningTech #2 - Démarche de performance
2ème MorningTech @Oxalide, animé par Adrien Le Priol (@Priolix) et Ludovic Piot (@lpiot), le 28 février 2017.
Une vue d'ensemble sur la démarche et les outils pour aborder et maîtriser la performance de son site Web.
En 2012, Amazon publiait une étude indiquant que chaque seconde de performance perdue sur son site de commerce lui coûtait $1.6 milliards de chiffre d'affaire.
Par delà ce chiffre colossal avancé par le géant du Web, il est une réalité business : plus un site est lent, et moins les utilisateurs sont enclin à naviguer dessus. Les smartphones et le SoLoMo exacerbent cette réalité avec encore plus depuis 10 ans maintenant.
Sur le terrain, l'architecture technique des sites Web, de plus en plus complexe, rendent ses performances impossibles à prédire : complexité des développements applicatifs, multitude des composants impliqués dans l'architecture technique, recours à des services tiers (issus du SI de votre entreprise, ou de services tiers), big data, machine learning…
Une seule façon de prédire les performances : tester… en situation réelle.
A travers les différentes étapes d'une démarche d'optimisation des performances d'un site Web, les enjeux et les écueils d'une telle démarche vous seront détaillés.
Subject: Oxalide's MorningTech talk about an overview of how to deal with performance in a Web site.
Date: 28-feb-2017
Speakers: Adrien Le Priol (@Priolix, @Oxalide) and Ludovic Piot (@lpiot, @Oxalide)
Language: french
Lien SpeakerDeck : https://speakerdeck.com/lpiot/oxalide-morning-tech-number-2-demarche-performance
Lien SlideShare : https://www.slideshare.net/LudovicPiot/morning-tech-2-demarche-performance-slides
YouTube Video capture: https://youtu.be/a8jSbvyBzYU
Main topics:
* Les enjeux de la performance d'un site Web
* Les différents éléments de performance d'un site Web
** Infrastructure, architecture technique, tuning, architecture applicative, WebPerf
* L'obsession de la mesure
* Les outils
* Les quickwins
** Caches, upscaling, outscaling, sharding
* La démarche de test de charge
** Méthodologie, outils, types de test, données de test
* La démarche PDCA
** Intégrer les tests de charge au cycle de développement
** Environnement éphémère
* Questions / Réponses
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...OCTO Technology
Par Nicolas Bordier (Consultant numérique responsable @OCTO Technology) et Alaric Rougnon-Glasson (Sustainable Tech Consultant @OCTO Technology)
Sur un exemple très concret d’audit d’éco-conception de l’outil de bilan carbone C’Bilan développé par ICDC (Caisse des dépôts et consignations) nous allons expliquer en quoi l’ACV (analyse de cycle de vie) a été déterminante pour identifier les pistes d’actions pour réduire jusqu'à 82% de l’empreinte environnementale du service.
Vidéo Youtube : https://www.youtube.com/watch?v=7R8oL2P_DkU
Compte-rendu :
Le Comptoir OCTO - Équipes infra et prod, ne ratez pas l'embarquement pour l'...OCTO Technology
par Claude Camus (Coach agile d'organisation @OCTO Technology) et Gilles Masy (Organizational Coach @OCTO Technology)
Les équipes infrastructure, sécurité, production, ou cloud, doivent consacrer du temps à la modernisation de leurs outils (automatisation, cloud, etc) et de leurs pratiques (DevOps, SRE, etc). Dans le même temps, elles doivent répondre à une avalanche croissante de demandes, tout en maintenant un niveau de qualité de service optimal.
Habitué des environnements développeurs, les transformations agiles négligent les particularités des équipes OPS. Lors de ce comptoir, nous vous partagerons notre proposition de valeur de l'agilité@OPS, qui embarquera vos équipes OPS en Classe Business (Agility), et leur fera dire : "nous ne reviendrons pas en arrière".
L'IA connaît une croissance rapide et son intégration dans le domaine éducatif soulève de nombreuses questions. Aujourd'hui, nous explorerons comment les étudiants utilisent l'IA, les perceptions des enseignants à ce sujet, et les mesures possibles pour encadrer ces usages.
Constat Actuel
L'IA est de plus en plus présente dans notre quotidien, y compris dans l'éducation. Certaines universités, comme Science Po en janvier 2023, ont interdit l'utilisation de l'IA, tandis que d'autres, comme l'Université de Prague, la considèrent comme du plagiat. Cette diversité de positions souligne la nécessité urgente d'une réponse institutionnelle pour encadrer ces usages et prévenir les risques de triche et de plagiat.
Enquête Nationale
Pour mieux comprendre ces dynamiques, une enquête nationale intitulée "L'IA dans l'enseignement" a été réalisée. Les auteurs de cette enquête sont Le Sphynx (sondage) et Compilatio (fraude académique). Elle a été diffusée dans les universités de Lyon et d'Aix-Marseille entre le 21 juin et le 15 août 2023, touchant 1242 enseignants et 4443 étudiants. Les questionnaires, conçus pour étudier les usages de l'IA et les représentations de ces usages, abordaient des thèmes comme les craintes, les opportunités et l'acceptabilité.
Résultats de l'Enquête
Les résultats montrent que 55 % des étudiants utilisent l'IA de manière occasionnelle ou fréquente, contre 34 % des enseignants. Cependant, 88 % des enseignants pensent que leurs étudiants utilisent l'IA, ce qui pourrait indiquer une surestimation des usages. Les usages identifiés incluent la recherche d'informations et la rédaction de textes, bien que ces réponses ne puissent pas être cumulées dans les choix proposés.
Analyse Critique
Une analyse plus approfondie révèle que les enseignants peinent à percevoir les bénéfices de l'IA pour l'apprentissage, contrairement aux étudiants. La question de savoir si l'IA améliore les notes sans développer les compétences reste débattue. Est-ce un dopage académique ou une opportunité pour un apprentissage plus efficace ?
Acceptabilité et Éthique
L'enquête révèle que beaucoup d'étudiants jugent acceptable d'utiliser l'IA pour rédiger leurs devoirs, et même un quart des enseignants partagent cet avis. Cela pose des questions éthiques cruciales : copier-coller est-il tricher ? Utiliser l'IA sous supervision ou pour des traductions est-il acceptable ? La réponse n'est pas simple et nécessite un débat ouvert.
Propositions et Solutions
Pour encadrer ces usages, plusieurs solutions sont proposées. Plutôt que d'interdire l'IA, il est suggéré de fixer des règles pour une utilisation responsable. Des innovations pédagogiques peuvent également être explorées, comme la création de situations de concurrence professionnelle ou l'utilisation de détecteurs d'IA.
Conclusion
En conclusion, bien que l'étude présente des limites, elle souligne un besoin urgent de régulation. Une charte institutionnelle pourrait fournir un cadre pour une utilisation éthique.
OCTO TALKS : 4 Tech Trends du Software Engineering.pdfOCTO Technology
En cette année 2024 qui s’annonce sous le signe de la complexité, avec :
- L’explosion de la Gen AI
-Un contexte socio-économique sous tensions
- De forts enjeux sur le Sustainable et la régulation IT
- Une archipélisation des lieux de travail post-Covid
Découvrez les Tech trends incontournables pour délivrer vos produits stratégiques.
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Laurent Speyser
(Conférence dessinée)
Vous êtes certainement à l’origine, ou impliqué, dans un changement au sein de votre organisation. Et peut être que cela ne se passe pas aussi bien qu’attendu…
Depuis plusieurs années, je fais régulièrement le constat de l’échec de l’adoption de l’Agilité, et plus globalement de grands changements, dans les organisations. Je vais tenter de vous expliquer pourquoi ils suscitent peu d'adhésion, peu d’engagement, et ils ne tiennent pas dans le temps.
Heureusement, il existe un autre chemin. Pour l'emprunter il s'agira de cultiver l'invitation, l'intelligence collective , la mécanique des jeux, les rites de passages, .... afin que l'agilité prenne racine.
Vous repartirez de cette conférence en ayant pris du recul sur le changement tel qu‘il est généralement opéré aujourd’hui, et en ayant découvert (ou redécouvert) le seul guide valable à suivre, à mon sens, pour un changement authentique, durable, et respectueux des individus! Et en bonus, 2 ou 3 trucs pratiques!
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Breizhcamp : Guide de survie du développeur dans une application (Java) qui rame
1. Guide de survie du
développeur dans une
application (Java) qui rame
BreizhCamp 2016 #BzhCmp@blep
2. Les ordres de grandeur
importent
• Salaire: 1000 --> 1300€
•
Page speed: 30s --> 20s 😭
• Seuls les changements d'ordre de grandeur
( >300%) changent la perception de la
performance de l'application
BreizhCamp 2016 #BzhCmp@blep
3. About me
• Brice LEPORINI
• Développeur Java / Scala
BreizhCamp 2016 #BzhCmp@blep
http://the-babel-tower.github.io/ @blep
11. GC: la master class
http://www.infoq.com/presentations/Understanding-Java-Garbage-Collection
BreizhCamp 2016 #BzhCmp@blep
12. Les GC Stop The World
• Serial GC: 1 thread
• Throughput Collector ou Parallel Collector:
• multi threads young et old
BreizhCamp 2016 #BzhCmp@blep
13. Les GC concurrents: CMS
• Concurrent Mark Sweep
• Multi thread sur la young et les phases concurrentes, mono thread sur les Full GC
• STW sur les minor GC
• 6 Phases:
1. Initial mark (STW)
2. Concurrent Mark
3. Pre clean
4. Remark (STW)
5. Sweep
6. Reset
• Ne compacte pas de façon concurrente
BreizhCamp 2016 #BzhCmp@blep
14. Les GC concurrents : G1
• G1 pour “Garbage first”
• Multi thread sur la young et les phases concurrentes, mono thread sur les Full GC
• STW sur les minor GC
• Gère la heap en zones discrètes
• Phases:
1. Initial Mark (STW)
2. Root Region Scanning
3. Concurrent Marking
4. Remark (STW)
5. Cleanup / Copying
Eden
Survi
vor
Old
Old
EdenEden
Old
Survi
vor
OldEden Eden
BreizhCamp 2016 #BzhCmp@blep
20. Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
BreizhCamp 2016 #BzhCmp@blep
21. Heap dump
$ jmap -dump:file=heap.hprof,format=b,live 4695
Dumping heap to heap.hprof ...
Heap dump file created
$ du -sh heap.hprof
462M heap.hprof
$ java -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=myApp.hprof ...
BreizhCamp 2016 #BzhCmp@blep
22. Retained size et dominateur
User
age: 42
8o
name:
4/8o
String
B i l lvalue:
4/8o
Group
name:
4/8o
a d m i n
group:
4/8o
User
age: 42
8o
group:
4/8o
name:
4/8o
String
J o h nvalue:
4/8o
Shallow size
Retained size
deep size
BreizhCamp 2016 #BzhCmp@blep
24. Tester
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Optimisation du code
BreizhCamp 2016 #BzhCmp@blep
25. Et le tuning mémoire et GC?
• Définition des ratios pour tailler les zones Eden, Survivor et Old
• Définition d’objectifs de latence
• Nombre de threads alloués au GC
• Java Ergonomics depuis 1.5 -XX:+UseAdaptiveSizePolicy
$ java -XX:+PrintFlagsFinal -version |wc -l
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed
mode)
718
BreizhCamp 2016 #BzhCmp@blep
26. Tester
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Optimisation du code
BreizhCamp 2016 #BzhCmp@blep
27. Thread dump
$ jstack 4695
2016-03-06 09:47:03
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.66-b17 mixed mode):
"http-bio-8081-exec-74" #305 daemon prio=5 os_prio=31 tid=0x00007fa2de53b000 nid=0xf11f runnable [0x00000001202e7000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
- locked <0x00000007a53d8a00> (a java.io.BufferedInputStream)
at java.io.DataInputStream.readByte(DataInputStream.java:265)
at org.hsqldb.result.Result.newResult(Unknown Source)
at org.hsqldb.ClientConnection.read(Unknown Source)
at org.hsqldb.ClientConnection.execute(Unknown Source)
- locked <0x00000007a53d7910> (a org.hsqldb.ClientConnection)
at org.hsqldb.ClientConnection.getAttribute(Unknown Source)
- locked <0x00000007a53d7910> (a org.hsqldb.ClientConnection)
at org.hsqldb.ClientConnection.isAutoCommit(Unknown Source)
- locked <0x00000007a53d7910> (a org.hsqldb.ClientConnection)
at org.hsqldb.jdbc.JDBCConnection.getAutoCommit(Unknown Source)
- locked <0x00000007a53d75f0> (a org.hsqldb.jdbc.JDBCConnection)
at org.apache.commons.dbcp.DelegatingConnection.getAutoCommit(DelegatingConnection.java:337)
[…]
"http-bio-8081-exec-79" #310 daemon prio=5 os_prio=31 tid=0x00007fa2e00e7800 nid=0xe30b waiting for monitor entry
[0x0000000123aa0000]
java.lang.Thread.State: BLOCKED (on object monitor)
at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:216)
- waiting to lock <0x00000007a7be3e38> (a java.lang.Object)
BreizhCamp 2016 #BzhCmp@blep
28. Les états du thread
BreizhCamp 2016 #BzhCmp@blep
29. java.lang.Thread.State#BLOCKED
• Un thread bloqué est dans l’attente de l’acquisition d’un moniteur pour entrer dans un
bloc synchronisé
• La synchronisation d’un bloc permet de garantir que les instructions ne sont exécutées
exclusivement que par un et un seul thread
@Test
public void lockMe() throws InterruptedException {
final Thread thread1 = new Thread(this::intenseLockingComputation);
final Thread thread2 = new Thread(this::intenseLockingComputation);
thread1.start();
thread2.start();
thread2.join();
}
private final Object monitor = new Object();
private String intenseLockingComputation() {
synchronized (monitor) {
return { ... }
}
}
Thread1 verrouille monitor
Thread2 attend monitor
Thread2 verrouille monitor
BreizhCamp 2016 #BzhCmp@blep
30. Lire le thread dump
"Thread-2" #21 prio=5 os_prio=31 tid=0x00007fed9c8b3800 nid=0x6803 waiting for monitor entry [0x000000012d3b1000]
java.lang.Thread.State: BLOCKED (on object monitor)
at blep.LockTest.intenseLockingComputation(LockTest.java:36)
- waiting to lock <0x00000006c0012178> (a java.lang.Object)
at blep.LockTest$$Lambda$9/204349222.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
"Thread-1" #20 prio=5 os_prio=31 tid=0x00007fed9bb03000 nid=0x6603 runnable [0x000000012d2ae000]
java.lang.Thread.State: RUNNABLE
at sun.nio.cs.UTF_8$Decoder.decode(UTF_8.java:456)
at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:153)
at java.lang.StringCoding.decode(StringCoding.java:193)
at java.lang.StringCoding.decode(StringCoding.java:254)
at java.lang.String.<init>(String.java:534)
at java.lang.String.<init>(String.java:554)
at blep.LockTest.intenseLockingComputation(LockTest.java:39)
- locked <0x00000006c0012178> (a java.lang.Object)
at blep.LockTest$$Lambda$8/1100439041.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Thread-2 est bloqué là en attente du moniteur de la classe
Thread-1 exécute la ligne et a verrouillé le moniteur là
BreizhCamp 2016 #BzhCmp@blep
31. Un cas concret de verrouillage
"http-bio-8081-exec-172" #454 daemon prio=5 os_prio=31 tid=0x00007fa2e00f2000 nid=0xe12f waiting for monitor entry
[0x0000000122acc000]
java.lang.Thread.State: BLOCKED (on object monitor)
at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:216)
- waiting to lock <0x00000007b11190c0> (a java.lang.Object)
at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:108)
at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:88)
at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:64)
at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:285)
at ch.qos.logback.classic.Logger.callAppenders(Logger.java:272)
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:473)
at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:427)
at ch.qos.logback.classic.Logger.debug(Logger.java:534)
"http-bio-8081-exec-173" #457 daemon prio=5 os_prio=31 tid=0x00007fa2e275e800 nid=0xf61b runnable [0x0000000122de8000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
- locked <0x00000007a060c310> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:480)
- locked <0x00000007a060c2f0> (a java.io.PrintStream)
at java.io.FilterOutputStream.write(FilterOutputStream.java:97)
at org.apache.tomcat.util.log.SystemLogHandler.write(SystemLogHandler.java:169)
at ch.qos.logback.core.joran.spi.ConsoleTarget$1.write(ConsoleTarget.java:36)
at ch.qos.logback.core.encoder.LayoutWrappingEncoder.doEncode(LayoutWrappingEncoder.java:103)
at ch.qos.logback.core.OutputStreamAppender.writeOut(OutputStreamAppender.java:193)
at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:217)
- locked <0x00000007b11190c0> (a java.lang.Object)
at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:108)
at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:88)
at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:64)
BreizhCamp 2016 #BzhCmp@blep
32. Mon Thread Dump Analyzer
http://the-babel-tower.github.io/tda.html
Analyse des moniteurs
soumis à concurrence
Stats
Recherche dans les
piles d’appels
Lien vers GrepCode (enfin
quand ça marche…)
Regroupements par état
BreizhCamp 2016 #BzhCmp@blep
35. Sync vs Async
RUN RUNWAIT
Traitement
2 x Traitement @ 1 thread :
RUN11 RUN12WAIT1 RUN21 RUN22WAIT2Sync
Async RUN11 RUN12
WAIT1
RUN21 RUN22
WAIT2
Conception séquentielle
et bloquante
Conception non bloquante
basée sur la composition de
callbacks
BreizhCamp 2016 #BzhCmp@blep
36. Dimensionner un pool de
threads
• Conception asynchrone: autant que de threads
physiques (@see /proc/cpuinfo)
• Conception synchrone: ça dépend!
• Batch: autant que de threads physiques
• Transactionnel : plus (à voire avec la charge et la
proportion d’attente)
BreizhCamp 2016 #BzhCmp@blep
37. Tester
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Identifier les segments de
code applicatifs concernés
Optimisation du code
Locks?
Identifier les moniteurs
soumis à concurrence
BreizhCamp 2016 #BzhCmp@blep
39. Profiler gratuit ou payant?
• Profilers gratuits:
• Gratuit!
• Pas de choix
• Peu performant
• Télémétrie
• Léger
• Profilers payants:
• Coût décent (500/600€)
• Peu de choix
• Performants
• Précis
• Sondes de haut niveau
• Intégrés à l’IDE
BreizhCamp 2016 #BzhCmp@blep
40. Tester
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Identifier les segments de
code applicatifs concernés
Optimisation du code
Locks?
Identifier les moniteurs
soumis à concurrence
IO
bound?
Analyser l’activité I/O
BreizhCamp 2016 #BzhCmp@blep
43. Tester
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Identifier les segments de
code applicatifs concernés
Optimisation du code
Locks?
Identifier les moniteurs
soumis à concurrence
IO
bound?
Analyser l’activité I/O
Optimiser les IO (cache?)
BreizhCamp 2016 #BzhCmp@blep
44. Tester
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Identifier les segments de
code applicatifs concernés
Optimisation du code
Locks?
Identifier les moniteurs
soumis à concurrence
IO
bound?
Analyser l’activité I/O
Optimiser les IO (cache?)
Prélever un ou plusieurs
thread dumps
pour identifier les threads
en wait
BreizhCamp 2016 #BzhCmp@blep
45. Exemple du pool sous dimensionné
BreizhCamp 2016 #BzhCmp@blep
46. Dimensionner un pool JDBC
• x connexions pour y utilisateurs?
• 42?
• Autant que de requêtes HTTP?
• initial = max = maxIdle !
Expérimenter pour réduire le temps d’acquisition et
obtenir la meilleure cadence
BreizhCamp 2016 #BzhCmp@blep
47. Tester
Pool sous
dimensionné?
Redimensionner
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Identifier les segments de
code applicatifs concernés
Optimisation du code
Locks?
Identifier les moniteurs
soumis à concurrence
IO
bound?
Analyser l’activité I/O
Optimiser les IO (cache?)
Prélever un ou plusieurs
thread dumps
pour identifier les threads
en wait
BreizhCamp 2016 #BzhCmp@blep
48. Tester
Pool sous
dimensionné?
Redimensionner
Analyser l’activité/l’utilisation
des systèmes externes
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Identifier les segments de
code applicatifs concernés
Optimisation du code
Locks?
Identifier les moniteurs
soumis à concurrence
IO
bound?
Analyser l’activité I/O
Optimiser les IO (cache?)
Prélever un ou plusieurs
thread dumps
pour identifier les threads
en wait
BreizhCamp 2016 #BzhCmp@blep
49. Always blame the database!
• Analyse des plans d’exécution / query trace
• Ajout d’indexes
• Fraîcheur des statistiques
• Purge de données / partitionnement / sharding
(NoSQL)
• Rationalisation des échanges (batches, round trips,
fetch size)
• Dénormalisation
BreizhCamp 2016 #BzhCmp@blep
50. Optimisation IO
• Utiliser les Buffered(In|Out)putStreams
• Utilisation de cache:
• Applicatif
• cache FS du kernel
BreizhCamp 2016 #BzhCmp@blep
51. Tester
Pool sous
dimensionné?
Redimensionner
Analyser l’activité/l’utilisation
des systèmes externes
Optimiser les IO (batches /
buffers / …?)
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Identifier les segments de
code applicatifs concernés
Optimisation du code
Locks?
Identifier les moniteurs
soumis à concurrence
IO
bound?
Analyser l’activité I/O
Optimiser les IO (cache?)
Prélever un ou plusieurs
thread dumps
pour identifier les threads
en wait
BreizhCamp 2016 #BzhCmp@blep
52. Et la virtualisation?
• Réservation de ressources!
BreizhCamp 2016 #BzhCmp@blep
https://www.youtube.com/watch?v=XK2sG7AiEY8
53. Optimisation du code
Identifier les segments de
code applicatifs concernés
Tester
Pool sous
dimensionné?
Redimensionner
Analyser l’activité/l’utilisation
des systèmes externes
Optimiser les IO (batches /
buffers / …?)
Lenteurs
avec 1 utilisateur?
Ouvrir un shell sur la
plateforme d’exécution
CPU
bound?
GC?
Prélever un heap dump
Fuite
ou utilisation
abusive?
Analyser le dump et
identifier les dominateurs
Augmenter la mémoire
Prélever un ou plusieurs
thread dumps
OU
Analyser l’activité des
threads avec un profiler
Identifier les segments de
code applicatifs concernés
Optimisation du code
Locks?
Identifier les moniteurs
soumis à concurrence
CPU
bound?
Placer des marqueurs de
mesure dans les log
OU
Analyser l’activité avec un
profiler
IO
bound?
Analyser l’activité I/O
Optimiser les IO (cache?)
Tester
Prélever un ou plusieurs
thread dumps
pour identifier les threads
en wait
BreizhCamp 2016 #BzhCmp@blep