Dans tous les projets se cachent des race conditions. Et on les aime, ces bugs rares qui pimentent notre quotidien !
Durant cette session, on définira formellement ce qu'est une race condition. On verra ensuite deux manières de les détecter. La première sera au niveau d'un groupe de classes via la librairie jcstress. La seconde sera au niveau des applications elles-mêmes, via une méthodologie appellée "The Box" initialement prévue pour régler les problèmes de performance.
20. #TheBox - @pingtimeout
jcstress 101
20
@Outcome(id = "1, 2", expect = ACCEPTABLE, desc = "Actor1, then Actor2")
@Outcome(id = "2, 1", expect = ACCEPTABLE, desc = "Actor2, then Actor1")
@Outcome(expect = FORBIDDEN, desc = "Only atomic increase wanted !")
@State
public class APISample_01_Simple {
int v;
@Actor
public void actor1(IntResult2 r) {
r.r1 = ++v; // record result from actor1 to field r1
}
@Actor
public void actor2(IntResult2 r) {
r.r2 = ++v; // record result from actor2 to field r2
}
}
21. #TheBox - @pingtimeout
jcstress 102
21
[...]
@State
public class APISample_02_Arbiters {
int v;
@Actor
public void actor1() {
v++;
}
@Actor
public void actor2() {
v++;
}
[...]
}
35. #TheBox - @pingtimeout
The Box
• Responsabilités exclusives par composant
• Hiérarchie d’appels
• Charge définie par le composant précédent
• Pas de raccourcis
35
Actors
Application
JVM
System
36. #TheBox - @pingtimeout
The Box
• Requête CQL avec CL=2
• Coordinateur: trouver un réplicat
• API JVM: nio / socket / …
• JVM: allocations mémoire, appels systèmes
• Système: locks, IRQ, matériel
36
Actors
Application
JVM
System
38. #TheBox - @pingtimeout
Réactions vs. The Box
• Relancer le test
• Augmenter le nombre de clients
• Changer la configuration
38
Actors
Application
JVM
System
39. #TheBox - @pingtimeout
Réactions + alternatives (Actors)
• Relancer le test
• Augmenter le nombre de clients
• Changer la configuration
• Varier la taille des requêtes
• Ajouter des temps morts
39
Actors
Application
JVM
System
47. #TheBox - @pingtimeout
Alternatives (JVM)
• Augmenter la fréquence du GC
• Diminuer sa durée
• Safepoints !
47
Actors
Application
JVM
System
48. #TheBox - @pingtimeout
Dérégler le GC (Maths)
• Allocation mémoire: ~1 Go/s
• Young Generation: 2 Go
• == 1 YGC toutes les 2 secondes
• 1 YGC sur 2 Go ≈ 10ms
48
49. #TheBox - @pingtimeout
Dérégler le GC (Maths)
• Allocation mémoire: ~1 Go/s
• Young Generation: 10 Mo
• == 1 YGC toutes les 10 millisecondes
• 1 YGC sur 10 Mo ≈ 1ms
49
51. #TheBox - @pingtimeout
Alternatives (Système)
• Ajouter des CPU (cores)
• Ajouter des CPU (sockets)
• Tuner l'ordonnanceur
51
Actors
Application
JVM
System
52. #TheBox - @pingtimeout 52
Timeout
Mark node1 DOWN
Mark node1 UP
30s
µs
µs
µs
Re: JAVA-471 Actors
Application
JVM
System
53. #TheBox - @pingtimeout 53
Timeout
Mark node1 DOWN
Mark node1 UP
1ms
µs
µs
µs
Ex: Timeout client Actors
Application
JVM
System
54. #TheBox - @pingtimeout 54
Timeout
Mark node1 DOWN
Mark node1 UP
1ms
100s µs
100s µs
µs
Ex: GC (client) Actors
Application
JVM
System
55. #TheBox - @pingtimeout 55
Mark node1 DOWN
Mark node1 UP
1ms
100s µs
µs
100s µs
Actors
Application
JVM
System
Ex: GC (DB)
Timeout