Детальные выкладки результатов
Отправим по 10 тысяч запросов в 50 потоков для исправленного варианта.
Execute 500000 from 500000. Time 89366.0 ms, rps 5594.906397215975 Execute 500000 from 500000. Time 80759.0 ms, rps 6191.183754333829Execute 500000 from 500000. Time 80542.0 ms, rps 6207.864122270092
Отправим по 1 тысяче запросов в 50 потоков вариант без исправлений с утилизацией CPU 95%+.
Execute 50000 from 50000. Time 739863.0 ms, rps 67.57998767341024 Execute 50000 from 50000. Time 735627.0 ms, rps 67.96913657446427Execute 50000 from 50000. Time 735488.0 ms, rps 67.98198205547601
Отправим по 10 тысяч запросов в 50 потоков вариант с заменой PasswordEncoder и без keep-alive.
Execute 500000 from 500000. Time 45950.0 ms, rps 10881.156014014929Execute 500000 from 500000. Time 37982.0 ms, rps 13163.783798014902Execute 500000 from 500000. Time 37585.0 ms, rps 13302.825520140477
Отправим по 10 тысяч запросов в 50 потоков вариант с заменой PasswordEncoder и c keep-alive.
Execute 500000 from 500000. Time 86919.0 ms, rps 5752.416014726185Execute 500000 from 500000. Time 82718.0 ms, rps 6044.560500006045Execute 500000 from 500000. Time 83872.0 ms, rps 5961.394012375854
Стоп, а почему в потенциально самом быстром варианте результаты хуже?
Попробуем каждому потоку выдать свой персональный http-клиент.
Отправим по 10 тысяч запросов в 50 потоков вариант с заменой PasswordEncoder и c keep-alive и prototype-клиентом.
Execute 500000 from 500000. Time 52092.0 ms, rps 9598.218570633291Execute 500000 from 500000. Time 29059.0 ms, rps 17205.781142463868Execute 500000 from 500000. Time 28339.0 ms, rps 17642.907551164433
Отправим по 10 тысяч запросов в 50 потоков вариант c BCryptPasswordEncoder и c keep-alive и prototype-клиентом.
Execute 500000 from 500000. Time 50892.0 ms, rps 9824.533825869963Execute 500000 from 500000. Time 29269.0 ms, rps 17082.33686368295Execute 500000 from 500000. Time 28368.0 ms, rps 17624.872219676407
Ура, теперь результаты с разными энкодерами совпадают!
И контрольный: а может, на prototype-клиенте не нужен keep-alive?
Execute 50000 from 50000. Time 738208.0 ms, rps 67.73149609392462
Не-а. Без keep-alive никак.