La scalabilité des applications est une préoccupation importante. Beaucoup de pertes en scalabilité proviennent de code contenant des locks qui produisent une importante contention en cas de forte charge.
Dans cette présentation nous allons aborder différentes techniques (striping, copy-on-write, ring buffer, spinning, ...) qui vont nous permettre de réduire cette contention ou d'obtenir un code sans lock. Nous expliquerons aussi les concepts de Compare-And-Swap et de barrières mémoires.
8. @jpbempel#LockFree @jpbempel#LockFree
Pourquoi ne pas utiliser la CLQ qui est Lock(Wait)-Free ?
•Queue non limitée (unbounded) et non bloquante
•Alloue un node à chaque insertion (GC)
•Pas très sympa avec le cache CPU
•MultiProducteur/MultiConsommateur
Array/LinkedBlockingQueue: Pas Lock-free
Disruptor
19. @jpbempel#LockFree @jpbempel#LockFree
Ring Buffer : nP 1C
public boolean offer(E e) {
long curTail;
do {
curTail = tail.get()
if (curTail - head.get() == ringBuffer.length)
return false;
} while (!tail.compareAndSet(curTail, curTail + 1));
ringBuffer.set(curTail % ringBuffer.length, e);//volatile write
return true;
}
20. @jpbempel#LockFree @jpbempel#LockFree
Ring Buffer : nP 1C
public E poll() {
int index = head.get() % ringBuffer.length;
E element = ringBuffer.get(index);
if (element == null)
return null;
ringBuffer.set(index, null);
head.set(head.get() + 1); // volatile write
return element;
}
23. @jpbempel#LockFree @jpbempel#LockFree
Buffer vide, que fait le thread consommateur ?
Buffer plein, que fait(font) le(s) thread(s) producteur(s)
Insertion d’un élement, réveil du consommateur
wait/notify & await/signal
25. @jpbempel#LockFree @jpbempel#LockFree
Latence + contention pour la mise en sommeil (wait)
Latence + contention pour le réveil
Latence pour le thread réveillé avant d’être schedulé
wait/notify & await/signal
31. @jpbempel#LockFree @jpbempel#LockFree
Librairie créée par Nitsan Wakart (Azul Systems)
Ensemble de Queues lock-free avec fin degré de choix pour
différents usages
•Bounded/unbounded SPSC = Single Producer
•Bounded/Unbounded MPSC = Multi Producer
•Bounded SPMC/MPMC = Multi Consumer
JCTools
32. @jpbempel#LockFree @jpbempel#LockFree
Quel intéret d’avoir des type queues différentes ?
=> Optimisations en fonction des cas :
•masque pour modulo
•volatile writes (lazySet)
•false sharing
•memory layout
•unsafe
JCTools
33. @jpbempel#LockFree @jpbempel#LockFree
masque pour modulo
•Tableau de puissance de 2
•Appliquer un et binaire au lieu d'un modulo
volatile writes (lazySet)
•Pas de barrière matériel
JCTools : Optimisations
35. @jpbempel#LockFree @jpbempel#LockFree
Memory Layout
Champs sont réorganisés par taille et alignés
Utilisation de l'héritage pour s'assurer de l'ordre des champs
JCTools : Optimisations
class A {
int f1;
}
class B extends A {
long f2;
}
37. @jpbempel#LockFree @jpbempel#LockFree
Comment paralléliser des tâches tout en gardant l’ordre ?
exemple: traitement d’un flux video
•Lecture d’une image du flux
•Traitement de l’image (parallélisable)
•écriture du flux transformé (dans l’ordre)
Ticketage
40. @jpbempel#LockFree @jpbempel#LockFree
Possible de le faire avec Disruptor,
mais par un thread consommateur dédié
OrderedScheduler permet de le faire sans :
•pas de surcoût communication inter-threads
•pas de thread additionnel
•pas de stratégie d’attente
L’idée c’est de prendre un ticket...
Ticketage
54. @jpbempel#LockFree
Références
•circular buffers: http://lwn.net/Articles/378262/
•Mr T queues:
https://github.com/mjpt777/examples/tree/master/src/java/uk/co/real_l
ogic/queues
•Lock-free algorithms by Mr T: http://www.infoq.com/presentations/Lock-
free-Algorithms
•Futex are tricky U. Drepper: http://www.akkadia.org/drepper/futex.pdf
•JCTools: https://github.com/JCTools/JCTools
•Nitsan Wakart blog: http://psy-lob-saw.blogspot.com
55. @jpbempel#LockFree
Références
•Exploiting data parallelism in ordered data streams:
https://software.intel.com/en-us/articles/exploiting-data-parallelism-in-
ordered-data-streams
•OrderedScheduler: https://github.com/Ullink/ordered-scheduler
•Concurrency Freaks: http://concurrencyfreaks.blogspot.com
•Preshing on programming: http://preshing.com/
•Is Parallel Programming Hard, And If So, What Can You Do About It?
https://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.2
015.01.31a.pdf