Le Trading à haute Fréquence dans la JVM avec Scala/Akka
Imaginons une hypothétique HFT système en Java, qui exige de (très) faible latence, avec beaucoup de courte durée, de petits objets quelque peu en raison de l'immutabilité (Scala?), des milliers de connexions par seconde, et une obscène nombre de messages à passer à un événement driven architecture (akka et amqp?).
Pour les experts, ce serait (en théorie) être le meilleur réglage pour la JVM 7? Ce type de code serait le rendre heureux? Serait Scala, Akka être prêt pour ce genre de systèmes?
Remarque: Il y a eu des questions similaires, à l'instar de ce un, mais je n'ai pas encore trouver un couvrant Scala (qui a ses propres empreinte dans la JVM).
- Aussi la question se pose de savoir si la JVM est le bon choix? Peut-être que C++ est plus prévisible de la latence.
- J'ai entendu parler d'Scala utilisé pour produire du code C vraiment HFT, mais je ne me rappelle pas tous les détails. Comme le 1-3 sec mentionné dans la question, c'est trop pour HFT, je ne pense pas que c'est une bonne idée d'écrire HFT logiciel sur la JVM.
- La question est de façon générale.
- Je ne comprends pas pourquoi les gens essaient à faible latence dans une poubelle de collecte de la langue. Pourquoi n'est-ce pas C plus couramment utilisés?
- De mon expérience, je peux dire que la Scala n'est pas bon de haute performance avec une faible latence, en raison de la quantité de magie sous le capot. Akka, également, n'est pas le plus rapide de la chose, c'est beaucoup plus lente que sur le Perturbateur.
- Vous pouvez avoir des milliers de messages qui vont dans le & dans une seconde, mais vous ne sera certainement pas avoir des milliers de connexions dans un HFT système.
Vous devez vous connecter pour publier un commentaire.
Sur mon portable le temps de latence moyen de ping des messages entre Akka 2.3.7 acteurs est ~300ns et c'est beaucoup moins que le temps de latence prévu en raison de la GC s'arrête sur les machines virtuelles.
Code (incl. Options JVM) & les résultats des tests pour Akka et d'autres acteurs sur le processeur Intel Core i7-2640M ici.
P. S. Vous pouvez trouver beaucoup de principes et conseils pour la faible latence de calcul sur Dmitry Vyukov de site et Martin Thompson blog.
Il est possible d'atteindre de très bonnes performances en Java. Toutefois, la question des besoins plus spécifiques de l'une réponse crédible. Vos principales sources de latence viendra de suivre liste non exhaustive:
La quantité d'ordures que vous créez et les travaux de la GC pour recueillir et
de le promouvoir. Immuable dessins dans mon expérience, ne cadrent pas bien avec
faible latence. GC réglage doit être une grande partie de l'attention.
Réchauffer la JVM pour que les classes sont chargées et l'équipe a eu le temps
pour faire son travail.
De la conception de votre algorithmes en O(1) ou au moins O(log2 n), et ont
les tests de performances que d'affirmer cela.
Votre création doit être sans verrouillage et de suivre la "Seul Écrivain
Principe".
Un effort important doit être mis sur la compréhension de l'ensemble
pile et montrant mécanique de la sympathie dans son utilisation.
De la conception de votre algorithmes et structures de données à cache-friendly.
Le Cache ces jours sont le plus grand coût. C'est en étroite collaboration
liées à des processus d'affinité qui, si pas configuré correctement peut entraîner
et significative de la pollution du cache. Cela impliquera de la sympathie pour les OS et même certains JNI code dans certains cas.
Vous assurer d'avoir suffisamment de cœurs, de sorte que n'importe quel thread qui doit
terme, a un noyau sans avoir à attendre.
J'ai récemment blogué sur un étude de cas d'un tel exercice.
Vous pouvez trouver que l'utilisation d'un anneau de la mémoire tampon pour la transmission de message dépassera ce qui peut être fait avec Akka. Le principal tampon en anneau de mise en œuvre que les gens utilisent sur la JVM pour les applications financières est celui qui est appelé Perturbateur qui est soigneusement calibrée pour l'efficacité (puissance de deux), pour la JVM (pas de GC, pas de verrou) et pour les Processeurs modernes (pas de faux partage de lignes de cache).
Voici une intro présentation à partir d'un Scala point de vue http://scala-phase.org/talks/jamie-allen-sdisruptor/index.html#1 et il y a des liens sur la dernière diapositive à l'origine LMAX choses.