10
votes

Combien de processeurs sont nécessaires avant que Erlang ne soit plus rapide que Java à une seule fois

Je suis actuellement en utilisant Java, j'ai lu beaucoup de choses sur Erlang sur le net, et j'ai 2 grandes questions:

  1. Combien plus lent (le cas échéant) seront Erlang être plus simple, Java?
    Je suppose ici que Java va être plus rapide de la tirs de barrage repères sur le net (Erlang ne le fait pas bien). Alors, combien d'autres processeurs Vais-je besoin de faire briller Erlang sur Java seul thread (dans ma situation particulière, étant donné ci-dessous)?

  2. Après avoir lu autour d'environ Erlang pendant un certain temps, je l'ai frappé sur un certain nombre de commentaires / messages qui disent que la plupart des grands systèmes Erlang contiennent une bonne quantité de C / C ++.
    Est-ce pour des raisons de vitesse (mon hypothèse) ou autre chose? à savoir pourquoi est-ce nécessaire?

    J'ai lu sur le nombre de processeurs dans la plupart des machines vont et filetage des modèles étant difficile (je suis d'accord), mais je cherche à savoir quand la « ligne » va être franchi pour que je puisse changer la langue / paradigme au bon moment.

    Un peu de fond / contexte: Je suis côté serveur travaille sur les services Java qui sont très lié au processeur et facilement en parallèle. Ceci est dû, en général, une seule mise à jour entrant (via TCP) déclenchant un changement à plusieurs sorties (100s) de.

    Les calculs sont généralement assez simples (quelques boucles, beaucoup seulement de l'arithmétique) et les entrées arrivent très vite (100 / s).

    À l'heure actuelle, nous courons sur 4 machines CPU et l'exécution de plusieurs services sur chaque (si multi-threading est assez inutile et Java semble courir plus vite, sans les blocs de synchronisation, etc nécessaire pour le rendre multi-thread). Il y a maintenant une forte pression pour la vitesse et nous avons maintenant accès à 24 machines de traitement (par processus si nécessaire) Je me demande donc la meilleure façon de procéder -. Massivement multi-thread Java ou quelque chose plus facile à coder, comme Erlang


1 commentaires

J'ai lu votre question complète et a édité ma réponse pour vous donner une discussion pour que vous voyiez ce que le cœur de la décision est.


5 Réponses :


6
votes

Avez-vous comparé le coût du nouveau matériel par rapport au coût de la reconversion du personnel à Erlang et à ré-archiver vos logiciels dans une nouvelle langue?

Je ne sous-estimerais pas les frais de recyclage de vous-même (ou d'autres personnes) et le coût de l'embauche de personnes conversant à Erlang (qui vont être un lot plus difficile à trouver que les personnes Java). Les serveurs coûtent évidemment en termes de coûts de stockage / de leurs coûts de stockage / maintenance, etc., mais ils sont toujours beaucoup moins chers que le personnel qualifié. Si vous pouvez progresser et rester évolutif tout en utilisant vos compétences actuelles, je soupçonne que c'est l'approche la plus pragmatique.


9 commentaires

(+1) Tout d'abord, Erlang est une pièce complexe de logiciels et l'utilise au maximum, elle nécessite beaucoup de lecture. Deuxièmement, le code source peut être très méchant à lire - c'est-à-dire pour écrire des pilotes et modifier le sous-système IO.


Oui. Je ne veux pas que ce qui précède soit lu comme une déclaration contre Erlang. Je pense que ça a l'air fascinant. Cependant, il y a un coût associé.


Fait intéressant, nous avons essayé le recyclage interne. Nous avons eu une équipe de 4 à la vitesse (raisonnable?) Avec Erlang dans les 3 semaines. Construit un système de change de trading qui semblait fonctionner suffisamment pour prouver le point. Personnellement, je pense que le problème de recyclage est FUD comparé à l'obtention des personnes Java qui comprennent en fait une programmation multi-filetée et ses pièges (dont j'ai rencontré très peu).


Je ne veux pas dire que c'est fud. Mais là est un coût associé.


Je suis aussi d'accord avec Davec aussi, et une fois que vous avez été lancé avec Erlang ... eh bien, je crois que c'est la meilleure chose depuis le pain tranché. Java et C #, même s'ils ont construit des primitives et des idiomes de multi-programmation - il est moins adapté à celui-ci, alors C ou C ++ (et vous avez besoin de gourou pour le retirer correctement avec ces langues: /). Erlang prend toute cette merde avec les nouvelles poutres SMP - et à condition que vos besoins se situent dans les bibliothèques fournies ou que vous disposez des développeurs de contribuer à ce que vous manquez - bien vous verrez l'accélération 10x que Armstrong Raves à propos de: D


Je dois être en désaccord avec cet erlang est complexe ou il est difficile de lire difficile à lire. Ce n'est plus difficile que pour un programmeur C de longue date de regarder Java pour la première fois. Après 1 livre, quelques screencasts et 2-3 semaines, je commençais déjà à contribuer aux correctifs et aux modifications des projets open source. Et j'avais commencé à faire des choses assez complexes avec une programmation de socket connectée à notre serveur Asterisk. Le point est que ce que vous appelez «personnel qualifié» n'est vraiment pas qualifié si elles sont incapables d'apprendre de nouvelles choses. Il ne faut pas être un "programmeur Java" mais juste un programmeur.


Je devrais clarifier (au cas où quiconque est dans tout doute) que je ne fais pas d'affirmation de la complexité d'Erlang ni de tout autre attributs - simplement qu'il existe un coût associé. Commutation / Retoring, etc.


@Brian Agnew: Je ne prétendais pas que vous étiez sur une mission fud de certaines sortes. :) Je dirais cependant que si ce sont des préoccupations énormes, vous pouvez avoir un problème plus important. Cela signifierait que votre entreprise est statique et incapable de faire des modifications mineures pour résoudre le mieux les problèmes à la main. Ce ne devrait pas être une chose coûteuse ni difficile pour une entreprise de demander à quelques programmeurs d'apprendre les bases d'une langue différente. S'il s'agit d'un problème, vous pouvez avoir des programmeurs insuffisants simplement indiqués. Quel atelier de réparation automobile engagerait un mécanicien qui ne peut jamais fonctionner avec la Dodge Ram 1985?


