Re: HTTPS грузит только одно ядро процессора
Maxim Dounin
mdounin на mdounin.ru
Ср Мар 30 02:37:37 UTC 2016
Hello!
On Tue, Mar 29, 2016 at 07:45:13PM -0400, Maximus43 wrote:
> Здравствуйте!
>
> Операционная система FreeBSD 10.2-RELEASE.
> Версия - nginx/1.9.12
>
> Проблема в следующем:
> при тестировании http нагрузка распределяется по workers равномерно,
> производительность высокая. При тестировании https нагрузка идет на одно
> ядро системы, top выглядит вот так:
> last pid: 8458; load averages: 0.61, 0.25, 0.26
> up 0+04:33:46 23:42:54
> 26 processes: 1 running, 25 sleeping
> CPU: 12.4% user, 0.0% nice, 0.1% system, 0.4% interrupt, 87.1% idle
> Mem: 138M Active, 1380M Inact, 623M Wired, 827M Buf, 5763M Free
> Swap: 764M Total, 764M Free
>
> PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU
> COMMAND
> 8419 www 33 22 -5 948M 71348K uwait 3 2:13 99.37% nginx
> 7661 www 33 49 -5 928M 56440K uwait 0 1:31 0.00% nginx
> 1112 root 1 20 0 26152K 18072K select 5 0:02 0.00% ntpd
> 1166 root 1 27 0 61224K 7012K select 7 0:02 0.00% sshd
> 7653 root 1 43 0 932M 64412K pause 6 0:01 0.00% nginx
[...]
> Результаты тестов http и https отличаются на два порядка.Куда копать?
> Заранее спасибо!
Наиболее затратная часть в https - это handshake, и упирается он в
процессор. Сколько именно будет стоить handshake - зависит от
используемых шифров. Типичные цифры - ~600 handshake'ов в секунду
на ядро при использовании RSA 2048 бит. Если же взять ключи
побольше или использовать в добавок обмен эфимерными ключами
Diffie-Hellman'а, то можно и десятки handshake'ов в секунду
получить. Так что два порядка разницы между http и https - это не
странно ни разу. Основной метод борьбы с этим в реальной жизни -
использование постоянных соединений и кеширование сессий, см.
http://nginx.org/r/ssl_session_cache/ru.
Кроме того, поведение nginx'а по умолчанию рассчитано на большое
количество клиентов, и если ваши тесты не обеспечивают
достаточного параллелизма - всё достаточно легко может уйти в один
процесс. Особенно на FreeBSD, где nginx точно знает, сколько
соединений ожидает в очереди, и может их все принять скопом - что
обычно хорошо, но при микробенчмарках https - не очень, т.к. не
позволяет полностью утилизировать все имеющиеся ядра процессора.
Для микробенчмарков - стоит как минимум выключать accept_mutex,
см. http://nginx.org/r/accept_mutex/ru.
--
Maxim Dounin
http://nginx.org/
Подробная информация о списке рассылки nginx-ru