Para resumir:
- no seu servidor real, você pode fazer 1700 atualizações de tabela + 1700 confirmações em menos de um segundo,
- no seu servidor virtual, você pode fazer 1700 atualizações de tabela + 1700 confirmações em 9 segundos,
- no seu servidor virtual, você pode fazer 1700 atualizações de tabela + 1 confirmação em menos de um segundo.
Então, parece-me que o seu problema pode ser redefinido como "em um servidor real, posso fazer 1700 commits em menos de um segundo, mas o desempenho cai dez vezes no meu servidor virtual".
Qual é a diferença entre 1700 atualizações de tabela e 1700 confirmações? As atualizações da tabela são totalmente armazenadas em cache e não dependem de E / S de disco. Com commits isso é bem diferente. Pela própria natureza dos bancos de dados transacionais, o mecanismo de banco de dados tem que ter certeza de que o commit foi salvo no disco (salvo em um arquivo de log), antes mesmo de começa a comprometer a próxima transação. Portanto, para cada um dos 1700 commits, é preciso esperar a ida e volta inteira. Resumindo, em seu cenário a latência de E / S desempenha um papel muito importante, e deve ser analisada (não confunda a latência com a taxa de E / S ou throughput em bytes; estes três são todos animais totalmente diferentes; são sempre sintonizado separadamente).
É um bom plano testar seu armazenamento com o IOMeter. Ele trava na inicialização porque tenta preencher todo o disco com o arquivo de teste. Apenas espere até que o arquivo cresça até um valor considerável e reinicie o IOMeter, ele funcionará corretamente com o arquivo de teste "incompleto".