SlideShare une entreprise Scribd logo
Le framework LMAX / Disruptor
       par Cédric FINANCE et François OSTYN
     cedric.finance@soat.fr / francois.ostyn@soat.fr


                       26 janvier 2012
Qui sommes nous ?
Introduction :
LMAX :
Société spécialisée dans le passage d’ordres de bourse.
Affichage temps réel des cotations, volume de transactions élevé,
respect de l’ordonnancement des ordres et temps d’exécution
réduit.
Disruptor (replicator) :
arme ayant été utilisée pour détruire les réplicateurs dans Stargate SG1
Disruptor :
Framework de programmation concurrente. Résultat des
recherches de la société LMAX.
Le cloud, j’le casse
- On se base sur le principe de l’IoA (Inversion of Architecture).

- Pourquoi ne pas utiliser le maximum de puissance CPU et la
mémoire de nos machines ?

- Toutes ces architectures par strates sont compliquées non ?
La soirée 3T va devenir
UT (Ultimate Technical):
Mais pourquoi la gestion de la
concurrence en Java est si
compliquée ?


          Attention, ces 384 pages sont dangereuses !!!
L’ordre :
// ordre de programmation        // ordre d’exécution (non certain)
  int w = 10;                      int y = 30;
  int x = 20;                      int x = 20;
  int y = 30;                      int b = x * y;
  int z = 40;
                                  int z = 40;
 int a = w + z;                   int w = 10;
 int b = x * y;                   int a = w + z;

De nombreux facteurs peuvent influer : le matériel, les
paramètres de la JVM, le type de GC,... merci je JIT
Avant de continuer quelques chiffres :


L1 cache reference                             0.5 ns
Branch mispredict                              5 ns
L2 cache reference                             7 ns
Mutex lock/unlock                             25 ns
Main memory reference                        100 ns
Compress 1K bytes with Zippy               3,000 ns
Send 2K bytes over 1 Gbps network         20,000 ns
Read 1 MB sequentially from memory       250,000 ns
Round trip within same datacenter        500,000 ns
Disk seek                             10,000,000 ns
Read 1 MB sequentially from disk      20,000,000 ns
Send packet CA->Netherlands->CA      150,000,000 ns
Il faut faire attention aux détails :

Incrémenter un compteur :                    Utiliser un lock :
                                             public static long foo = 0;
static long foo = 0;
                                             public static Lock lock = new Lock();
