При просмотре Интернета мы все знаем, что шифрование через SSL очень важно. В PayPal безопасность является нашим главным приоритетом. Мы используем сквозное шифрование, не только наши общественные сайты, но и для наших внутренних сервисных вызовов. Технология шифрования SSL в значительной степени повлияет на производительность node.js. Мы потратили время, чтобы настроить наши внешние услуги и максимально использовать их. Вот список некоторой настройки конфигурации SSL, которая, по нашему мнению, значительно улучшит внешнюю производительность SSL.
SSL пароль
Из коробки SSL Node.js использует очень мощный набор алгоритмов паролей. В частности, алгоритмы дидипции Герман и алгоритмы эллиптической кривой чрезвычайно дороги. И когда вы используете слишком много внешних вызовов SSL в конфигурации по умолчанию, производительность node.js будет фундаментально ослаблена. Чтобы сделать вывод, насколько он медленно, вот образец процессора обслуживания:
918834,0 мс 100,0% 0,0 Узел (91770) 911376,0 мс 99,1% 0,0 Start911376,0 мс 99,1% 0,0 Узел :: Start911363.0MS 99,1% 48,0 UV_RUN909839.0MS 99,0% 438,0%. uv__stream_io873590.0ms 95.0% 32.0 node::StreamWrap::OnReadCommon873373.0ms 95.0% 7.0 node::MakeCallback873265.0ms 95.0% 15.0 node::MakeDomainCallback873125.0ms 95.0% 61.0 v8::Function::Call873049.0ms 95,0% 13364,0 _ZN2V88Internall6invokeebns0832660.0ms 90,6% 431,0 _ZN2V88Internall21builtin821687,0MS 89,4% 39,0 Node :: Crypto :: Connection ::: learout813884.0ms 88.0ms 88.0. ssl23_connect813562.0ms 88,5% 54,0 SSL3_Connect802651.0ms 87,3% 35,0 SSL3_SEND_CLIENT_KEY_EXCHANGE417323.0MS 45,4% 7,0 ECE_KEY_KEY383185.0MS 41.7% 12,0%. 0,1% 4,0 TLS1_Generate_master_secret123.0ms 0,0% 4,0 SSL3_DO_WRITE ...
Давайте сосредоточимся на генерации ключей:
802651,0 мс 87,3% 35,0 SSL3_SEND_CLIENT_KEY_EXCHANGE417323.0MS 45,4% 7.0 EC_KEY_GENERE_KEY383185.0MS 41,7% 12.0 ECDH_COMPUTE_KEY
87% этого вызова тратится на создание ключа!
Эти пароли могут быть изменены, чтобы уменьшить интенсивные вычисления. Эта идея была реализована в HTTPS (или прокси). Например:
var Agent = new https.agent ({"key": key, "cert": cert, "ciphers": "aes256-gcm-sha384"});Вышеуказанные ключи больше не обмениваются с дорогими ключами Diffie Herman. После замены чего -то подобного мы можем увидеть значительные изменения в следующем примере:
... 57945,0 мс 32,5% 16,0 SSL3_SEND_CLIENT_KEY_EXCHANGE28958,0MS 16,2% 9.0 GENERATE_KEY26827,0MS 15,0% 2.0 COMPUTE_KEY ...
С помощью документации OpenSSL вы можете узнать больше о строках пароля.
SSL Session Recovery
Если ваш сервер поддерживает восстановление сеанса SSL, вы можете пройти сеанс через HTTPS (или прокси). Вы также можете обернуть функцию CreameNection Proxy:
var createConnection = Agent.CreateConnection; Agent.CreateConnection = function (options) {options.session = session; return createConnection.call (Agent, Options);};Добавив в подключение короткую систему держателя телефона, восстановление сеанса может уменьшить использование соединений.
Оставаться активным
Позволяя прокси оставаться активным, облегчит рукопожатие SSL. Агент Keep-Alive, такой как AgentBearPalive, может решить проблему узел, сохраняющего активность, но в узле 0,12 это нет необходимости.
Еще одна вещь, которую нужно помнить, это прокси -макссокиты. Если это значение высокое, оно может оказать негативное влияние на производительность. Управляйте своим значением MaxSockets в зависимости от количества внешних соединений, которые вы создаете.
Размер плиты
tls.slab_buffer_size определяет размер распределения буфера для плиты, используемого клиентом TLS (сервер). Его размер по умолчанию до 10 МБ.
Эти выделенные интервалы расширят ваш RSS и увеличат время для сбора мусора. Это означает, что высокая емкость повлияет на производительность. Регулировка этой мощности в относительно низкое значение может улучшить производительность памяти и сбора мусора. В версии 0.12 распределение плиты было улучшено, и дальнейшая корректировка не требуется.
Недавние изменения в SSL в 0,12
Проверьте SSL Enhanced версию Fedor.
Инструкции по тестированию
Запустите HTTP Service в качестве прокси -сервера SSL, все работающие на машине.
v0.10.22
Запуск 10S тест @ http://127.0.0.1:3000/20 и 20 соединений статистики avg stdev max +/- stdevlatency 69,38 мс 30,43 мс 268,56 мс 95,24%. ReadRequests/Sec: 305.28 Transfer/Sec: 33,69 КБ
v0.11.10-pre (построенный из основной версии)
Запуск 10S Test @ http://127.0.0.1:3000/20 и 20 соединений статистики AVG Stdev Max +/- Stdevlatency 75,87 мс 7,10 мс 102,87 мс 71,55%req/sec 12,77 2.43 19,00 64,17%2620 Запросы. 261.86 Transfer/Sec: 27,62KB
Разница не очень много, но это должно быть связано с паролем по умолчанию, поэтому давайте настроим параметры прокси для пароля. Например:
var Agent = new https.agent ({"key": key, "cert": cert, "ciphers": "aes256-gcm-sha384"});v0.10.22
Запуск 10S тест @ http: // localhost: 3000/20 потоков и 20 соединений статистики avg stdev max +/- stdevlatency 59,85 мс 6,77 мс 95,71m 333.79 Transfer/Sec: 36,83KB
v0.11.10-pre (построенный из основной версии)
Запуск 10S Test @ http: // localhost: 3000/20 потоков и 20 соединений статистики avg stdev max +/- stdevlatency 38,99 мс 5,96 мс 71,87 мс 86,22%. 515.80Transfer/Sec: 56,92KB
Как мы видим, после модификации Fedor это огромная разница: производительность от 0,10 до 0,12 почти в 2 раза хуже!
Суммировать
Некоторые люди могут спросить: «Почему бы просто не выключить SSL, это будет быстрее после его отключения», а для некоторых это также вариант. На самом деле, это более репрезентативный ответ, когда я спрашиваю других, как они решают проблемы с производительностью SSL. Однако, если что -то, что для предприятия SSL требуется, только увеличивается, но не уменьшается; И, несмотря на многое, чтобы улучшить SSL в node.js, настройка производительности все еще необходима. Я надеюсь, что некоторые из упомянутых выше методов помогут вам настроить производительность использования SSL.