Pergunta

Eu construí software que implantei no servidor Windows 2003. O software é executado como um serviço continuamente e é o único aplicativo na caixa Windows de importância para mim. Parte do tempo, está recuperando dados da Internet e parte do tempo está fazendo alguns cálculos nesses dados. É multithread-eu uso pools de threads de aproximadamente 4-20 threads.

Não vou aborrecê -lo com todos esses detalhes, mas basta dizer que, ao permitir mais threads na piscina, ocorre um trabalho mais concomitante e o uso da CPU aumenta. (assim como a demanda por outros recursos, como a largura de banda, embora isso não seja preocupante para mim - eu tenho bastante)

Minha pergunta é a seguinte: devo simplesmente tentar maximizar a CPU para obter o melhor retorno para o meu dinheiro? Intuitivamente, acho que não faz sentido correr a 100% da CPU; Mesmo 95% da CPU parece alto, quase como se não estivesse dando muito espaço ao sistema operacional para fazer o que precisa fazer. Não sei a maneira certa de identificar o melhor equilíbrio. Acho que poderia medir e medir e provavelmente descobrir que a melhor taxa de transferência é obtida em uma utilização da CPU AVG de 90% ou 91%, etc. Mas ...

Só estou me perguntando se há uma boa regra sobre isso ??? Não quero assumir que meus testes levarão em consideração todos os tipos de variações de cargas de trabalho. Prefiro jogar um pouco seguro, mas não muito seguro (ou então estou subutilizando meu hardware).

O que você recomenda? O que é uma regra de utilização inteligente e atendida por performance para um aplicativo de carga mista e multithread (algumas E/S, alguns CPU) no Windows?

Foi útil?

Solução

Sim, eu sugiro que 100% está brigando, por isso não gostaria de ver processos funcionando assim o tempo todo. Eu sempre pretendi que 80% obtenham um equilíbrio entre utilização e espaço para picos / processos ad-hoc.

Uma abordagem que usei no passado é aumentar o tamanho da piscina lentamente e medir o impacto (tanto na CPU quanto em outras restrições como o IO), você nunca sabe, pode achar que de repente io se torna o gargalo.

Outras dicas

A utilização da CPU não deve importar nessa carga de trabalho intensiva de E/S, você se preocupa com a taxa de transferência, então tente usar um abordagem de escalada nas montanhas e basicamente tente injetar / remover programaticamente os threads do trabalhador e rastrear o progresso da conclusão ...

Se você adicionar um segmento e ele ajudar, adicione outro. Se você tentar um thread e dói, remova -o.

Eventualmente, isso se estabilizará.

Se este é um aplicativo baseado em .NET, a escalada foi adicionada ao .NET 4 Threadpool.

ATUALIZAR:

A escalada é uma abordagem baseada na teoria do controle para maximizar a taxa de transferência, você pode chamá -lo de tentativa e erro, se quiser, mas é uma abordagem de som. Em geral, não há uma boa 'regra de ouro' a seguir aqui, porque as despesas gerais e latências variam muito, não é realmente possível generalizar. O foco deve estar no rendimento e conclusão de tarefas / threads, não na utilização da CPU. Por exemplo, é muito fácil atingir os núcleos com bastante facilidade com sincronização grossa ou fina, mas na verdade não faz a diferença na taxa de transferência.

Também em relação ao .NET 4, se você puder reformular seu problema como um paralelo.

-Rick

Assumindo nada mais importante, mas o sistema operacional é executado na máquina:

E sua carga é constante, você deve buscar 100% de utilização da CPU, tudo o mais é um desperdício de CPU. Lembre -se de que o sistema operacional lida com os threads, para que ele seja capaz de executar, é difícil morrer de fome com um programa bem comportado.

Mas se sua carga for variável e você espera picos que você deve levar em consideração, eu diria Você pode apontar para o número exato.

Se você simplesmente dar uma prioridade aos seus threads, o sistema operacional fará o resto e fará ciclos, pois ele precisa fazer o trabalho. Servidor 2003 (e a maioria dos SOs do servidor) são muito bom nisso, não há necessidade de tentar gerenciar você mesmo.

Eu também usei 80% como uma regra geral para a utilização da CPU alvo. Como alguns outros mencionaram, isso deixa algum espaço para picos esporádicos em atividade e ajudará a evitar a debulhagem na CPU.

Aqui está um conselho (mas ainda mais antigo, mas ainda relevante) da tripulação WebLogic sobre esse assunto: http://docs.oracle.com/cd/e13222_01/wls/docs92/perform/basics.html#wp1132942

Se você acha que sua carga é muito par e previsível, poderá aumentar esse alvo um pouco mais alto, mas, a menos que sua base de usuários seja excepcionalmente tolerante com respostas lentas periódicas e seu orçamento do projeto seja incrivelmente apertado, recomendo adicionar mais recursos ao seu sistema ( Adicionando uma CPU, usando uma CPU com mais núcleos, etc.) sobre fazer uma jogada arriscada para tentar espremer outra utilização de CPU a 10% da plataforma existente.

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