private static void increment() {
                                             private static void increment() {
  for (long l = 0; l < 500000000L; l++) {
                                                 for (long l = 0; l < 500000000L; l++) {
        foo ++;
                                                   lock.lock();
}
                                                   try {
                                                       foo++;
                                                   } finally {
Utiliser un AtomicLong :                             lock.unlock();
                                             }}}
static AtomicLong foo = new AtomicLong(0);
private static void increment() {
    for (long l = 0; l < 500000000L; l++)
   {foo.getAndIncrement();}
}
Le coût des contentions

Incrémenter un compteur 500 millions de fois...

● One Thread! :! 300 ms

● One Thread (volatile):! 4 700 ms (15x)

● One Thread (Atomic) : 5 700 ms (19x)

● One Thread (Lock)!: 10 000 ms (33x)

● Two Threads (Atomic) : 30 000 ms (100x)

● Two Threads (Lock)!: 224 000 ms (746x)
Soit pas loin de 4 minutes
Découper des chaînes de caractères


● Parallel   (Scala): 440 ops/sec

●   Serial! (Java) : 1768 ops/sec
La parallélisation des traitements n’est pas toujours une bonne solution
Et quid des processeurs ?

Comparaison du temps de découpage des chaines de caractères
en mono-thread sur différents processeurs.




       Les performances peuvent aller du simple au double...
Mais que peut nous apporter le
                  Disruptor
... A part nous sauver des réplicateurs... (Private JOKE)
Ne pas devoir recourir à une architecture multi-thread

Donc, une mise en place plus aisée

De la simplicité pour les tests

Un coût de machines moins élevé

Se remettre en question sur le fonctionnement de Java...
Les problématiques rencontrées par la société LMAX

 - False sharing

 - Memory barrier

 - Context switch

 - CAS (compare and swap)

 - Cache line
le False sharing

 public void run()
 {
     long i = ITERATIONS + 1;
     while (0 != --i)
     {
         longs[arrayIndex].value = i;
     }
 }


 public final static class VolatileLong
 {
     public volatile long value = 0L;
     public long p1, p2, p3, p4, p5, p6; // comment out
 }
le False sharing
le False sharing




Pourquoi ce tel changement de performances?
le False sharing
le False sharing




                   Header data1   data2   p1    p2      p3   p4   p5


                                           Cache Line
Les conclusions que l’on peut tirer...

Les queues (java) sont coûteuses (temps de traitement et lock des ressources)

Le multi-threading est coûteux (contentions sur les ressources communes) et difficile a mettre en œuvre.

Le multi-threading n’est pas le plus efficace en terme de performances.




  Attention, ce cas d’utilisation ne peut pas convenir à tout le monde...
Ce qu’a fait LMAX :

Ecriture d’un framework permettant de partager rapidement les données entre thread sans toutefois
recourir aux mécanismes classiques des locks. C’est ce que nous nommerons Disruptor.
Le pattern Disruptor :




  Les producteurs, le Ring Buffer et les consommateurs sont chacun dans des threads différents.
  Les acteurs : Producteur, Consommateur
  Les objets : RingBuffer, Barrier
  Les stratégies : Wait, Claim

Objectif : ne plus avoir de contentions...
Alors qu’avec une architecture classique nous avions :




      Mais où se trouve ma contention...
Ce que peut apporter le disruptor ?




     C’est mieux mais toujours pas parfait....
Mais est-ce vraiment rapide ?




Conclusion : jusqu’à 5 fois plus rapide... et combien de fois moins cher (maintenance,
matériel,...) et plus constant...
...DEMO...
Comment aider le GIE portabilité ? (pour toi Xavier...)
Conclusion
- Ne jamais croire ce que l’on nous dit, il faut tester, expérimenter, la pratique est
souvent très loin de la théorie

- La concurrence est un outil à manier avec précautions,...

- Pour avoir des performances, chaque détail compte, mais comme le dit Donald
Knuth, «premature optimization is the root of Evil»
Liens :
•http://www.infoq.com/articles/memory_barriers_jvm_concurrency
•http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf
•http://www.slideshare.net/trishagee/understanding-the-disruptor
•http://code.google.com/p/disruptor/
•http://disruptor.googlecode.com/files/Disruptor-1.0.pdf
•http://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html
•http://mechanical-sympathy.blogspot.com/2011/07/memory-barriersfences.html
•http://martinfowler.com/articles/lmax.html

Contenu connexe

Tendances

Java - implémentation des concepts objets
Java - implémentation des concepts objetsJava - implémentation des concepts objets
Java - implémentation des concepts objets
Jean David Olekhnovitch
 
Java - notions de bases pour développeur
Java - notions de bases pour développeurJava - notions de bases pour développeur
Java - notions de bases pour développeur
Jean David Olekhnovitch
 
Introduction à MacRuby - OSDC.fr 2009
Introduction à MacRuby - OSDC.fr 2009Introduction à MacRuby - OSDC.fr 2009
Introduction à MacRuby - OSDC.fr 2009
guest60b8020b
 
Premiers pas dans les extensions PHP
Premiers pas dans les extensions PHPPremiers pas dans les extensions PHP
Premiers pas dans les extensions PHP
Pierrick Charron
 
Concepts de base O.O (1)
Concepts de base O.O (1)Concepts de base O.O (1)
Concepts de base O.O (1)
Ouijden Dhemaid
 
Java 9 modules
Java 9    modulesJava 9    modules
Java 9 modules
Franck SIMON
 
Rust my node
Rust my nodeRust my node
Rust my node
Thomas Haessle
 
Ruby et Rails
Ruby et RailsRuby et Rails
Ruby et Rails
Gregoire Lejeune
 
Ruby et Rails
Ruby et RailsRuby et Rails
Ruby et Rails
guestbe7436
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquence
OCTO Technology
 
Présentation au Blockchain Day (Lyon)
Présentation au Blockchain Day (Lyon)Présentation au Blockchain Day (Lyon)
Présentation au Blockchain Day (Lyon)
Quentin de Beauchesne
 
SdE 8 - Synchronization de execution
SdE 8 - Synchronization de executionSdE 8 - Synchronization de execution
SdE 8 - Synchronization de execution
Alexandru Radovici
 
Game camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames
Game camp 2017 - "Pesto, un langage pour coder les IAs" - PastagamesGame camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames
Game camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames
Laura Fournier
 
Plateformes Linux Embedded
Plateformes Linux EmbeddedPlateformes Linux Embedded
Plateformes Linux Embedded
embedded-linux-bdx
 
Les Alternatives à la Blockchain
Les Alternatives à la BlockchainLes Alternatives à la Blockchain
Les Alternatives à la Blockchain
Cyril Grunspan
 
Eric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharpEric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharp
MSDEVMTL
 

Tendances (18)

Java - implémentation des concepts objets
Java - implémentation des concepts objetsJava - implémentation des concepts objets
Java - implémentation des concepts objets
 
Java - notions de bases pour développeur
Java - notions de bases pour développeurJava - notions de bases pour développeur
Java - notions de bases pour développeur
 
Paug renderscript-mars-2013
Paug renderscript-mars-2013Paug renderscript-mars-2013
Paug renderscript-mars-2013
 
Introduction à MacRuby - OSDC.fr 2009
Introduction à MacRuby - OSDC.fr 2009Introduction à MacRuby - OSDC.fr 2009
Introduction à MacRuby - OSDC.fr 2009
 
Premiers pas dans les extensions PHP
Premiers pas dans les extensions PHPPremiers pas dans les extensions PHP
Premiers pas dans les extensions PHP
 
Concepts de base O.O (1)
Concepts de base O.O (1)Concepts de base O.O (1)
Concepts de base O.O (1)
 
Java 9 modules
Java 9    modulesJava 9    modules
Java 9 modules
 
Rust my node
Rust my nodeRust my node
Rust my node
 
Ruby et Rails
Ruby et RailsRuby et Rails
Ruby et Rails
 
Ruby et Rails
Ruby et RailsRuby et Rails
Ruby et Rails
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquence
 
Présentation au Blockchain Day (Lyon)
Présentation au Blockchain Day (Lyon)Présentation au Blockchain Day (Lyon)
Présentation au Blockchain Day (Lyon)
 
SdE 8 - Synchronization de execution
SdE 8 - Synchronization de executionSdE 8 - Synchronization de execution
SdE 8 - Synchronization de execution
 
Game camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames
Game camp 2017 - "Pesto, un langage pour coder les IAs" - PastagamesGame camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames
Game camp 2017 - "Pesto, un langage pour coder les IAs" - Pastagames
 
Mgd scripting
Mgd scriptingMgd scripting
Mgd scripting
 
Plateformes Linux Embedded
Plateformes Linux EmbeddedPlateformes Linux Embedded
Plateformes Linux Embedded
 
Les Alternatives à la Blockchain
Les Alternatives à la BlockchainLes Alternatives à la Blockchain
Les Alternatives à la Blockchain
 
Eric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharpEric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharp
 

En vedette

SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
dbi services
 
Tutorialphpmyadmin
TutorialphpmyadminTutorialphpmyadmin
Tutorialphpmyadmin
marcossonotec
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Daniel Rehn
 
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Daniel Rehn
 
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IICampus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Daniel Rehn
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
Elton Minetto
 
Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?
iniciativaverds
 
02.10.2011 SC B.A.T II
02.10.2011   SC B.A.T II02.10.2011   SC B.A.T II
02.10.2011 SC B.A.T II
HerdwangerSV
 
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
dmc digital media center GmbH
 
Presentació assamblea
Presentació assamblea Presentació assamblea
Presentació assamblea
FC Barcelona
 
Lean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanbanLean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanban
Julien Fallet
 
MySQL Query Optimization
MySQL Query OptimizationMySQL Query Optimization
MySQL Query Optimization
Bianca Caruso da Paixão
 
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
jonesshipman
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
MongoDB
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Daniel Rehn
 
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referênciaSemana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Manuel Menezes de Sequeira
 
NotORM
NotORMNotORM
NotORM
Tiago Davi
 
Apresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc Quixadá
Zarathon Maia
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27
domidp
 

En vedette (20)

SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
SQL Server 2008 'Best Practices' - Stéphane Haby, dbi services - Mövenpick La...
 
Tutorialphpmyadmin
TutorialphpmyadminTutorialphpmyadmin
Tutorialphpmyadmin
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 30.01.2013
 
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
Campus M21 | Medienpraxis II: Online - Vorlesung III vom 11.02.2013
 
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung IICampus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
Campus M21 | Medienpraxis III: Online / Social Media - Vorlesung II
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
 
Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?Què ha fet ICV-EUiA amb el meu vot?
Què ha fet ICV-EUiA amb el meu vot?
 
02.10.2011 SC B.A.T II
02.10.2011   SC B.A.T II02.10.2011   SC B.A.T II
02.10.2011 SC B.A.T II
 
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
ECM-Webinar: Alfresco Migration Bestandsdaten Teil 2
 
Presentació assamblea
Presentació assamblea Presentació assamblea
Presentació assamblea
 
Lean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanbanLean Kanban FR 2013 - Vin et kanban
Lean Kanban FR 2013 - Vin et kanban
 
Einführung in SCRUM
Einführung in SCRUMEinführung in SCRUM
Einführung in SCRUM
 
MySQL Query Optimization
MySQL Query OptimizationMySQL Query Optimization
MySQL Query Optimization
 
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & ShipmanDominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
Dominator: Rectifieuse plane de profils à CN et avance lente de Jones & Shipman
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
 
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
Campus M21 | Medienpraxis II: Online - Vorlesung I vom 31.01.2013
 
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referênciaSemana  5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
 
NotORM
NotORMNotORM
NotORM
 
Apresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc Quixadá
 
Atelier agile 2009_09_27
Atelier agile 2009_09_27Atelier agile 2009_09_27
Atelier agile 2009_09_27
 

Similaire à Présentation LMAX Disruptor So@t

11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
Patiento Del Mar
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
ochafik
 
gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!
David Caramelo
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !
Carles Sistare
 
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
Microsoft
 
Hackerspace jan-2013
Hackerspace jan-2013Hackerspace jan-2013
Hackerspace jan-2013
Hackfest Communication
 
Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)
Loic Ortola
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
Xavier MARIN
 