@Jon - Oui, mais là est un coût associé à cela (aussi mineur). C'est quelque chose que vous devez déterminer et facturer (que ce soit le coût d'un livre d'origine, un cours d'apprentissage, de recruter un tuteur ou 3 semaines d'homme de productivité perdue).



7
votes

Comme il s'agit d'une charge de travail arithmétique et vous avez déjà fait le travail de fractionnement du code dans des processus de service séparé, vous ne gagneriez pas beaucoup d'Erlang. Votre travail semble adapté à Java confortablement. Erlang est bon à de minuscules transactions - telles que MSG commutation ou servant des pages Web statiques ou simples-dynamiques. Non - à la charge de la charge de travail de Number-Crunching ou de base de données.

Toutefois, vous pouvez créer des bibliothèques et bases de données numériques externes et utilisez Erlang comme interrupteur MSG: D C'est ce que Couch-dB fait: P

- Edit -

  1. Si vous déplacez vos opérations arithmétiques en un erlang d'Erlang Async-io, Erlang sera aussi bon que la langue de tir de la langue - mais avec 24 CPU peut-être que cela n'aura peut-être pas d'importance; La base de données Erlang est procédurale et donc assez rapide - ceci peut être exploité dans votre application à la mise à jour de 100 entités sur chaque transaction.

  2. Le système d'exécution Erlang doit être un mélange de C et C ++ car (a) l'émulateur Erlang est écrit en C / C ++ (vous devez commencer quelque part), (B), vous devez parler au noyau Pour faire des fichiers ASYNC IO et Network io, et (c) certaines parties du système doivent être la fast -ég, le backend du système de base de données (amnésie).

    - Discussion -

    Avec 24 CPU dans une topologie de 6 cèles à 6 noyau * 4 CPU à l'aide d'un bus de mémoire partagé - vous avez 4 entités numa (les processeurs) et une mémoire centrale. Vous devez être sage sur le paradigme, l'approche multi-processus sans partagée pourrait tuer vos bus de mémoire.

    Pour contourner cela, vous devez créer 4 processus avec 6 threads de traitement et lier chaque fil de traitement le noyau correspondant dans la CPU correspondante. Ces 6 threads ont besoin de collaborer multi-threading - erlang et Lua Ayez-en cette orlang A-t-il de manière difficile, car il a un planificateur complet dans le cadre de son exécution qu'il peut utiliser pour créer autant de processus que vous le souhaitez.

    Maintenant, si vous deviez partitionner vos tâches sur les 4 processus (1 par processeur physique), vous seriez un homme heureux, mais vous exécutez 4 Java VM de faire (probablement) un travail sérieux (yuck, pour de nombreuses raisons). Le problème doit être résolu avec une meilleure capacité de trancher et de couper le problème.

    Dans le système Erlang OTP, il a été conçu pour des systèmes réseau robustes redondants, mais il se dirige maintenant vers des processeurs numa-esques identiques. Il possède déjà un émulateur SMP de Kick-Ass, et cela deviendra Numa au courant aussi vite. Avec ce paradigme de programmation, vous avez une bien meilleure chance de saturer vos serveurs puissants sans tuer votre bus.

    Peut-être que cette discussion a été théorique; Cependant, lorsque vous obtenez une topologie de 8x8 ou 16x8, vous serez prêt pour cela. Mon réponse est donc quand vous avez plus de 2 - moderne - CPU physiques sur votre carte mère, vous devriez probablement envisager un meilleur paradigme de programmation.

    Comme exemple d'un produit majeur à la suite de la discussion ici: Server SQL de Microsoft est CPU Niveau Numa-Cays-Cays dans la couche SQL-OS sur laquelle le moteur de base de données est construit.


