Pergunta

Eu tenho atualmente aplicativo de servidor fortemente multi-thread, e eu estou comprando em torno de um alocador de memória bom multi-threaded.

Até agora eu estou dividido entre:

  • umem do Sun
  • tcmalloc do Google
  • blocos de construção de threading da Intel alocador
  • tesouro de Emery Berger

A partir tesouro que eu encontrei pode ser o mais rápido, mas eu não tinha ouvido falar dele antes de hoje, então eu sou cético se é realmente tão bom quanto parece. Alguém tem experiência pessoal experimentar esses alocadores?

Foi útil?

Solução

Eu usei tcmalloc e ler sobre Hoard. Ambos têm implementações semelhantes e ambos alcançar escala desempenho quase linear em relação ao número de fios / CPUs (de acordo com os gráficos em seus respectivos sites).

Assim: se o desempenho é realmente tão incrivelmente importante, em seguida, fazer o teste de desempenho / carga. Caso contrário, basta rolar um dado e escolher um dos listados (ponderada pela facilidade de uso em sua plataforma de destino).

E a partir de trshiv ligação , parece que Hoard, tcmalloc, e ptmalloc são todos mais ou menos comparável para a velocidade. No geral, parece tt como ptmalloc está optimizada para tirar o mínimo espaço possível, Hoard é otimizado para um trade-off de uso de velocidade + memória e tcmalloc é otimizado para velocidade pura.

Outras dicas

A única maneira de realmente dizer que alocador de memória é certo para sua aplicação é tentar um fora alguns. Todos os alocadores mencionados foram escritos por pessoas inteligentes e vencer os outros em um microbenchmark particular ou outra. Se todo o seu aplicativo faz todo o dia é malloc um pedaço de 8 bytes no segmento A e libertá-lo no segmento B, e não precisa lidar com qualquer outra coisa em tudo, você provavelmente poderia escrever um alocador de memória que bate as calças fora de qualquer um dos aqueles listados até agora. Ele só não vai ser muito útil para muito mais. :)

Tenho alguma experiência usando Hoard onde eu trabalho (o suficiente para que um dos erros mais obscuros abordadas no recente lançamento 3.8 foi encontrado como resultado dessa experiência). É um muito bom alocador - mas como bom, para você, depende de sua carga de trabalho. E você tem que pagar por Hoard (embora não seja muito caro), a fim de usá-lo em um projeto comercial sem GPL'ing seu código.

A ptmalloc2 muito ligeiramente adaptado tem sido o alocador trás malloc da glibc por um bom tempo agora, e por isso é incrivelmente amplamente utilizado e testado. Se a estabilidade é importante, acima de todas as coisas, pode ser uma boa escolha, mas você não mencionou isso na sua lista, então eu vou assumir que é fora. Para determinadas cargas de trabalho, é terrível - mas o mesmo é verdade para qualquer malloc uso geral

.

Se você estiver disposto a pagar por ele (e o preço é razoável, na minha experiência), SmartHeap SMP também é uma boa escolha. A maioria dos outros alocadores mencionados são concebidos como novos / apagar substituições drop-in malloc / livre que pode ser LD_PRELOAD'd. SmartHeap pode ser usado dessa forma também, mas também inclui toda uma API alocação-relacionado que permite afinar seus allocators para o conteúdo do seu coração. Nos testes que fizemos (mais uma vez, muito específico para uma aplicação particular), SmartHeap foi aproximadamente o mesmo que Hoard para o desempenho quando actua como um substituto malloc; a real diferença entre os dois é o grau de personalização. Você pode obter melhor desempenho de propósito geral, menos você precisa de seu alocador de ser.

E dependendo do seu caso de uso, um general-purpose multithreaded alocador pode não ser o que você quer usar em tudo; Se você está constantemente malloc & free'ing objetos que são todos do mesmo tamanho, você pode querer apenas escrever um alocador simples laje. alocação de laje é usado em vários lugares do kernel do Linux que se encaixam nessa descrição. (Eu iria dar-lhe um par de ligações mais úteis, mas eu sou um "novo usuário" e Stack Overflow decidiu que os novos usuários não estão autorizados a ser muito útil tudo em uma resposta. Google pode ajudar bem o suficiente, no entanto.)

Eu pessoalmente prefiro e recomendo ptmalloc como um alocador de vários segmentos. Hoard é bom, mas na avaliação minha equipe fez entre Hoard e ptmalloc há alguns anos, ptmalloc era melhor. Pelo que eu sei, ptmalloc tem sido em torno de um número de anos e é largamente usado como um alocador de vários segmentos.

Você pode achar esta comparação útil.

Talvez esta é a maneira errada de abordar o que está pedindo, mas talvez uma tática diferente poderia ser empregado por completo. Se você está procurando um alocador de memória muito rápido talvez você deve perguntar por que você precisa para passar todo esse tempo alocação de memória quando você poderia talvez apenas fugir com alocação de pilha de variáveis. alocação de pilha, enquanto forma mais irritante, feito para a direita poderia poupar muito na forma de contenção de exclusão mútua, bem como manter as questões de corrupção de memória estranhos fora do seu código. Além disso, você potencialmente têm menos fragmentação que poderia ajudar.

Nós usamos tesouro em um projeto onde eu trabalhava há alguns anos. Parecia um grande trabalho. Não tenho experiência iwth outros alocadores. Deve ser muito fácil de experimentar diferentes e fazer testes de carga, não?

O alocador locklessinc é muito bom eo desenvolvedor é sensível, se você tiver dúvidas. Há um artigo que ele escreveu sobre alguns dos truques de otimização utilizadas, é uma leitura interessante: http://locklessinc.com / artigos / allocator_tricks / . Eu usei-o no passado, com excelentes resultados.

enter descrição da imagem aqui

Provavelmente uma resposta tardia à sua pergunta, mas

por que fazer mallocs se você tiver desempenho Caipira ups?

melhor maneira seria fazer um malloc de uma janela de memória grande na inicialização e, em seguida, chegar a uma light weight Memory manager que lease out the memory chunks at run time.

Isso evita qualquer possibilidade de chamadas de sistema se a sua expansão de heap.

Você pode tentar ltalloc (alocador de memória global de propósito geral com velocidade de alocador piscina rápido).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top