Composants reconfigurables
Composants reconfigurablesComposants reconfigurables
Composants reconfigurables
Peronnin Eric
 
Introduction à MacRuby
Introduction à MacRubyIntroduction à MacRuby
Introduction à MacRuby
Olivier Gutknecht
 
Solutions temps réel sous linux
Solutions temps réel sous linuxSolutions temps réel sous linux
Solutions temps réel sous linux
embedded-linux-bdx
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
Florian Beaufumé
 
Hacking your Home @bdx.io
Hacking your Home @bdx.ioHacking your Home @bdx.io
Hacking your Home @bdx.io
laurenthuet
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
sabrine_hamdi
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
Xavier MARIN
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
Microsoft
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomics
Aurélien Regat-Barrel
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
Dr Samir A. ROUABHI
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
tchappui
 
Apache kafka big data track
Apache kafka   big data trackApache kafka   big data track
Apache kafka big data track
Paris Open Source Summit
 

Similaire à Présentation LMAX Disruptor So@t (20)

11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !GPGPU facile avec JavaCL, et trivial avec ScalaCL !
GPGPU facile avec JavaCL, et trivial avec ScalaCL !
 
gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !
 
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
 
Hackerspace jan-2013
Hackerspace jan-2013Hackerspace jan-2013
Hackerspace jan-2013
 
Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)Modern DevOps - kill the bottleneck (part 2/2)
Modern DevOps - kill the bottleneck (part 2/2)
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
 
