Question

Je dispose actuellement d'une application serveur fortement multithread et j'achète un bon allocateur de mémoire multithread.

Jusqu'à présent, je suis partagé entre:

  • um's du soleil
  • tcmalloc de Google
  • L'allocateur de blocs de construction de threads d'Intel
  • Le trésor d'Emery Berger

D'après ce que j'ai trouvé, le trésor pourrait être le plus rapide, mais je n'en avais jamais entendu parler avant aujourd'hui, alors je suis sceptique si c'est vraiment aussi bon qu'il y paraît. Quelqu'un at-il une expérience personnelle d'essayer ces allocateurs?

Était-ce utile?

La solution

J'ai utilisé tcmalloc et lu à propos de Hoard. Les deux ont des implémentations similaires et réalisent une mise à l'échelle des performances à peu près linéaire par rapport au nombre de threads / CPU (selon les graphiques sur leurs sites respectifs).

Donc: si les performances sont vraiment cruciales, faites des tests de performances / charge. Sinon, lancez simplement un dé et choisissez l'un des éléments énumérés (pondéré par la facilité d'utilisation sur votre plate-forme cible).

Et à partir du lien de trshiv , il ressemble à Hoard, tcmalloc, et ptmalloc sont tous à peu près comparables pour la vitesse. Globalement, tt ressemble à ptmalloc est optimisé pour prendre le moins de place possible, Hoard est optimisé pour un compromis entre vitesse et utilisation de la mémoire et tcmalloc est optimisé pour une vitesse pure.

Autres conseils

La seule façon de déterminer le bon allocateur de mémoire pour votre application est d’essayer quelques-uns. Tous les allocateurs mentionnés ont été écrits par des gens intelligents et vont battre les autres sur un micro-critère particulier ou sur un autre. Si tout ce que votre application fait toute la journée est malloc un morceau de 8 octets dans le fil A et le libère dans le fil B, et n'a pas besoin de gérer quoi que ce soit d'autre, vous pouvez probablement écrire un allocateur de mémoire qui bat le pantalon ceux énumérés jusqu'à présent. Ce ne sera tout simplement pas très utile. :)

J'ai une certaine expérience de l'utilisation de Hoard dans lequel je travaille (suffisamment pour qu'un des bogues les plus obscurs corrigés dans la récente version 3.8 ait été trouvé à la suite de cette expérience). C'est un très bon allocateur - mais sa qualité dépend de votre charge de travail. Et vous devez payer pour Hoard (bien que ce ne soit pas trop cher) pour pouvoir l'utiliser dans un projet commercial sans que votre code GPL ne soit enregistré.

Un ptmalloc2 très légèrement adapté est l'allocateur derrière le malloc de glibc depuis un certain temps déjà, et il est donc incroyablement utilisé et testé. Si la stabilité est importante par-dessus tout, c'est peut-être un bon choix, mais vous ne l'avez pas mentionnée dans votre liste, alors je suppose que c'est absent. C’est terrible pour certaines charges de travail, mais il en va de même de tout malloc à usage général.

Si vous êtes prêt à payer pour cela (et le prix est raisonnable, selon mon expérience), SmartHeap SMP est également un bon choix. La plupart des autres allocateurs mentionnés sont conçus pour être des remplacements de remplacement malloc / free new / delete pouvant être LD_PRELOAD. SmartHeap peut également être utilisé de cette façon, mais il inclut également une API complète liée aux allocations qui vous permet d'ajuster vos allocateurs au contenu de votre coeur. Dans les tests que nous avons effectués (là encore, très spécifiques à une application particulière), SmartHeap était à peu près identique à Hoard en ce qui concerne les performances lorsqu'il remplissait les fonctions de centre commercial insuffisant. la vraie différence entre les deux est le degré de personnalisation. Vous pouvez obtenir de meilleures performances à moindre utilisation générale de votre allocateur.

Et selon votre cas d'utilisation, un allocateur multithread à usage général peut ne pas être ce que vous souhaitez utiliser. si vous êtes constamment malloc & amp; Si vous libérez des objets de la même taille, vous pouvez écrire simplement un allocateur de brames simple. L'attribution de brames est utilisée à plusieurs endroits du noyau Linux correspondant à cette description. (Je vous donnerais quelques liens plus utiles, mais je suis un "nouvel utilisateur" et Stack Overflow a décidé que les nouveaux utilisateurs ne sont pas autorisés à être aussi utiles dans une seule réponse. Google peut aider assez bien, cependant.)

Personnellement, je préfère et recommande ptmalloc en tant qu’allocateur multithread. Hoard est bon, mais lors de l'évaluation que mon équipe a faite entre Hoard et ptmalloc il y a quelques années, ptmalloc était meilleur. De ce que je sais, ptmalloc existe depuis un certain nombre d'années et est assez largement utilisé comme allocateur multithread.

Vous pouvez trouver cette comparaison .

C’est peut-être une mauvaise façon d’aborder ce que vous demandez, mais vous pourriez peut-être utiliser une tactique différente. Si vous recherchez un allocateur de mémoire très rapide, vous devriez peut-être vous demander pourquoi vous devez passer tout ce temps à allouer de la mémoire alors que vous pourriez peut-être vous contenter d'allouer une pile de variables. L'allocation de pile, bien que beaucoup plus ennuyeuse, réalisée correctement peut vous faire économiser beaucoup en matière de conflit mutex, tout en préservant d'étranges problèmes de corruption de mémoire dans votre code. En outre, vous avez potentiellement moins de fragmentation qui pourrait aider.

Nous avons utilisé la réserve sur un projet pour lequel j'ai travaillé il y a quelques années. Cela semblait bien fonctionner. Je n'ai aucune expérience avec les autres allocateurs. Il devrait être assez facile d’essayer différents modèles et de faire des tests de charge, non?

L'allocateur locklessinc est très bon et le développeur est réactif si vous avez des questions. Il a écrit un article sur certaines des astuces d'optimisation utilisées, il s'agit d'une lecture intéressante: http://locklessinc.com / articles / allocator_tricks / . Je l'ai déjà utilisé avec d'excellents résultats.

entrer la description de l'image ici

Probablement une réponse tardive à votre question, mais

pourquoi faire des mallocs si vous avez des hauts performances?

Le meilleur moyen serait de créer un malloc d'une grande fenêtre de mémoire lors de l'initialisation, puis de créer un gestionnaire de mémoire léger qui louerait les fragments de mémoire au moment de l'exécution .

Cela évite toute possibilité d’appel système si votre segment de mémoire est étendu.

Vous pouvez essayer ltalloc (un allocateur de mémoire global à usage général avec la rapidité d'un allocateur de pool rapide).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top