Re: nginx полностью загружает весь процессор при reload'e

2019-09-03 Пенетрантность Maxim Dounin
Hello!

On Tue, Sep 03, 2019 at 03:18:36PM +0500, Dmitry Sergeev wrote:

> Добрый день,  спасибо за ответ.
> 
> On 02/09/2019 22:11, Maxim Dounin wrote:
> > Just in case, для работы такая конфигурация смысла не имеет - если
> > тикеты выключены, то ключ для их шифрования не нужен.  Ключ имеет
> > смысл задавать, если тикеты включены.
> >
> > С точки зрения влияния на reload - внешний ключ позволит сохранить
> > тикеты при reload'ах, а выключение тикетов - уведёт всё в кэш
> > сессий.
> >
> > Ну выключать тикеты - это, безусловно, плохой путь.  Тикеты -
> > способ переложить хранение сессий на клиентов, и отказываться от
> > этого - очевидно недальновидно с точки зрения нагрузки на сервер.
> >
> Да, я неверно понял доки.
> 
> > Отмечу также, что даже в наиболее экстремальных случаях из
> > представленных на графике - рост потребления процессора с ~200% до
> > ~300% не выглядит сколько-нибудь фатальным.  Какой-то рост
> > потребления процессора при релоадах - нормален, здесь же
> > наблюдается рост всего в 1.5 раза.  Если это проблема - то стоит
> > задуматься о добавлении мощностей и/или заняться оптимизацией
> Да, сейчас это для меня просто представляет интерес, после перехода на 
> openssl 1.0.2g и включение http2, проблем это особых не вызывает.
> > А вот то, что средняя нагрузка без тикетов заметно выше - это
> > немного странно.  Само хранение сессий - должно бы стоить очень
> > недорого с точки зрения процессора, а в остальном разница не
> > принципиальна.  Но, возможно, тут дело в том, что размер кэша
> > SSL-сессий просто мал для имеющегося количества клиентов, и
> > поэтому при выключении тикетов handshake'и начинают происходить
> > чаще, что и приводит к росту потребления процессора.
> Возможно. Это немного не то, но мне было интересно как увеличение кэша 
> ssl сессий повлияет на нагрузку при reload'e:
> 
> http://dl4.joxi.net/drive/2019/09/03/0030/2608/1985072/72/8608b87db7.jpg
> 
> Числами отметил разное количество ssl_session_cache от 20m до 256m. 
> Вроде никак не влияет.  Сегодня тестил при 8K rps (вчера 5-6K). Поэтому 
> нагрузка скачет чуть выше.

От размера кэша сессий должна зависеть высота "полки" между 
reload'ами.  Если кэш мал - то полных handshake'ов будет больше, 
чем могло бы быть, и соответственно CPU usage в полке будет 
больше.  Ну и всё это имеет смысл скорее при выключенных тикетах, 
о чём и шла речь выше.  А на графике - они, похоже, включены.

> А вот тикеты помогли вообще круто.  Нагрузка поднимается всего-лишь на 
> 5%-10%:
> http://dl3.joxi.net/drive/2019/09/03/0030/2608/1985072/72/ac00a4d2d0.jpg
> 
> Здесь 1 - это без ssl_session_ticket_key, а 2,3,4 - c включенными 
> тикетами и указанными постояным ключем ssl_session_ticket_key.

Ну ок, то есть как и ожидалось - пик явно из-за SSL handshake'ов, 
использование постоянных ключей для тикетов - лечит.