0 commentaires

-6
votes

Si vous obtenez 100 par seconde, mais ils prennent 100 personnes comment peut-il rester up? Peut-être que je répète cette partie, mais de toute façon, à moins que ce soit des milliers ou des millions de demandes une seconde, votre code de synchronisation ne devrait pas prendre de longues. Si c'est le cas, vous faites quelque chose de mal, éventuellement verrouillant pendant que vous exécutez tout le travail ou quelque chose.

Pour le code multithreadé, une langue de niveau encore plus élevée est probablement une erreur. Même si vous écrivez la partie de la demande dans Erlang ou quel que soit le multithreading, devrait probablement être en Java ou passer à C ++ si la performance devient vraiment un problème.


0 commentaires

2
votes

La question de la vitesse en matière de programmation est aussi complexe qu'une question peut être complexe. Les avocats Java peuvent indiquer beaucoup de domaines et prétendre être la plus rapide et ils seraient 100% corrects. Les défenseurs de rubis / python pointent sur un autre ensemble de paramètres et prétendent être plus rapides et ils seraient également corrects. Les avocats Erlang indiquent ensuite des connexions simultanées et prétendent être la plus rapide lorsqu'ils traitent des centaines ou des milliers de connexions ou de calculs simultanés et que ce ne serait pas incorrect non plus.

En regardant la description de base du projet en question, il me semble que Erlang serait un ajustement parfait pour vos besoins. Ne sachant pas les détails que je dirais que cela serait en fait un joli programme simple Erlang et pourrait être fait en très peu de temps.


0 commentaires

0
votes

Cela dépend de plusieurs facteurs. La réponse rapide est que vous devrez comparer chaque programme différent pour comprendre où se trouve ce filigrane de quescence.

Voici certains des aspects pertinents pouvant avoir une incidence sur ce rapport de prestations:

1) Dépendances de calcul: Si le flux logique contient de nombreuses dépendances à des ressources externes (SGBD, accès disque, réseau). Plus la quantité de dépendances de calcul est divisible dans le traitement simultané, plus l'avantage d'adopter une plate-forme de calcul distribuée telle que Erlang.

2) Atomicité de flux logique: Si votre programme doit dépenser une grande quantité de temps de calcul sur un seul contrôle de flux synchrone séquentiel et qui ne peut pas être décomposé sur des segments logiques plus petits de code. Plus l'atomicité de votre code est grande, moins elle peut être décomposée en flux de propagation de la CPU.

3) SUR LE SOCIÉTÉ DES ÉTATS SUPPORTS: Plus la quantité de données à distribuer dans différentes fonctions, plus la surcharge est élevée, le cadre nécessite simplement de transmettre et de recevoir l'état. En d'autres termes, si vous envoyez de grandes quantités de données répétitives sans une zone de cache commune partagée, les avantages diminueront, bien que cela ait différentes approches en fonction des modèles de programmation adoptés.

Par conséquent, compte tenu des vastes possibilités et des variations basées sur des critères tels que ce qui précède, il n'est pas possible d'avoir une estimation commune acceptable pour tous les scénarios.


0 commentaires