Les derniers jours restent avant Joker, et je voulais vraiment apporter à Habr non pas une interview ordinaire, mais un jeu puissant. Récemment, les serveurs se sont intéressés aux serveurs sur Arm, et il se trouve que nous avons de vrais experts sur ce sujet.
Alexander (
alexbel ) Belokrylov et Lesha Voitylov, avec Grigory Labzovsky, qui dirigeait le centre de développement Oracle à Saint-Pétersbourg, ont fondé BellSoft il y a un peu plus d'un an. Maintenant, l'entreprise fonctionne, se développe et a déjà acquis une renommée dans le monde Java.
Par le volume de commits dans OpenJDK au cours de la dernière année, ils sont arrivés en cinquième place, et maintenant seuls Oracle, Red Hat, SAP et Google sont en avance:

Vous devez comprendre que BellSoft n'est pas seulement Arm:
- Liberica JDK 11 est sorti , Linux x86_64, Windows, Linux ARMv8, Linux ARMv7 (y compris Raspberry Pi) sont pris en charge. Les versions seront conçues pour Mac et Solaris Sparc.
- Les images de toutes les architectures sont publiées sur le Docker Hub pour Debian, CentOS, Alpine. L'image pour Alpine est faite à partir de la version lite avec
--compress 2
est donc beaucoup plus petite que le JDK habituel.
Dans cette interview, nous ne parlerons que d'Arm et laisserons le reste pour la prochaine fois.
Alors aujourd'hui dans notre studio virtuel:
Alexander Belokrylov
Lesha Voytylov
Oleg Chirukhin - éditeurs du groupe JUG.ru
Parlez-nous de l'entreprise?
La société BellSoft est engagée dans plusieurs domaines. Tout le monde sait probablement qu'Oracle à Saint-Pétersbourg avait une très faible expertise de bas niveau dans le développement de Java Runtime, dans le développement de compilateurs, dans le développement de systèmes Oracle Cloud-service. Et cette expertise d'Oracle a migré vers BellSoft. Aujourd'hui, notre société développe le Java Runtime, nous sommes un contributeur OpenJDK actif, nous développons les compilateurs gcc et llvm, nous contribuerons à la pile Apache, Graal. Nous sommes engagés dans la construction de systèmes d'analyse de Big Data, de systèmes de recommandation et avons construit un petit projet sur l'IoT, pour collecter des données à partir d'appareils du monde réel. À un moment donné, nous avons vu qu'Oracle avait cessé de publier une distribution Java pour les plates-formes Arm, et nous avons publié notre propre distribution, qui s'appelait Liberica JDK pour Raspberry Pi. Depuis lors, nous l'avons soutenu avec succès.
Examinons de plus près. Qu'est-ce qu'une pile Apache, par exemple?
Nous avons commencé à contribuer à la Fondation Apache avec Hadoop - beaucoup est lié à certaines parties de ce projet. OpenJDK et les grands projets Apache, bien que pas directement, mais sont fortement interconnectés.
Pourquoi tout cela pourrait-il être nécessaire? Par exemple, certaines classes qui les ralentissent peuvent-elles être overclockées?
Oui, c'est l'un des domaines sur lesquels nous travaillons - l'amélioration de la productivité. Par exemple, les pièces spécifiques à la plate-forme, dont l'accélération dans OpenJDK peut aider à accélérer Hadoop. Si vous êtes intéressé, nous pouvons en parler.
Lorsque vous résolvez des problèmes de performances, il est logique de voir quelque chose de proche. Il y a peut-être le même problème quelque part. Vous voyez très souvent qu'après avoir corrigé à un endroit, vous devez corriger à quelques endroits, de sorte qu'en général, cela s'améliore. Parfois (et très souvent) l'optimisation des performances se décompose en contributions à plusieurs projets. Si vous voulez améliorer, par exemple, les performances de la checksum
de checksum
, vous regardez tout en bas de la pile. Disons que c'est Java. Si vous regardez un peu plus haut, ce sera Hadoop, Spark ou autre chose. Habituellement, en comprenant comment améliorer un endroit, vous pouvez comprendre comment le faire dans un autre endroit. Bien sûr, il est logique dans ce cas d'aller s'y améliorer aussi.
Tout le monde sait que vous êtes Liberica :-) Parlons-en.
Oui, nous sommes Liberica JDK. Liberica a commencé avec le fait que nous avons vu qu'il n'y a pas de port pour ARM32, et cela doit être fait de toute urgence, car le Raspberry Pi a été laissé sans Java 9 et Java 10. C'était en 2017 lorsque Java 9. est sorti. Maintenant, Liberica JDK prend en charge de nombreuses architectures et les systèmes d'exploitation.
Il est devenu clair qu'Oracle n'allait pas développer davantage le code pour Arm, et nous avons commencé à distribuer activement et à publier notre distribution pour combler cet écart. Il est devenu clair que les gens en avaient besoin.
Donc, maintenant il y a plusieurs distributions d'Armes?
Oui, il existe plusieurs distributions Java pour Arm, elles sont différentes. Dans le nôtre, vous obtenez ce qui faisait partie du kit de distribution de port Oracle. Notre distribution a JavaFX, entrée / sortie de périphérique et une API intégrable. Il s'agit d'un package qui fonctionne avec des modules, à commencer par JDK 9. En utilisant un système modulaire, vous pouvez créer le Runtime comme vous le souhaitez. Si vous le souhaitez, vous pouvez créer un petit runtime de 16 mégaoctets. Si vous souhaitez activer plus de fonctionnalités, par exemple un serveur Web, vous devez dépenser environ 32 mégaoctets d'espace statique. Vous pouvez obtenir un Runtime fonctionnel pour vos besoins.
Pour autant que je sache, nous parlions de serveurs de l'armée. Pour ne pas dire que nous les avons utilisées massivement. Parlez-moi du serveur? Dans la vraie vie, existent-ils du tout?
Cette histoire existe depuis de nombreuses années. Le tout premier serveur Arm a été créé sur la base de l'architecture ARMv7 32 bits. C'était une boîte terriblement bruyante, qui ne fonctionnait pratiquement pas, car le BIOS, Linux n'y fonctionnait pas, tout disparaissait après quelques heures. L'entreprise qui l'a lancée, Calxeda, a fermé au fil du temps. Mais l'idée de développer une architecture alternative pour les serveurs a été semée dans la société. Arm a finalement publié une nouvelle spécification pour l'architecture ARMv8, qui prend en charge les 32 et 64 bits. Sur la base de la version 64 bits de cette spécification, plusieurs fabricants construisent désormais leurs implémentations de processeur pour les serveurs. Par exemple, Ampere Computing, Cavium, qui est maintenant acheté par Marvell et Qualcomm. Et il y a une autre société - AMD, il y a quelques années, a également publié des serveurs basés sur l'architecture Arm. À mon avis, ils continuent de le faire.
Si vous supprimez une lettre L de Marvell, vous obtenez des super-héros. Une bonne façon de se souvenir des noms de tous ces bureaux.
Les super-héros sont en fait Cavium / Marvell, car ce sont eux qui ont réussi à assembler la puce la plus productive jusqu'à 128 threads sur un processeur, et des performances comparables ou meilleures avec Xeon Gold et Platinum. Vous pouvez mettre plusieurs processeurs sur un même serveur, vous obtenez une chose monstrueuse avec une mémoire rapide qui peut être utilisée pour des tâches sérieuses.
Comment la limite d'évolutivité augmente-t-elle pour les applications courantes? Combien de CPU est-il judicieux de coller sur un seul serveur?
Tout dépend de la tâche pour laquelle vous souhaitez créer le serveur. Différents fabricants se concentrent sur différentes niches, mais si nous parlons de Cavium / Marvell, ils se concentrent clairement sur la niche informatique, où vous devez rapidement mâcher une grande quantité de données en parallèle. Ils ne se concentrent pas sur les très grandes performances d'un seul thread (en même temps, c'est très bon), à savoir, en général, que ce CPU affiche des performances élevées avec une faible consommation.
Pourquoi armer, pas Intel? Nous avons de merveilleux serveurs Intel, pourquoi trouver autre chose?
Il est difficile et facile de répondre à cette question. Premièrement, un lieu saint ne se trouve pas être vide. Nous voyons qu'AMD essaie également de construire une sorte d'Intel alternative pour les applications serveur. Et bien sûr, il y aura toujours une partie alternative du marché de fabricants alternatifs.
Personne ne veut vivre avec un monopoleur.
Très vraie remarque. Tous les consommateurs de processeurs, et ce sont principalement des fournisseurs de cloud, souhaitent avoir une alternative. Pour que vous puissiez choisir, comparer le coût avec les coûts et pour des applications spécifiques, choisissez une architecture plus rentable.
Et qu'en est-il des coûts? Combien plus cher que les solutions Intel?
Question difficile. Premièrement, comme l'a dit Alexey, les fabricants suffisent. Il est clair que maintenant les fabricants de processeurs d'armements ne se font pas concurrence, mais rivalisent avec quelqu'un d'autre. Ils occupent des niches légèrement différentes. Si Cavium est un calcul haute performance, Qualcomm est un serveur milieu de gamme, Ampere est un poste de travail ou un serveur bas de gamme.
Si je me souviens bien, le prix du CPU lui-même d'Ampere Computing est de 600 $ à 900 $, et ils rivalisent avec Intel, un CPU coûtant environ 1 500 $. Le cavium est un peu cher. Encore une fois, ils concurrenceront Intel, qui est nettement plus cher. Vous devez comprendre que le prix du serveur n'est pas seulement le prix du CPU. Le prix du serveur est également la mémoire, les disques, le support, la consommation. Si vous gagnez sur un paramètre, par exemple, le coût du CPU - c'est bien, mais vous ne serez qu'un peu moins cher. Si vous gagnez de deux manières, par exemple, en étant moins cher, offrant des performances encore meilleures, ils vous regarderont de plus près. Et si sur trois, par exemple, vous pouvez aussi faire tout cela avec moins de consommation d'énergie, alors c'est déjà une demande de victoire.
En plus du fer et de son support, le support logiciel est également important. Vous ne pouvez pas exécuter sur Arm tout ce que vous faites tourner sur Intel.
Bien sûr. Je dois dire que l'écosystème de logiciels Arm a fait beaucoup de progrès. S'il y a cinq ans, il y avait des problèmes pour soulever un morceau de fer, maintenant il n'y en a plus. Vous venez juste et tout fonctionne pour vous. Tout ce que vous avez l'habitude de travailler - Linux, Docker, Kubernetes, Xen, Java, Hadoop, Spark, Kafka, n'importe quoi.
Et Java? Dites-nous comment cela fonctionne, en quoi est-il différent de celui «habituel»?
Pas différent, c'est son principal avantage. Il est suffisamment productif pour faire face aux tâches assignées à Java pour les serveurs. Vous transférez votre application (j'espère qu'elle n'a pas de partie native, sinon vous devrez la recompiler), sur le serveur Arm, vérifiez les performances et, dans la plupart des cas, réjouissez-vous. Récemment, un article a été publié dans lequel nous comparons les performances du serveur Arm avec le serveur Intel . L'article est paru dans Java Magazine.
Oracle vous a-t-il laissé essentiellement faire de la publicité dans votre propre journal? Sérieusement.
Apparemment, il y a une demande. Il s'avère que les serveurs Java Arm pour les charges de travail Java fonctionnent assez bien. Ils sont identiques, voire meilleurs que les homologues d'Intel.
Qui devrait lire votre article?
Pour ceux qui veulent voir, testez la nouvelle architecture, si elle convient à ses charges. Essayez à la fois Java et ces mêmes serveurs ARM. Drive Arm Server Cloud dans Google, et vous obtenez plusieurs fournisseurs de cloud, vous pouvez détenir une carte et essayer ce dont vous avez besoin.
Java y est-il déjà préinstallé?
Oui Plain OpenJDK.
Est-ce que OpenJDK et votre distribution Liberica sont la même chose? J'ai vu qu'il y a vos engagements - est-ce que c'est quelque chose d'autre?
En général, l'histoire des ports Arm et OpenJDK est assez intéressante et ornée. Initialement, Oracle a développé le port Arm, et lorsque Arm a publié l'architecture ARMv8, un port supplémentaire a été ajouté à ce port Arm qui a permis à Java de s'exécuter sur ARMv8. Parallèlement à cela, Red Hat a également travaillé dans cette direction et a versé son port dans OpenJDK pour cette architecture. Il se trouve que la communauté s'est concentrée sur le port de Red Hat. Par conséquent, nous avons maintenant l'accessoire qui était dans OpenJDK pour le port ARM32, qui a en fait dupliqué la fonctionnalité du port aarch64 - nous le supprimerons de là dans JDK 12. En faisant cela, nous avons JEP 340.
Je dois dire qu'Oracle a versé dans OpenJDK toutes ses réalisations à partir de tous les ports Arm intégrés avant d'arrêter le support. Maintenant, toutes les fonctionnalités d'Arm créées dans Oracle sont intégrées.
C'est logique, car ce sont les fabricants de fer et les fabricants de spécifications qui devraient être avant tout intéressés pour que l'écosystème logiciel fonctionne sur leur matériel et soit compatible avec leurs spécifications. Pour cela, le code doit être ouvert.
J'ai vu des infographies montrant des chiffres saisissants qu'une certaine société BellSoft, située à Saint-Pétersbourg, a inondé un grand nombre de commits.
Oui, nous sommes dans le top 5 des committers OpenJDK. Naturellement, Oracle est hors compétition, il y a environ 4 000 commits par an.
Viennent ensuite Red Hat, SAP, Google et BellSoft. Nous n'avons pas touché Google du tout. Et juste après nous, IBM.
Quel pourcentage de vos employés travaillaient chez Oracle?
100 pour cent. BellSoft est composé d'anciens employés d'Oracle.
Il s'agit d'une concurrence déloyale car Google n'est pas composé à 100% d'employés Oracle. Quel genre de commits, dites-moi? Comment réussir un tel succès? Comment entrer dans le top 5 des committers?
Nous travaillons dans plusieurs directions. Maintenant, la direction principale où nos engagements vont est le port ARM64, qui est le même port de serveur. C'est intéressant pour les producteurs de fer. Ils souhaitent que Java travaille rapidement sur leur matériel, pour faire face aux charges. La deuxième chose que nous engageons est le port ARM32, que nous prenons en charge, c'est le port intégré. Le troisième est des engagements visant à soutenir, réparer et améliorer la fonctionnalité globale de Java.
Nous venons de parler de 64 bits sur les serveurs. Pourquoi le port 32 bits est-il toujours vivant?
Parce qu'il est utilisé en embarqué.
Parce que tant d'entreprises ont implémenté un CPU pour l'architecture ARMv7 pour les applications embarquées. Ils ont un grand nombre de puces dans leurs entrepôts. Si la mémoire me sert bien, alors de toute la variété de ces puces est ARM32, la plus populaire est ARMv5. Cette architecture existe depuis de nombreuses années, mais néanmoins, les CPU sont assez bon marché, et les fabricants envisagent toujours de créer de nouveaux appareils sur cette architecture.
De quels montants parlons-nous lorsque nous parlons de construction? Une personne ordinaire peut-elle acheter quelque chose pour elle-même et expérimenter?
Le plus populaire de la plate-forme ARM32 est le Raspberry Pi, à partir de la deuxième version - les deuxième et troisième versions, plus tout cela est pris en charge par le port ARM32. L'une de nos distributions est celle pour ARM32 qui est testée et fonctionne sur le Raspberry Pi. Nous constatons qu'il s'agit de la plate-forme la plus courante pour un large public, et nous publions donc le port spécifiquement pour le Raspberry Pi. Nous avons des ports plus spécifiques pour le fer hautement spécialisé, mais c'est une autre histoire.
Vous n'avez peut-être pas besoin d'acheter. Vous pouvez voir ce que vous avez dans votre routeur domestique. Il est très probable qu'il y ait quelque chose comme ça.
Dans quelle mesure les compétences des développeurs doivent-elles y correspondre?
Vous devez être un développeur Java.
Avez-vous besoin de moyens délicats pour connaître la loi de Kirchhoff afin de coder?
Vous avez juste un ordinateur auquel vous pouvez vous connecter via SSH. Pas besoin de le flasher. Vous prenez une carte microSD avec une image Linux pour le Raspberry Pi, l'insérez, et tout commence. C'est le principal avantage du Raspberry Pi par rapport à tous les autres ordinateurs à carte unique. La simplicité de sa configuration, l'obtention d'un système fonctionnel.
Et comment travailler avec des capteurs? Nous faisons tout cela pour le bien des systèmes externes, non?
Le Raspberry Pi possède un système GPIO et des broches auxquelles vous pouvez connecter n'importe quoi. Sur quoi généralement tous les passionnés connectent tous les périphériques au Raspberry Pi.
À quoi ressemble l'API? Qu'est-ce qui doit être écrit, par exemple: «obtenez-moi un numéro du thermostat»?
Vous devez lire la fiche technique du thermostat et comprendre ce que sont les registres, comment l'initialiser, comment le configurer. Si I2C, appelez la méthode de configuration, passez-y tous les paramètres. Dites-lui ensuite i2c.open et utilisez-le comme un objet Java.
Est-il possible d'écrire de beaux emballages d'objets autour des thermostats pour travailler dans un modèle purement objet? Peut-on le faire pour ne plus lire la fiche technique, la fermer avec une façade?
Ce serait bien si le fabricant de ce capteur faisait une configuration prête à l'emploi, et nous, en tant que programmeurs Java, l'avons simplement prise et utilisée. La bibliothèque fonctionne avec un capteur, une bibliothèque pour travailler avec un autre capteur. Une telle bibliothèque ou quelque chose de proche s'appelle Pi4J. Il se développe maintenant moins rapidement qu'au temps où Oracle déplaçait Java intégré, mais il n'est toujours pas mort, des mises à jour apparaissent périodiquement. Il y a un choix: soit travailler avec une chose qui est dans OpenJDK - GPIO, soit travailler avec la bibliothèque Pi4J.
Si je suis un fabricant de matériel, je ne sais rien de Java, mais j'aimerais que les programmeurs Java l'utilisent, qui dois-je contacter? Pour vous contacter? Ou y a-t-il des spécialistes qui font cela?
Oui, nous sommes de tels spécialistes.
Jusqu'à présent, nous n'avons pas couru loin. Je me souviens que vous aviez certains de vos JEP, non?
OpenJDK version 11 comprend 17 JEP. 14 a été créé par Oracle, 1 - Google, 1 - Red Hat, 1 - BellSoft en collaboration avec Cavium. Notre JEP est un mélange d'améliorations des performances Java sur la plate-forme ARM64 pour des charges de travail spécifiques. JEP, respectivement, est appelé Améliorer Intrinsics Aarch64 . En bref, nous avons amélioré les performances des opérations avec String, avec des tableaux, et un peu avec les mathématiques et la trigonométrie.
Que sont les intrinsèques? Tout le monde ne le sait pas.
Lorsque la machine virtuelle considère le sinus, au lieu d'exécuter le code Java direct, elle peut substituer l'insert d'assembleur optimisé à une architecture spécifique.
Qui appelle directement le processeur qui a la commande sine?
Qui le calculera selon un algorithme complexe. Il existe des intrinsèques qui appellent une sorte de commande d'assembleur. Par exemple, les intrinsèques associées au calcul des sommes de contrôle. De telles instructions d'assemblage existent pour presque toutes les architectures. Il existe des éléments intrinsèques plus complexes lorsque, pour obtenir une bonne amélioration des performances, écrivez de nombreuses pages d'assembleur.
Et le chiffrement, est-ce dans le matériel?
Oui, il s'agit généralement d'un appel aux instructions existantes d'un processeur particulier. Parfois - travaillez avec des extensions sur ces puces là où elles se trouvent.
Revenir à votre JEP: comment déterminer quel code est si chaud qu'il en vaut la peine si hardcode?
Grande question. Lorsque nous avons commencé à optimiser quelque chose pour les plates-formes ARM64, nous ne disposions pas d'un grand nombre d'outils, à part perf. Oui, et il ne travaillait pas partout. Il n'y avait pas d'implémentation JFR pour le port ARM64; Oracle ne l'avait pas encore mis en Open Source à ce moment-là. Divers outils de mesure des performances que nous utilisions, par exemple, async-profiler, honnête-profiler - ils ne fonctionnaient pas non plus pour les plates-formes ARM64. La première chose que nous avons faite a été d'obtenir tous ces outils sur cette architecture.
Pourquoi ne fonctionne pas hors de la boîte?
Parce qu'il y a une sorte de partie spécifique au CPU.
Ensuite, exécutez ces outils sur la charge de travail que vous essayez d'optimiser, regardez l'écran pendant longtemps, essayez de comprendre quelles méthodes sont chaudes là-bas, quels endroits sont chauds en elles. Il existe des cas simples où certaines insertions d'assembleur pour une architecture spécifique ne sont pas implémentées. Dans ce cas, le repli se produit dans le code Java. Juste en implémentant ces insertions d'assembleur, vous pouvez obtenir une augmentation des performances. Il existe des endroits plus compliqués lorsque vous devez comprendre le nouvel insert d'assembleur dont vous avez besoin en Java pour créer pour toutes les architectures. Un tel travail.
Sam jeu de données où trouver? Dégonfler tout le github et l'exécuter sous JIT?
Il est clair que certains benchmarks ou charges de travail sont en cours d'optimisation. Benchmarks bien connus - SpecJBB, SpecJVM. Il existe des charges de travail spécifiques qui intéressent des clients spécifiques. Exécutez simplement ces charges de travail et examinez les goulots d'étranglement.
Tous ces SpecJVM sont des tests très anciens, non? Qu'en est-il des nouveaux lambdas, des ruisseaux, des grandes dates?
Rien. Ce n’est pas là.
Et où l'obtenir?
Nouvelles charges de travail.
Par exemple, la pile apachevsky?
Oui Hadoop TeraSort, . .
, ? , JEP.
, , . , , , . , , . , , . Panama, Intel.
, ? , , - ?
Math.sin
, Java- sin
.
- , sin
?
Oui , .
- , , ?
C2, .
- . , ?
.
, Linaro Connect OpenJDK ARM64. Linaro Foundation Arm-.
?
Arm, . .
?
. . Joker, .
!
, . floating point. , , , . — , . , , — . , .
. , , ?
Oui Arm … , — . , . - - , — . , , . , , . , Java- , .
, - , . ?
OpenJDK BellSoft.
, , ? ? Oracle, . JVM-?
, OpenJDK. ()
, 250 . ?
, 250 . .
— ? .
, . . , — . - .
, ?
.
?
. . , - , , . , , , . - . , . , , . , OpenJDK .
?
Mailing list. - mailing list, .
-?
Jira. OpenJDK Jira, , , .
Jira Jira, , ?
OpenJDK . , Jira.
? , , , , , Arm?
Arm, , , . shared-, , . , . .
, . , .
, . HotSpot, , , . , , - — .
- ?
Oui HotSpot tiers. smoke- . , , . , performance-, stress-.
. , , JDK, . JDK, . , ?
JDK, , JVM. JVM 4 : runtime, serviceability, garbage collector, compiler. - . , runtime. - out of order execution, , GC . , JIT, . community OpenJDK — JIT.
, , ?
, . , . . . , -, , .
? ? ? , , - ?
. , .
, , - , . .
. , OpenJDK Arm. , , IT. -, , Arm . , Arm, Arm , . , OpenJDK, Arm. , , . Arm Intel SPEC-. , . . !
, ?
, ?
, .
. . , ARM64? . , Arm .
.
— , , -, . ? - , Arm?
, .
?
Arm . . , , ? . .
, . , , , . - 10 , GPU - , . Cloud- . , , -. GPU, CPU. -, HTTP 404. , . , .
, - , ? - ?
. , . 30 ? . , . - , , . : 20% , 20%, — 10%, - . , Arm .
, Java, , . , , .
Arm , BellSoft — Arm, . OpenJDK, - . Liberica Liberica Arm 32 64, Liberica Linux (64 ), Windows Liberica Mac. Liberica Solaris Sparc. .
Liberica Mac? -.
? Oracle , … . ?
?
, Oracle. , Java- .
Java- .
, . , .
.
Oui -, support . - — , , Cloud-. , , - , .
, Oracle JDK , API. -XX:+UnlockCommercialFeatures
. , . , Oracle , .
, Oracle - Oracle, . . Java , .
, , OpenJDK . . BellSoft , , .
, , . . , , OpenJDK — .
!
. , — . - ?
. , , , . .
- OpenJDK.
. ?
Liberica, . Raspberi Pi, Linux-. , Java, -.
Joker, , BellSoft — .
. , , . , :-) Joker — .
, . !
. Joker 2018 «, ARM? , » . .