> Итого:
> 
> Сущесвтенно решить проблему помогло следующее:
> 1) переход на http2 (openssl 1.02.g) - понизилась нагрузка в целом, и 
> при reload'e нагрузка конечно возрастала, но не надолго (5-20 секунд, а 
> раньше от 30-40 секунд, до 5 минут).
> 2) И вообще убрать хоть какое-то сущесвтенное повышение нагрзуки помогло 
> включение ssl_session_tickets(по умолчанию включено) с установелнным 
> ssl_session_ticket_key (по умолчанию генерируется заново при каждом 
> reload'e, его лучше указать чтобы этого не происходило).
> 
> Оставил такие параметры:
> 
>      ssl_session_cache   shared:SSL:20m;
>      ssl_session_timeout 30m;
>      ssl_session_tickets on;
>      ssl_session_ticket_key /etc/nginx/ssl/ticket.key; # ticket.key - 
> файл с рандомными 80 или 48 байт
> 
> Кэш ssl сессий оставил, хоть в моем случае он вроде как сильно не влияет 
> (по крайней мере я этого не заметил).

Использовать "ssl_session_tickets on;" - не нужно, это поведение 
по умолчанию.  И отмечу также, что ключ для тикетов - надо 
периодически менять, ибо получив этот ключ - можно расшифровать 
весь трафик.

И я бы ещё рекомендовал посмотреть в сторону ECDSA-сертификатов, 
там handshake банально на порядок быстрее при той же 
криптостойкости:

$ openssl speed rsa2048 ecdsap256
...
  signverifysign/s verify/s
rsa 2048 bits 0.000992s 0.33s   1008.1  30297.9
  signverifysign/s verify/s
 256 bit ecdsa (nistp256)   0.0001s   0.0001s  17145.0   9276.9

То есть 1008.1 подписей в секунду в случае RSA 2048 bit, и 17145.0 
подписей в секунду для ECDSA 256 bit.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-09-03 Пенетрантность Dmitry Sergeev

Добрый день,  спасибо за ответ.

On 02/09/2019 22:11, Maxim Dounin wrote:

Just in case, для работы такая конфигурация смысла не имеет - если
тикеты выключены, то ключ для их шифрования не нужен.  Ключ имеет
смысл задавать, если тикеты включены.

С точки зрения влияния на reload - внешний ключ позволит сохранить
тикеты при reload'ах, а выключение тикетов - уведёт всё в кэш
сессий.

Ну выключать тикеты - это, безусловно, плохой путь.  Тикеты -
способ переложить хранение сессий на клиентов, и отказываться от
этого - очевидно недальновидно с точки зрения нагрузки на сервер.


Да, я неверно понял доки.


Отмечу также, что даже в наиболее экстремальных случаях из
представленных на графике - рост потребления процессора с ~200% до
~300% не выглядит сколько-нибудь фатальным.  Какой-то рост
потребления процессора при релоадах - нормален, здесь же
наблюдается рост всего в 1.5 раза.  Если это проблема - то стоит
задуматься о добавлении мощностей и/или заняться оптимизацией
Да, сейчас это для меня просто представляет интерес, после перехода на 
openssl 1.0.2g и включение http2, проблем это особых не вызывает.

А вот то, что средняя нагрузка без тикетов заметно выше - это
немного странно.  Само хранение сессий - должно бы стоить очень
недорого с точки зрения процессора, а в остальном разница не
принципиальна.  Но, возможно, тут дело в том, что размер кэша
SSL-сессий просто мал для имеющегося количества клиентов, и
поэтому при выключении тикетов handshake'и начинают происходить
чаще, что и приводит к росту потребления процессора.
Возможно. Это немного не то, но мне было интересно как увеличение кэша 
ssl сессий повлияет на нагрузку при reload'e:


http://dl4.joxi.net/drive/2019/09/03/0030/2608/1985072/72/8608b87db7.jpg

Числами отметил разное количество ssl_session_cache от 20m до 256m. 
Вроде никак не влияет.  Сегодня тестил при 8K rps (вчера 5-6K). Поэтому 
нагрузка скачет чуть выше.


А вот тикеты помогли вообще круто.  Нагрузка поднимается всего-лишь на 
5%-10%:

http://dl3.joxi.net/drive/2019/09/03/0030/2608/1985072/72/ac00a4d2d0.jpg

Здесь 1 - это без ssl_session_ticket_key, а 2,3,4 - c включенными 
тикетами и указанными постояным ключем ssl_session_ticket_key.


Итого:

Сущесвтенно решить проблему помогло следующее:
1) переход на http2 (openssl 1.02.g) - понизилась нагрузка в целом, и 
при reload'e нагрузка конечно возрастала, но не надолго (5-20 секунд, а 
раньше от 30-40 секунд, до 5 минут).
2) И вообще убрать хоть какое-то сущесвтенное повышение нагрзуки помогло 
включение ssl_session_tickets(по умолчанию включено) с установелнным 
ssl_session_ticket_key (по умолчанию генерируется заново при каждом 
reload'e, его лучше указать чтобы этого не происходило).


Оставил такие параметры:

    ssl_session_cache   shared:SSL:20m;
    ssl_session_timeout 30m;
    ssl_session_tickets on;
    ssl_session_ticket_key /etc/nginx/ssl/ticket.key; # ticket.key - 
файл с рандомными 80 или 48 байт


Кэш ssl сессий оставил, хоть в моем случае он вроде как сильно не влияет 
(по крайней мере я этого не заметил).



Спасибо Вам большое, Ваши советы помогли полностью избавиться от этого 
эффекта. Надеюсь кому-то тоже будет полезна эта переписка.


--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-09-02 Пенетрантность Maxim Dounin
Hello!

On Mon, Sep 02, 2019 at 08:54:51PM +0500, Dmitry Sergeev wrote:

> Спасибо большое за ответ.
> 
> Потестил  с параметрами:
> 
> ssl_session_tickets off;
> ssl_session_ticket_key /etc/nginx/ssl/ticket.key;

Just in case, для работы такая конфигурация смысла не имеет - если 
тикеты выключены, то ключ для их шифрования не нужен.  Ключ имеет 
смысл задавать, если тикеты включены.

С точки зрения влияния на reload - внешний ключ позволит сохранить 
тикеты при reload'ах, а выключение тикетов - уведёт всё в кэш 
сессий.

> И довольно интересно получилось:
> http://joxi.net/krD6q0jTKkV9R2.jpg
> 
> На картинке числами отмечены reload'ы
> 1,2,6,7,10  - без настроек tickets (по умоланию включен)
> 3,4,5,8,9 - с отключенным tickets и файлом ssl_session_ticket_key.
> 
> При этом всегда был включен кэш сессий:
> 
>      ssl_session_cache   shared:SSL:20m;
>      ssl_session_timeout 30m;
> 
> Пока сделал вывод, что с отключенным ssl_session_tickets средняя 
> нагрузка выше, но при этом при reload'e нагрузка не так сильно 
> возрастает по отношению к средней. Тесты не совсем чистые, постараюсь 
> сделать более чистый эксперимент.

Ну выключать тикеты - это, безусловно, плохой путь.  Тикеты - 
способ переложить хранение сессий на клиентов, и отказываться от 
этого - очевидно недальновидно с точки зрения нагрузки на сервер.

А вот то, что средняя нагрузка без тикетов заметно выше - это 
немного странно.  Само хранение сессий - должно бы стоить очень 
недорого с точки зрения процессора, а в остальном разница не 
принципиальна.  Но, возможно, тут дело в том, что размер кэша 
SSL-сессий просто мал для имеющегося количества клиентов, и 
поэтому при выключении тикетов handshake'и начинают происходить 
чаще, что и приводит к росту потребления процессора.

Отмечу также, что даже в наиболее экстремальных случаях из 
представленных на графике - рост потребления процессора с ~200% до 
~300% не выглядит сколько-нибудь фатальным.  Какой-то рост 
потребления процессора при релоадах - нормален, здесь же 
наблюдается рост всего в 1.5 раза.  Если это проблема - то стоит 
задуматься о добавлении мощностей и/или заняться оптимизацией.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-09-02 Пенетрантность Dmitry Sergeev

Спасибо большое за ответ.

Потестил  с параметрами:

ssl_session_tickets off;
ssl_session_ticket_key /etc/nginx/ssl/ticket.key;

И довольно интересно получилось:
http://joxi.net/krD6q0jTKkV9R2.jpg

На картинке числами отмечены reload'ы
1,2,6,7,10  - без настроек tickets (по умоланию включен)
3,4,5,8,9 - с отключенным tickets и файлом ssl_session_ticket_key.

При этом всегда был включен кэш сессий:

    ssl_session_cache   shared:SSL:20m;
    ssl_session_timeout 30m;

Пока сделал вывод, что с отключенным ssl_session_tickets средняя 
нагрузка выше, но при этом при reload'e нагрузка не так сильно 
возрастает по отношению к средней. Тесты не совсем чистые, постараюсь 
сделать более чистый эксперимент.



On 02/09/2019 16:55, Maxim Dounin wrote:

Hello!

On Sat, Aug 31, 2019 at 12:54:06PM +0500, Dmitry Sergeev wrote:


Добрый день!
Спасибо за ответ.

Конфиг полный, просто сократил количетсво виртуальных хостов, так как они 
одинаковые.

В конфиге значилось:

 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-enabled/*;

Так что понять по нему, полный он, или нет - не представляется
возможным, отсюда и вопросы.


ssl_session_cache - действительно не настроено.
ssl_dhparam - аналогично.
сертификат один общий для всех, сгенерировал его для wildcard домена от let's 
encrypt (Signature Algorithm: sha256WithRSAEncryption, Public-Key: 
rsaEncryption (2048 bit)).

Пытался оптимизировать ssl и посмотреть влияние его настроек на эту проблему. В 
частности пробовал глобально добавлять опции:

*ssl_session_cache shared:SSL:20m;*
*ssl_session_timeout 30m; *вроде никак не влияло, но я проверю еще раз конечно, 
и более чательно.

Если большая часть клиентов использует тикеты - то может и не
повлиять.  Для теста можно попробовать отключить тикеты
(ssl_session_tickets) и/или настроить внешний ключ
(ssl_session_ticket_key), так как автоматически сгенерированные
ключи при reload'е обновляются.


Про ssl_dhparam не понял, с точки зрения производительности -
его лучше добавлять но с небольшой битностью (2048 и меньше) или
лучше совсем не использовать?

Лучше - не использовать.  Даже 2048 для классического
Диффи-Хеллмана - это очень медленно.


--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-09-02 Пенетрантность Maxim Dounin
Hello!

On Sat, Aug 31, 2019 at 12:54:06PM +0500, Dmitry Sergeev wrote:

> Добрый день!
> Спасибо за ответ.
> 
> Конфиг полный, просто сократил количетсво виртуальных хостов, так как они 
> одинаковые.

В конфиге значилось:

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

Так что понять по нему, полный он, или нет - не представляется 
возможным, отсюда и вопросы.

> ssl_session_cache - действительно не настроено.
> ssl_dhparam - аналогично.
> сертификат один общий для всех, сгенерировал его для wildcard домена от let's 
> encrypt (Signature Algorithm: sha256WithRSAEncryption, Public-Key: 
> rsaEncryption (2048 bit)).
> 
> Пытался оптимизировать ssl и посмотреть влияние его настроек на эту проблему. 
> В частности пробовал глобально добавлять опции:
> 
> *ssl_session_cache shared:SSL:20m;*
> *ssl_session_timeout 30m; *вроде никак не влияло, но я проверю еще раз 
> конечно, и более чательно.

Если большая часть клиентов использует тикеты - то может и не 
повлиять.  Для теста можно попробовать отключить тикеты 
(ssl_session_tickets) и/или настроить внешний ключ 
(ssl_session_ticket_key), так как автоматически сгенерированные 
ключи при reload'е обновляются.

> Про ssl_dhparam не понял, с точки зрения производительности - 
> его лучше добавлять но с небольшой битностью (2048 и меньше) или 
> лучше совсем не использовать?

Лучше - не использовать.  Даже 2048 для классического 
Диффи-Хеллмана - это очень медленно.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-31 Пенетрантность Dmitry Sergeev

Добрый день!
Спасибо за ответ.

Конфиг полный, просто сократил количетсво виртуальных хостов, так как они 
одинаковые.

ssl_session_cache - действительно не настроено.
ssl_dhparam - аналогично.
сертификат один общий для всех, сгенерировал его для wildcard домена от let's 
encrypt (Signature Algorithm: sha256WithRSAEncryption, Public-Key: 
rsaEncryption (2048 bit)).

Пытался оптимизировать ssl и посмотреть влияние его настроек на эту проблему. В 
частности пробовал глобально добавлять опции:

*ssl_session_cache shared:SSL:20m;*
*ssl_session_timeout 30m; *вроде никак не влияло, но я проверю еще раз конечно, 
и более чательно.

Про ssl_dhparam не понял, с точки зрения производительности - его лучше 
добавлять но с небольшой битностью (2048 и меньше) или лучше совсем не 
использовать?

Большое спасибо за советы.

**

On 30/08/2019 17:49, Maxim Dounin wrote:

Hello!

On Wed, Aug 28, 2019 at 09:18:44PM +0500, Dmitry Sergeev wrote:


Вообще мне это конечно помогло, но  не полностью. На версии 1.0.2g во
время reload'а проц грузит полностью  около 5-10 секунд (вместо 40-300
секунд на 1.0.1u), теперь просто оно особо проблем не вызывает у
клиентов. Но в целом проблема осталась, просто теперь она не так сильно
беспокоит.

Сейчас задача замедлилась, но в итоге буду поднимать тестовый стенд с
нагрузкой, и смотреть можно ли как-то повлиять на это.
Если конечно тут не подскажут, что еще можно подкрутить.

Судя по perf top, проблема в том, что клиенты после reload'а
переустанавливают соединения, и это выливается в полный SSL
handshake - что и приводит к потреблению CPU.

Посмотреть стоит на:

- ssl_session_cache - в конфиге его, судя по всему, нет (или
   соответствующие части конфига не показаны);

- сертификаты, в частности - их битность (just in case, RSA более
   2048 использовать не надо, это тупо очень дорого с точки зрения
   процессора) и тип (лучше использовать ECDSA, но тут уже может
   встать вопрос совместимости; при желании можно использовать и RSA
   и ECDSA одновременно);

- используемые шифры, особенно - шифры с классическим DH для
   обмена ключами (по умолчанию эти шифры не используются начиная с
   nginx 1.11.0, но некоторые любят указывать ssl_dhparam в конфиге,
   да ещё и с параметрами большой битности; не надо так);


Насчет старых клиентов, точно не могу сказать, но есть такой кейс
http://mailman.nginx.org/pipermail/nginx-ru/2019-April/062014.html. Я
хорошо не изучал этот вопрос, но факт остается, на старой версии openssl
ошибок у клиентов в 3-4 раза было меньше. В итоге решили что это клиенты
с очень старым ssl.

Как уже говорилось в треде по ссылке, использование OpenSSL
1.0.1u автоматически означет, что HTTP/2 с большинством клиентов
работать не будет.  С учётом "listen ... http2" в конфиге -
обновление до 1.0.2 могло "помочь" просто за счёт того, что HTTP/2
заработал, и количество устанавливаемых соединений соответственно
уменьшилось.


--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-30 Пенетрантность Maxim Dounin
Hello!

On Wed, Aug 28, 2019 at 09:18:44PM +0500, Dmitry Sergeev wrote:

> Вообще мне это конечно помогло, но  не полностью. На версии 1.0.2g во 
> время reload'а проц грузит полностью  около 5-10 секунд (вместо 40-300 
> секунд на 1.0.1u), теперь просто оно особо проблем не вызывает у 
> клиентов. Но в целом проблема осталась, просто теперь она не так сильно 
> беспокоит.
> 
> Сейчас задача замедлилась, но в итоге буду поднимать тестовый стенд с 
> нагрузкой, и смотреть можно ли как-то повлиять на это.
> Если конечно тут не подскажут, что еще можно подкрутить.

Судя по perf top, проблема в том, что клиенты после reload'а 
переустанавливают соединения, и это выливается в полный SSL 
handshake - что и приводит к потреблению CPU.

Посмотреть стоит на:

- ssl_session_cache - в конфиге его, судя по всему, нет (или 
  соответствующие части конфига не показаны);

- сертификаты, в частности - их битность (just in case, RSA более 
  2048 использовать не надо, это тупо очень дорого с точки зрения 
  процессора) и тип (лучше использовать ECDSA, но тут уже может 
  встать вопрос совместимости; при желании можно использовать и RSA 
  и ECDSA одновременно);

- используемые шифры, особенно - шифры с классическим DH для 
  обмена ключами (по умолчанию эти шифры не используются начиная с 
  nginx 1.11.0, но некоторые любят указывать ssl_dhparam в конфиге, 
  да ещё и с параметрами большой битности; не надо так);

> Насчет старых клиентов, точно не могу сказать, но есть такой кейс 
> http://mailman.nginx.org/pipermail/nginx-ru/2019-April/062014.html. Я 
> хорошо не изучал этот вопрос, но факт остается, на старой версии openssl 
> ошибок у клиентов в 3-4 раза было меньше. В итоге решили что это клиенты 
> с очень старым ssl.

Как уже говорилось в треде по ссылке, использование OpenSSL 
1.0.1u автоматически означет, что HTTP/2 с большинством клиентов 
работать не будет.  С учётом "listen ... http2" в конфиге - 
обновление до 1.0.2 могло "помочь" просто за счёт того, что HTTP/2 
заработал, и количество устанавливаемых соединений соответственно 
уменьшилось.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-28 Пенетрантность Илья Шипицин
А ради интереса, можете для истории снять SSL labs server test для двух
ваших версий openssl?

 У него есть табличка с эмуляцией хендшейков, будут в ней отличия или нет?

On Wed, Aug 28, 2019, 9:19 PM Dmitry Sergeev  wrote:

> Вообще мне это конечно помогло, но  не полностью. На версии 1.0.2g во
> время reload'а проц грузит полностью  около 5-10 секунд (вместо 40-300
> секунд на 1.0.1u), теперь просто оно особо проблем не вызывает у
> клиентов. Но в целом проблема осталась, просто теперь она не так сильно
> беспокоит.
>
> Сейчас задача замедлилась, но в итоге буду поднимать тестовый стенд с
> нагрузкой, и смотреть можно ли как-то повлиять на это.
> Если конечно тут не подскажут, что еще можно подкрутить.
>
> Насчет старых клиентов, точно не могу сказать, но есть такой кейс
> http://mailman.nginx.org/pipermail/nginx-ru/2019-April/062014.html. Я
> хорошо не изучал этот вопрос, но факт остается, на старой версии openssl
> ошибок у клиентов в 3-4 раза было меньше. В итоге решили что это клиенты
> с очень старым ssl.
>
> On 27/08/2019 23:25, ngnx8810773a83 wrote:
> > А с какими старыми клиентами не совместим 1.0.2g, который сам тоже не
> > слишком свеж ? В мае был релиз 1.0.2s а g, это гдето в марте 16 года
> было.
> >
> > Если Вы про sslv2 то оно там есть.у меня специально для этих целей живет
> > нгинкс собранный с 1.0.2m.
> > если кастомный openssl собиратете через сборку nginx с --with-openssl ,
> то
> > ему можно пихнуть кастомные параметры в configure через
> --with-openssl-opt
> > для всяких оптимизаций. если совсем какито раритеты, то пихните туда
> > enable-weak-ssl-ciphers enable-ssl2..
> >
> > Posted at Nginx Forum:
> https://forum.nginx.org/read.php?21,285412,285421#msg-285421
> >
> > ___
> > nginx-ru mailing list
> > nginx-ru@nginx.org
> > http://mailman.nginx.org/mailman/listinfo/nginx-ru
>
> --
> Kind regards
> Dmitry Sergeev
> Tel: +7 (951) 129-75-72
>
> ___
> nginx-ru mailing list
> nginx-ru@nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-28 Пенетрантность Dmitry Sergeev
Вообще мне это конечно помогло, но  не полностью. На версии 1.0.2g во 
время reload'а проц грузит полностью  около 5-10 секунд (вместо 40-300 
секунд на 1.0.1u), теперь просто оно особо проблем не вызывает у 
клиентов. Но в целом проблема осталась, просто теперь она не так сильно 
беспокоит.


Сейчас задача замедлилась, но в итоге буду поднимать тестовый стенд с 
нагрузкой, и смотреть можно ли как-то повлиять на это.

Если конечно тут не подскажут, что еще можно подкрутить.

Насчет старых клиентов, точно не могу сказать, но есть такой кейс 
http://mailman.nginx.org/pipermail/nginx-ru/2019-April/062014.html. Я 
хорошо не изучал этот вопрос, но факт остается, на старой версии openssl 
ошибок у клиентов в 3-4 раза было меньше. В итоге решили что это клиенты 
с очень старым ssl.


On 27/08/2019 23:25, ngnx8810773a83 wrote:

А с какими старыми клиентами не совместим 1.0.2g, который сам тоже не
слишком свеж ? В мае был релиз 1.0.2s а g, это гдето в марте 16 года было.

Если Вы про sslv2 то оно там есть.у меня специально для этих целей живет
нгинкс собранный с 1.0.2m.
если кастомный openssl собиратете через сборку nginx с --with-openssl ,  то
ему можно пихнуть кастомные параметры в configure через --with-openssl-opt
для всяких оптимизаций. если совсем какито раритеты, то пихните туда
enable-weak-ssl-ciphers enable-ssl2..

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285412,285421#msg-285421

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru


--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность ngnx8810773a83
А с какими старыми клиентами не совместим 1.0.2g, который сам тоже не
слишком свеж ? В мае был релиз 1.0.2s а g, это гдето в марте 16 года было.

Если Вы про sslv2 то оно там есть.у меня специально для этих целей живет
нгинкс собранный с 1.0.2m.
если кастомный openssl собиратете через сборку nginx с --with-openssl ,  то
ему можно пихнуть кастомные параметры в configure через --with-openssl-opt
для всяких оптимизаций. если совсем какито раритеты, то пихните туда
enable-weak-ssl-ciphers enable-ssl2..

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285412,285421#msg-285421

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev

Нашел причину, проблема была в старом ssl - openssl 1.0.1u.
perf top показывал: 
http://dl3.joxi.net/drive/2019/08/27/0030/2608/1985072/72/88257baf85.jpg


Попробвал обычную версию 1.0.2g и проблемы ушли. Осталось уговорить 
менеджеров забить на 1% старых ssl клиентов.


On 27/08/2019 18:08, Dmitry Sergeev wrote:

Затестил. Без модуля vts тоже самое поведение.



--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev

Затестил. Без модуля vts тоже самое поведение.


--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev
Еще нюанс забыл указать. nginx компилировал с модулем vts. Возможно с 
ним проблема. Проверю это.



--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev

Прошу прощения, особенности почтового клиента.

Конфиг такой:

user www-data;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65000;
pid /var/run/nginx.pid;

events
{
    worker_connections 1;
    multi_accept off;
}

http
{
    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 10;
    types_hash_max_size 2048;
    server_tokens on;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    client_body_timeout 60;
    client_header_timeout 60;
    send_timeout 60;
    reset_timedout_connection on;

    ##
    # Logging Settings
    ##

    access_log off;
    error_log /var/log/nginx/error.log;

    #
    # Caching FS
    #
    open_file_cache max=1;
    open_file_cache_errors on;


    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";
    gzip_types text/plain text/css application/json 
application/x-javascript text/xml application/xml application/xml+rss 
text/javascript application/javascript application/octet-stream;


    ##
    # Maps
    ##
    map $status $status_error
    {
    "~*^(1|2|3)"  0;
    default 1;
    }

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

И пример конфига виртуальных хостов для nodejs и php:
upstream nodejs_backend
{
    ip_hash;
    keepalive 32;
    server server1:4201 weight=1;
    server server2:4201 weight=3;
}


log_format file_c escape=json 
'{"HOST":"$host","LOCATION":"$location","IP":"$remote_addr","PROJECT":"nodejs_backend","HTTP_STATUS":"$status","RESPONSE_TIME":"$request_time","UPSTREAM_CONNECT_TIME":"$upstream_connect_time","UPSTREAM_RESPONSE_TIME":"$upstream_response_time","REQUEST_METHOD":"$request_method","REQUEST_FILE":"$uri","ARGS":"$args","BYTES_SENT":"$bytes_sent","USER_AGENT":"$http_user_agent","HTTP_REFERER":"$http_referer","ENVIRONMENT":"production","AKAMAI_IP":"$http_true_client_ip","HEADER_ACCEPT":"$http_accept","HEADER_ACCEPT_LANGUAGE":"$http_accept_language","HEADER_CONTENT_LANGUAGE":"$http_content_language","HEADER_CONTENT_TYPE":"$http_content_type","BODY":"$request_body"}';


server
{
    listen [::]:80;
    listen 80;
    # SSL
    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    server_name nodejs_domain;
    root /var/www/nodejs_domain/docroot;

    ###Logs
    # Local logs
    access_log /var/log/nginx/nodejs_domain_access.log 
file_nodejs_backend if=$status_error;

    error_log /var/log/nginx/nodejs_domain_error.log;


    location = /robots.txt
    {
    set $location "robots";
    return 200 "User-agent: *\nDisallow: /\n";
    }

    location = /https:/nodejs_domain
    {
    set $location "ssl_checker";
    return 200 "for ssl checker\n";
    }

    location ~ /\.(git|svn|hg)
    {
    deny all;
    }

    location /
    {
    try_files /bpcZzfcaG82kpcm9Xxic8hWJ89YjqrJCRihmHGGmBqFnU6gV 
@backend;

    }

    location @backend
    {
    set $location "nodejs";
    proxy_pass http://nodejs_backend;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_read_timeout 10s;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /.well-known
    {
    set $location "well-known";
    root   /usr/share/nginx/html;
    }
}

пример конфига для php:

upstream php_backend
{
    ip_hash;
    server server6:4301 weight=1;
}


log_format file_php_domain escape=json 
'{"HOST":"$host","LOCATION":"$location","IP":"$remote_addr","PROJECT":"php_backend","HTTP_STATUS":"$status","RESPONSE_TIME":"$request_time","UPSTREAM_CONNECT_TIME":"$upstream_connect_time","UPSTREAM_RESPONSE_TIME":"$upstream_response_time","REQUEST_METHOD":"$request_method","REQUEST_FILE":"$uri","ARGS":"$args","BYTES_SENT":"$bytes_sent","USER_AGENT":"$http_user_agent","HTTP_REFERER":"$http_referer","ENVIRONMENT":"production","AKAMAI_IP":"$http_true_client_ip","HEADER_ACCEPT":"$http_accept","HEADER_ACCEPT_LANGUAGE":"$http_accept_language","HEADER_CONTENT_LANGUAGE":"$http_content_language","HEADER_CONTENT_TYPE":"$http_content_type","BODY":"$request_body"}';


server
{
    listen [::]:80;
    listen 80;
    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    server_name php_domain;
    root /var/www/php_domain/docroot;

    access_log /var/log/nginx/php_domain_access.log file_php_domain 
if=$status_error;

    error_log /var/log/nginx/php_domain_error.log;


    location = /robots.txt
    {
    set $location "robots";
    return 200 "User-agent: *\nDisallow: /\n";
    }

    location = /https:/php_domain
    {
    set $location "ssl_checker"

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Maxim Dounin
Hello!

On Tue, Aug 27, 2019 at 04:10:31PM +0500, Dmitry Sergeev wrote:

> Добрый день. Спасибо за ответ!

Пожалуйста.  Не надо отвечать мне лично, от этого карма портится.  
Спасибо.

> На сервере всего 64GB памяти, nginx кушает обычно около 2GB при релоадет 
> не сильно больше - 2-3GB, swap не задействуется. Свободно памяти обычно 
> больше 60GB.
> 
> Сейчас протестил. При релоаде съедает весь проц ровно 35-40 секунд. 
> Провел около 10 тестов, время всегда примерно такое.

Значит проблема не в памяти, а в чём-то ещё.  Что в конфиге?

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Maxim Dounin
Hello!

On Tue, Aug 27, 2019 at 03:24:03PM +0500, Dmitry Sergeev wrote:

> Версия: 1.14.2
> ОС: ubuntu 16.04
> Процессор: Intel Core i7-6700 CPU 3.40GHz
> 
> Средняя нагрузка: 5 000 rps, пиковые значения 12 000 rps.  Статики 
> практически нет, все запросы проксируются либо на бэкенды с nodejs через 
> proxy_pass либо на php-fpm через fastcgi_pass. Виртуальных хостов 16, 
> несколько из них имеют среднюю нагрузку 2K rps, остальные 500 rps.
> 
> С бэкендами nodejs включен keepalive, с php отключен.
> 
> Кроме nginx на сервере ничего нет.
> 
> Проблема в том, что при reload'e конфигурации, несколько минут nginx 
> начинает жрать весь процессор, все ядра под 100%, и запросы начинают 
> обрабатываться медленно либо совсем сбрасываются, отсюда куча ошибок у 
> клиентов. Такая проблема наблюдается только на серверах, где много 
> виртуальных хостов (15-30). На серверах с аналогичной нагрузкой, но 
> например 1-3 виртуальными хостами. Таких проблем не наблюдаю.
> 
> Может быть кто-нибудь подскажет, как можно это оптимизировать, что-то 
> подкрутить. Может можно как-то плавнее релоадить, чтобы медленее, но при 
> этом нагрузка на CPU как-то плавнее распределялась.

Для начала - имеет смысл посмотреть на количество доступной 
памяти.  При релоаде количество рабочих процессов увеличивается 
вдвое, и если памяти мало - система может уходить в свап с 
печальными последствиями.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev

Версия: 1.14.2
ОС: ubuntu 16.04
Процессор: Intel Core i7-6700 CPU 3.40GHz

Средняя нагрузка: 5 000 rps, пиковые значения 12 000 rps.  Статики 
практически нет, все запросы проксируются либо на бэкенды с nodejs через 
proxy_pass либо на php-fpm через fastcgi_pass. Виртуальных хостов 16, 
несколько из них имеют среднюю нагрузку 2K rps, остальные 500 rps.


С бэкендами nodejs включен keepalive, с php отключен.

Кроме nginx на сервере ничего нет.

Проблема в том, что при reload'e конфигурации, несколько минут nginx 
начинает жрать весь процессор, все ядра под 100%, и запросы начинают 
обрабатываться медленно либо совсем сбрасываются, отсюда куча ошибок у 
клиентов. Такая проблема наблюдается только на серверах, где много 
виртуальных хостов (15-30). На серверах с аналогичной нагрузкой, но 
например 1-3 виртуальными хостами. Таких проблем не наблюдаю.


Может быть кто-нибудь подскажет, как можно это оптимизировать, что-то 
подкрутить. Может можно как-то плавнее релоадить, чтобы медленее, но при 
этом нагрузка на CPU как-то плавнее распределялась.


--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru