Eu concordo com GBN e Marian.
Para responder à sua pergunta sobre 2 CPUs que lidam com 25 solicitações: Eu tenho um sistema de 2 CPUs que suporta cerca de 750 conexões de usuários e uma média de solicitações em lote de 4K por segundo. Vários itens são importantes para mim: Design, Gerenciamento e Ajuste. Se você começar com um design ruim do seu aplicativo e banco de dados, falhará no carregamento (pense em dimensionamento).
CPU alta pode indicar pressão da memória. Você menciona que há apenas 7 GB de memória disponível para o SQL Server. Se você tiver índices com desempenho ruim (muitos índices, índices incorretos ou nenhum índice), isso fará com que o sistema pagine mais o banco de dados na memória para várias solicitações, se houver índices apropriados. Eu recomendaria criar índices hog-wild, pois os errados também o prejudicarão, pois cada um tem o potencial de exigir uma atualização no decorrer de uma operação de atualização de linha (Create-Update-Delete).
Além disso, o uso das DMVs de índice ausente exige o uso do que você sabe sobre seu aplicativo e banco de dados e não apenas a implementação de cada índice recomendado. Gostaria de verificar as entradas do blog de Kimberly Tripp sobre os índices aqui . Após a seção Índice, examinar as outras categorias pode ser útil para sua situação.
Se a atualização de 5 tabelas Java / Hibernate em uma única transação estiver fazendo as atualizações por meio de várias viagens de ida e volta ao banco de dados, você estará deixando a disputa (solicitações CRUD bloqueadas). O problema piora se o aplicativo não puder retornar ao banco de dados em tempo hábil. Enquanto estiver no aplicativo, a transação ativa associada poderá bloquear o processamento de outras solicitações e causar tempos limite de solicitações.
Adicione os dois problemas acima juntos e você começará a ter um caso desagradável de dor de cabeça por desempenho.
Reduzir o número de viagens de ida e volta ao banco de dados no contexto de uma única transação seria uma coisa muito boa a se buscar. Talvez um procedimento armazenado possa ajudar.
O restante exigirá trabalho para que seu aplicativo seja dimensionado. Você também pode considerar a memória, mas isso deve ocorrer após a conclusão de uma revisão de design e desempenho, e as alterações necessárias implementadas ao adicionar memória imediatamente mascararão seus problemas.
Siga absolutamente as sugestões que Marian esboçou.
Eu diria que você se encontrou com um desafio maravilhoso e desejo-lhe um grande sucesso!