Вопрос

В настоящее время у меня есть многопоточное серверное приложение, и я ищу хороший многопоточный распределитель памяти.

Пока разрываюсь между:

  • Умем Солнца
  • tcmalloc от Google
  • Распределитель строительных блоков потоков Intel
  • Клад Эмери Бергера

Судя по тому, что я нашел, hoard может быть самым быстрым, но я не слышал о нем до сегодняшнего дня, поэтому я скептически отношусь к тому, действительно ли он так хорош, как кажется.У кого-нибудь есть личный опыт тестирования этих распределителей?

Это было полезно?

Решение

Я использовал tcmalloc и читал о Hoard.Оба имеют схожие реализации и оба обеспечивают примерно линейное масштабирование производительности в зависимости от количества потоков/ЦП (согласно графикам на соответствующих сайтах).

Так:если производительность действительно так важна, проведите тестирование производительности/нагрузки.В противном случае просто бросьте кубик и выберите один из перечисленных (взвешенный по простоте использования на вашей целевой платформе).

И из ссылка тршива, похоже, что Hoard, tcmalloc и ptmalloc примерно сопоставимы по скорости.В целом, похоже, что tt оптимизирован для того, чтобы занимать как можно меньше места, Hoard оптимизирован для компромисса между скоростью и использованием памяти, а tcmalloc оптимизирован для чистой скорости.

Другие советы

Единственный способ определить, какой распределитель памяти подходит для вашего приложения, — это попробовать несколько из них.Все упомянутые распределители были написаны умными людьми и обгонят остальных в том или ином микробенчмарке.Если все, что ваше приложение делает в течение всего дня, — это malloc один 8-байтовый фрагмент в потоке A и освобождает его в потоке B, и ему вообще не нужно обрабатывать ничего другого, вы, вероятно, могли бы написать распределитель памяти, который превосходит любые из них. те, которые перечислены на данный момент.Это просто не будет очень полезно для чего-то еще.:)

У меня есть некоторый опыт использования Hoard там, где я работаю (достаточный, чтобы в результате этого опыта была обнаружена одна из наиболее малоизвестных ошибок, устраненных в недавней версии 3.8).Это очень хороший распределитель, но насколько он хорош для вас, зависит от вашей рабочей нагрузки.И вам придется заплатить за Hoard (хотя это не слишком дорого), чтобы использовать его в коммерческом проекте без лицензии GPL на ваш код.

Очень слегка адаптированный ptmalloc2 уже довольно давно является распределителем malloc в glibc, поэтому он невероятно широко используется и тестируется.Если стабильность важнее всего, это может быть хорошим выбором, но вы не упомянули ее в своем списке, поэтому я предполагаю, что ее нет.Для определенных рабочих нагрузок это ужасно, но то же самое верно и для любого malloc общего назначения.

Если вы готовы за это заплатить (и, по моему опыту, цена разумная), SmartHeap SMP это тоже хороший выбор.Большинство других упомянутых распределителей спроектированы как вставные замены malloc/free new/delete, которые можно использовать с помощью LD_PRELOAD.SmartHeap также можно использовать таким же образом, но он также включает в себя целый API, связанный с распределением, который позволяет вам точно настроить распределители по вашему желанию.В проведенных нами тестах (опять же, очень специфичных для конкретного приложения) SmartHeap по производительности был примерно таким же, как и Hoard, когда выступал в качестве замены malloc;реальная разница между ними заключается в степени настройки.Вы можете получить более высокую производительность, чем менее универсальным будет ваш распределитель.

И в зависимости от вашего варианта использования многопоточный распределитель общего назначения может оказаться совсем не тем, что вам нужно;Если вы постоянно выполняете malloc и освобождаете объекты одинакового размера, возможно, вам захочется просто написать простой распределитель блоков.Распределение сегментов используется в нескольких местах ядра Linux, соответствующих этому описанию.(Я бы дал вам еще пару полезных ссылок, но я «новый пользователь», и Stack Overflow решил, что новым пользователям не разрешено быть слишком полезно все в одном ответе.Однако Google может помочь достаточно хорошо.)

Лично я предпочитаю и рекомендую ptmalloc в качестве многопоточного распределителя.Hoard хорош, но в оценке, которую моя команда провела несколько лет назад между Hoard и ptmalloc, ptmalloc оказался лучше.Насколько мне известно, ptmalloc существует уже несколько лет и довольно широко используется в качестве многопоточного распределителя.

Вы можете найти это сравнение полезный.

Возможно, это неправильный подход к тому, о чем вы спрашиваете, но, возможно, можно использовать вообще другую тактику.Если вы ищете действительно быстрый распределитель памяти, возможно, вам следует спросить, почему вам нужно тратить все это время на выделение памяти, когда вы, возможно, могли бы просто обойтись без выделения переменных в стеке.Распределение стека, хотя и более раздражающее, но выполненное правильно, может сэкономить вам массу средств от конфликтов мьютексов, а также исключить странные проблемы с повреждением памяти в вашем коде.Кроме того, у вас потенциально будет меньше фрагментации, что может помочь.

Мы использовали hoard в проекте, над которым я работал несколько лет назад.Казалось, это сработало отлично.У меня нет опыта работы с другими распределителями.Должно быть довольно легко попробовать разные и провести нагрузочное тестирование, не так ли?

Распределитель locklessinc очень хорош, и разработчик ответит, если у вас возникнут вопросы.Он написал статью о некоторых использованных приемах оптимизации, ее интересно прочитать: http://locklessinc.com/articles/allocator_tricks/.Я использовал его в прошлом с отличными результатами.

enter image description here

Вероятно, запоздалый ответ на ваш вопрос, но

зачем делать mallocs, если у вас скачки производительности?

Лучшим способом было бы выполнить malloc большого окна памяти при инициализации, а затем придумать light weight Memory manager Это было lease out the memory chunks at run time.

Это позволяет избежать любой возможности системных вызовов при расширении кучи.

Можешь попробовать таллок (глобальный распределитель памяти общего назначения со скоростью быстрого распределителя пула).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top