Groupcache: problemas com limites superiores de limites de memória

Criado em 13 abr. 2016  ·  5Comentários  ·  Fonte: golang/groupcache

Oi,

Obrigado pelo cache de grupo, estamos usando-o com quase grande sucesso.

Uma coisa que eu gostaria de entender mais é como estimar / saber os limites superiores das necessidades de memória de um aplicativo, cuja funcionalidade primária é simplesmente servir coisas do cache de grupo.

Portanto, temos 6 GB de cache de grupo de VM em execução, e nossa primeira inclinação foi definir o tamanho do cache disponível para 5 gb, deixando 1 gb livre para o sistema operacional e outras coisas.

Imediatamente, ele travou durante a carga de produção devido ao assassino OOM sendo invocado. Então, acabamos diminuindo esse número para pouco menos de 2 GB para que a memória que o processo está usando fique abaixo dos 6 GB antes que o OOM killer seja ativado.

Portanto, a próxima etapa foi traçar o perfil da memória, e eis que o tamanho do heap não excede em muito os 2 GB que configuramos no cache do grupo. Mas o processo acaba usando 4-6 gb de ram.

Portanto, a última tentativa foi chamar debug.FreeOSMemory () manualmente a cada dois minutos, e quando isso é executado, logo depois, a quantidade de memória que o processo está exigindo cai, muito é retornado ao sistema operacional.

No entanto, ainda temos travamentos ocasionais devido ao assassino OOM. Adicionamos SSD swap para buffer neste caso, mas após 48 horas sem problemas, houve um blip (aumento substancial) no tráfego para essas máquinas, fazendo com que uma única tenha OOM morto, que então se transformou em uma bola de neve em várias outras que aconteceram.

Então, para fazer isso funcionar, poderíamos diminuir a configuração de cache de 2 GB (também conhecido como segundo parâmetro em groupcache.NewGroup) para ainda mais 1 GB de lábio inferior, mas parece um pouco bobo ter uma VM de 6 GB que só pode usar 1 GB para cache.

Isso é apenas uma desvantagem de usar a abordagem de go ao gerenciamento de memória para armazenamento em cache?

Não tenho certeza se isso é importante, mas nosso caso de uso é muito semelhante a dl.google.com. Estamos disponibilizando downloads de arquivos de tamanho médio (50 MB a 1 GB, armazenados em cache em blocos de 100 MB) e o cache de grupo é usado para fazer frente a uma API mais lenta e mais cara que tem os arquivos de que precisamos. Então, naturalmente, quando encontrar isso, parece uma ótima solução para o problema.

Ficaríamos extremamente gratos por quaisquer dicas que você possa compartilhar para lidar com esse tipo de problema. Eu fico pensando que há algo que estou perdendo.

Obrigado por qualquer ideia que você possa compartilhar.

  • Scott

Comentários muito úteis

Só para acompanhar, isso ajudou tremendamente. Obrigado novamente. +1 para adicionar isto a um documento.

Todos 5 comentários

Isso vem principalmente da configuração padrão de GCPrecent para 100%, o que significa que o GC será acionado automaticamente apenas quando você alocar o dobro da quantidade desde a última execução do GC.

Eu estava em uma situação semelhante e imaginei que, para um perfil de algo como o Groupcache, faria mais sentido ajustá-lo para algo como 10%. consulte https://golang.org/pkg/runtime/debug/#SetGCPercent

Obrigado pela sua resposta. Vou tentar isso muito em breve e relatar de volta! Totalmente faz sentido conceitualmente.

Foi um tempo atrás, mas o IIRC embora a sobrecarga fosse superior a 10%, provavelmente em torno de 20 - era lógico e não exigia o dobro do limite de memória do cache

@adg talvez valha a pena mencionar no README, parece uma armadilha comum

Só para acompanhar, isso ajudou tremendamente. Obrigado novamente. +1 para adicionar isto a um documento.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

AlexanderChen1989 picture AlexanderChen1989  ·  6Comentários

orcaman picture orcaman  ·  9Comentários

abennett picture abennett  ·  3Comentários

yml picture yml  ·  3Comentários

bhuvan picture bhuvan  ·  3Comentários