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