Composants reconfigurables
Composants reconfigurablesComposants reconfigurables
Composants reconfigurables
 
Introduction à MacRuby
Introduction à MacRubyIntroduction à MacRuby
Introduction à MacRuby
 
Solutions temps réel sous linux
Solutions temps réel sous linuxSolutions temps réel sous linux
Solutions temps réel sous linux
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Hacking your Home @bdx.io
Hacking your Home @bdx.ioHacking your Home @bdx.io
Hacking your Home @bdx.io
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomics
 
Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
 
Apache kafka big data track
Apache kafka   big data trackApache kafka   big data track
Apache kafka big data track
 

Présentation LMAX Disruptor So@t

  • 1. Le framework LMAX / Disruptor par Cédric FINANCE et François OSTYN cedric.finance@soat.fr / francois.ostyn@soat.fr 26 janvier 2012
  • 4. LMAX : Société spécialisée dans le passage d’ordres de bourse. Affichage temps réel des cotations, volume de transactions élevé, respect de l’ordonnancement des ordres et temps d’exécution réduit.
  • 5. Disruptor (replicator) : arme ayant été utilisée pour détruire les réplicateurs dans Stargate SG1
  • 6. Disruptor : Framework de programmation concurrente. Résultat des recherches de la société LMAX.
  • 7. Le cloud, j’le casse - On se base sur le principe de l’IoA (Inversion of Architecture). - Pourquoi ne pas utiliser le maximum de puissance CPU et la mémoire de nos machines ? - Toutes ces architectures par strates sont compliquées non ?
  • 8. La soirée 3T va devenir UT (Ultimate Technical):
  • 9. Mais pourquoi la gestion de la concurrence en Java est si compliquée ? Attention, ces 384 pages sont dangereuses !!!
  • 10. L’ordre : // ordre de programmation // ordre d’exécution (non certain) int w = 10; int y = 30; int x = 20; int x = 20; int y = 30; int b = x * y; int z = 40; int z = 40; int a = w + z; int w = 10; int b = x * y; int a = w + z; De nombreux facteurs peuvent influer : le matériel, les paramètres de la JVM, le type de GC,... merci je JIT
  • 11. Avant de continuer quelques chiffres : L1 cache reference 0.5 ns Branch mispredict 5 ns L2 cache reference 7 ns Mutex lock/unlock 25 ns Main memory reference 100 ns Compress 1K bytes with Zippy 3,000 ns Send 2K bytes over 1 Gbps network 20,000 ns Read 1 MB sequentially from memory 250,000 ns Round trip within same datacenter 500,000 ns Disk seek 10,000,000 ns Read 1 MB sequentially from disk 20,000,000 ns Send packet CA->Netherlands->CA 150,000,000 ns
  • 12. Il faut faire attention aux détails : Incrémenter un compteur : Utiliser un lock : public static long foo = 0; static long foo = 0; public static Lock lock = new Lock(); private static void increment() { private static void increment() { for (long l = 0; l < 500000000L; l++) { for (long l = 0; l < 500000000L; l++) { foo ++; lock.lock(); } try { foo++; } finally { Utiliser un AtomicLong : lock.unlock(); }}} static AtomicLong foo = new AtomicLong(0); private static void increment() { for (long l = 0; l < 500000000L; l++) {foo.getAndIncrement();} }
  • 13. Le coût des contentions Incrémenter un compteur 500 millions de fois... ● One Thread! :! 300 ms ● One Thread (volatile):! 4 700 ms (15x) ● One Thread (Atomic) : 5 700 ms (19x) ● One Thread (Lock)!: 10 000 ms (33x) ● Two Threads (Atomic) : 30 000 ms (100x) ● Two Threads (Lock)!: 224 000 ms (746x) Soit pas loin de 4 minutes
  • 14. Découper des chaînes de caractères ● Parallel (Scala): 440 ops/sec ● Serial! (Java) : 1768 ops/sec La parallélisation des traitements n’est pas toujours une bonne solution
  • 15. Et quid des processeurs ? Comparaison du temps de découpage des chaines de caractères en mono-thread sur différents processeurs. Les performances peuvent aller du simple au double...
  • 16. Mais que peut nous apporter le Disruptor ... A part nous sauver des réplicateurs... (Private JOKE)
  • 17. Ne pas devoir recourir à une architecture multi-thread Donc, une mise en place plus aisée De la simplicité pour les tests Un coût de machines moins élevé Se remettre en question sur le fonctionnement de Java...
  • 18. Les problématiques rencontrées par la société LMAX - False sharing - Memory barrier - Context switch - CAS (compare and swap) - Cache line
  • 19. le False sharing public void run() { long i = ITERATIONS + 1; while (0 != --i) { longs[arrayIndex].value = i; } } public final static class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6; // comment out }
  • 21. le False sharing Pourquoi ce tel changement de performances?
  • 23. le False sharing Header data1 data2 p1 p2 p3 p4 p5 Cache Line
  • 24. Les conclusions que l’on peut tirer... Les queues (java) sont coûteuses (temps de traitement et lock des ressources) Le multi-threading est coûteux (contentions sur les ressources communes) et difficile a mettre en œuvre. Le multi-threading n’est pas le plus efficace en terme de performances. Attention, ce cas d’utilisation ne peut pas convenir à tout le monde...
  • 25. Ce qu’a fait LMAX : Ecriture d’un framework permettant de partager rapidement les données entre thread sans toutefois recourir aux mécanismes classiques des locks. C’est ce que nous nommerons Disruptor.
  • 26. Le pattern Disruptor : Les producteurs, le Ring Buffer et les consommateurs sont chacun dans des threads différents. Les acteurs : Producteur, Consommateur Les objets : RingBuffer, Barrier Les stratégies : Wait, Claim Objectif : ne plus avoir de contentions...
  • 27. Alors qu’avec une architecture classique nous avions : Mais où se trouve ma contention...
  • 28. Ce que peut apporter le disruptor ? C’est mieux mais toujours pas parfait....
  • 29. Mais est-ce vraiment rapide ? Conclusion : jusqu’à 5 fois plus rapide... et combien de fois moins cher (maintenance, matériel,...) et plus constant...
  • 30. ...DEMO... Comment aider le GIE portabilité ? (pour toi Xavier...)
  • 31. Conclusion - Ne jamais croire ce que l’on nous dit, il faut tester, expérimenter, la pratique est souvent très loin de la théorie - La concurrence est un outil à manier avec précautions,... - Pour avoir des performances, chaque détail compte, mais comme le dit Donald Knuth, «premature optimization is the root of Evil»

Notes de l'éditeur

  1. \n
  2. F + C\n
  3. \n
  4. F\n
  5. F\n
  6. F\n
  7. C\n
  8. F\n
  9. Poser la question sur qui utilise la concurrence sur ses projets ?\n
  10. C\n
  11. F\n
  12. C\n
  13. C\n
  14. C\n
  15. C\n
  16. F\n
  17. F\n
  18. F\n
  19. C\n
  20. C\n
  21. C\n
  22. C\n
  23. C\n
  24. F + C\n
  25. F\n
  26. F + C\n
  27. F + C\n
  28. F + C \n
  29. F + C \n
  30. F + C\n
  31. F + C \n
  32. NOP\n