Ещё весной, во время реализации DHE, я обратил внимание на плохую масштабируемость генерации ключей, хотя в теории этот процесс должен параллелиться почти идеально. Получалось же что RSA хоть как-то параллелиться до 4-х потоков, а DH вообще до 2-х. После небольшого расследования причин и соотв. переработки алгоритмов было произведено небольшое тестирование: среднее время генерации ключа на серии из 100 ключей в зависимости от размера ключа и кол-ва потоков. Ниже привожу результаты (тестирование проводилось на Xeon-D 1540).
Генерация RSA ключей в секундах реального времени:
Кол-во потоков | 512 бит | 1024 бита | 2048 бит | 4096 бит | 8192 бита |
1 | 0.148 сек | 1.151 сек | 11.244 сек | 131.731 сек | 1713.024 сек |
2 | 0.080 сек | 0.586 сек | 5.776 сек | 66.687 сек | 869.877 сек |
3 | 0.054 сек | 0.420 сек | 4.043 сек | 45.257 сек | 595.355 сек |
4 | 0.042 сек | 0.313 сек | 3.014 сек | 34.472 сек | 447.879 сек |
5 | 0.033 сек | 0.244 сек | 2.352 сек | 27.562 сек | 356.136 сек |
6 | 0.029 сек | 0.203 сек | 1.986 сек | 22.541 сек | 294.696 сек |
7 | 0.025 сек | 0.182 сек | 1.708 сек | 19.359 сек | 253.913 сек |
8 | 0.023 сек | 0.162 сек | 1.512 сек | 17.341 сек | 227.011 сек |
А теперь, для наглядности, тоже самое только время в потоко-секундах:
Кол-во потоков | 512 бит | 1024 бита | 2048 бит | 4096 бит | 8192 бита |
1 | 0.148 | 1.151 | 11.244 | 131.731 | 1713.024 |
2 | 0.160 | 1.172 | 11.552 | 133.374 | 1739.754 |
3 | 0.162 | 1.260 | 12.129 | 135.771 | 1786.065 |
4 | 0.168 | 1.252 | 12.056 | 137.888 | 1791.516 |
5 | 0.165 | 1.220 | 11.760 | 137.810 | 1780.680 |
6 | 0.174 | 1.218 | 11.916 | 135.246 | 1768.176 |
7 | 0.175 | 1.274 | 11.956 | 135.513 | 1777.391 |
8 | 0.184 | 1.296 | 12.096 | 138.728 | 1816.088 |
Разброс значений |
4.94% | 3.26% | 2.03% | 1.32% | 1.32% |
Т.е. теперь зависимость от кол-ва потоков генерации фактически линейная. Ниже аналогичные таблицы для генерации модулей DH:
Кол-во потоков | 256 бит | 512 бит | 1024 бита | 2048 бит | 4096 бит |
1 | 0.399 сек | 2.871 сек | 28.121 сек | 347.210 сек | 4142.057 сек |
2 | 0.209 сек | 1.547 сек | 15.181 сек | 157.720 сек | 2527.711 сек |
3 | 0.128 сек | 1.052 сек | 10.273 сек | 113.577 сек | 1607.135 сек |
4 | 0.109 сек | 0.783 сек | 7.480 сек | 81.751 сек | 1174.542 сек |
5 | 0.087 сек | 0.625 сек | 6.380 сек | 66.503 сек | 971.088 сек |
6 | 0.071 сек | 0.563 сек | 4.987 сек | 55.553 сек | 768.313 сек |
7 | 0.059 сек | 0.439 сек | 4.322 сек | 44.621 сек | 652.061 сек |
8 | 0.055 сек | 0.400 сек | 3.704 сек | 38.713 сек | 565.883 сек |
Кол-во потоков | 256 бит | 512 бит | 1024 бита |
2048 бит |
4096 бит |
1 | 0.399 | 2.871 | 28.121 | 347.210 | 4142.057 |
2 | 0.418 | 3.094 | 30.362 | 315.440 | 5055.422 |
3 | 0.384 | 3.156 | 30.819 | 340.731 | 4821.405 |
4 | 0.436 | 3.132 | 29.920 | 327.004 | 4698.168 |
5 | 0.435 | 3.125 | 31.900 | 332.515 | 4855.440 |
6 | 0.426 | 3.378 | 29.922 | 333.318 | 4609.878 |
7 | 0.413 | 3.073 | 30.254 | 312.347 | 4564.427 |
8 | 0.440 | 3.200 | 29.632 | 309.704 | 4527.064 |
Разброс значений |
3.67% | 2.81% | 2.38% | 3.41% | 4.26% |
К сожалению я не успел провести тесты для ключей RSA в 16 и 32 килобит и модулей DH в 8, 16 и 32 килобит до замены тестового оборудования, однако я склонен полагать что результаты будут теми же.