Estamos executando um aplicativo da web Ruby on Rails no Unicorn. Nosso aplicativo não é estritamente vinculado à CPU (temos um sistema Xeon E5645 duplo com 12 núcleos e um valor médio de carga de pico é de cerca de 6). Inicialmente, começamos com 40 funcionários do Unicorn, mas a pegada de memória do aplicativo aumentou com o tempo. Então, agora temos que diminuir o número de processos do trabalhador. Eu pensei que a fórmula padrão (número de núcleos de CPU + 1) também se aplica ao Unicorn, mas meu colega tentou me convencer de que deveríamos reservar mais instâncias do Unicorn por CPU e fornecia esse link . No entanto, não sei exatamente por que precisamos gastar tanta memória em processos ociosos do Unicorn.
Minha pergunta é: qual o motivo de ter mais de uma instância do Unicorn por núcleo de CPU? É devido a alguma peculiaridade arquitetônica do Unicorn? Estou ciente de que os processos ocupados do Unicorn não podem aceitar novas conexões (estamos usando soquetes de domínio UNIX para se comunicar com as instâncias do Unicorn BTW), mas achei que a lista de pendências foi introduzida exatamente para resolver isso. É possível superar essas 2 a 8 instâncias Unicorn por regra de CPU?
Você está certo sobre N + 1 para trabalhos vinculados à CPU.
Por outro lado, o unicórnio não usa threads, portanto, todas as operações de IO. bloqueia o processo e outro processo pode ativar e analisar cabeçalhos HTTP, concatenar seqüências de caracteres e executar todas as tarefas intensivas em CPU necessárias para atender o usuário (fazendo isso antes para reduzir a latência de solicitações).
E você pode querer ter mais threads / processos do que núcleos. Imagine a seguinte situação: req. A leva dez vezes mais que o req. B, você tem várias solicitações A simultâneas e a solicitação B rápida é enfileirada aguardando a conclusão do A-req. Portanto, se você puder prever o número de solicitações pesadas, poderá usar esse número como outra diretriz para ajustar o sistema.
fonte