尽管OpenSSL惊天漏洞,但是基于SSL的加密协议还是应用得最广泛的,这只是OpenSSL这个开源软件本身的问题(详情:OpenSSL是坑货写的),下面这篇文章提供了一些如何在NodeJS中,提高HTTPS性能方面的

在浏览互联网时,我们都知道,通过SSL进行加密是非常重要的。在贝宝(PayPal),安全是我们的首要任务。我们使用端到端的加密,不仅只是我们的公共网站,对于我们的内部服务调用也同样如此。SSL加密技术将在很大程度上影响node.js的性能。我们已经花时间调整我们的对外服务,并充分地利用他们。下面是一些我们发现能显著地提高SSL对外性能的SSL配置调整清单。

SSL密码

开箱即用,Node.js 的SSL使用一组非常强大的密码算法。特别是,迪菲赫尔曼密钥交换和椭圆曲线算法是极其昂贵的。而且当你在默认配置中用了太多的对外SSL调用,Node.js的性能将从根本上得到削弱。为了得到它到底有多慢这个结论,这儿有个服务调用的CPU样本:

918834.0ms 100.0% 0.0 node (91770)911376.0ms 99.1% 0.0  start911376.0ms 99.1% 0.0  node::Start911363.0ms 99.1% 48.0  uv_run909839.0ms 99.0% 438.0  uv__io_poll876570.0ms 95.4% 849.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::ClearOut813884.0ms 88.5% 37.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         EC_KEY_generate_key383185.0ms 41.7% 12.0        ecdh_compute_key1545.0ms 0.1% 4.0          tls1_generate_master_secret123.0ms 0.0% 4.0           ssl3_do_write...

让我们重点关注一下密钥的生成:

802651.0ms 87.3% 35.0 ssl3_send_client_key_exchange417323.0ms 45.4% 7.0 EC_KEY_generate_key383185.0ms 41.7% 12.0 ecdh_compute_key

这个调用87%的时间都花在了生成密钥上!

这些密码能被改变以密集的计算。这个想法已经在https(或代理)得以实现了。例如:

var agent = new https.Agent({  "key": key,  "cert": cert,  "ciphers": "AES256-GCM-SHA384"});

上面的密钥已经没用昂贵的迪菲赫尔曼密钥交换。用相似的东西代替之后,在下面的样例中我们能看到显著的变化:

...57945.0ms 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会话恢复
 
如果您的服务器支持SSL会话恢复,那么你可以通过https(或代理)来传递会话。你也可以将代理的createConnection函数包裹起来:

var createConnection = agent.createConnection;agent.createConnection = function (options) {  options.session = session;  return createConnection.call(agent, options);};

通过给连接增加简短的握手机制,会话恢复能连接数的使用。

保持活动
 
允许代理保持活动将缓和SSL握手。一个保持活动的代理,比如agentkeepalive可以修复结点保持活动的问题,但在Node0.12中它是非必须的。

另一个需要铭记在心的东西是代理的maxSockets,这个值高的话能对性能造成负面的影响。在你创建的对外连接数量的基础上控制你的maxSockets值。

Slab的大小
 
tls.SLAB_BUFFER_SIZE决定了被tls客户端(服务器)使用的slab缓冲区的分配大小。它的大小默认为10MB。

这些分配的区间将会扩展你的rss且会增加垃圾回收的时间。这意味着高容量将会影响到性能。把这个容量调整到一个比较低的值可以改善内存和垃圾收集的性能。在0.12 版本中,slab的分配已经得到改善了,没有必须再调整了。

SSL在0.12中近期的改变
 
测试Fedor的SSL增强版。

测试说明

运行一个作为SSL服务代理的http服务,全部运行在本机上。

v0.10.22

Running 10s test @ http://127.0.0.1:3000/20 threads and 20 connectionsThread Stats Avg Stdev Max +/- StdevLatency 69.38ms 30.43ms 268.56ms 95.24%Req/Sec 14.95 4.16 20.00 58.65%3055 requests in 10.01s, 337.12KB readRequests/sec: 305.28Transfer/sec: 33.69KB

v0.11.10-pre (从主版本构建)

Running 10s test @ http://127.0.0.1:3000/20 threads and 20 connectionsThread Stats Avg Stdev Max +/- StdevLatency 75.87ms 7.10ms 102.87ms 71.55%Req/Sec 12.77 2.43 19.00 64.17%2620 requests in 10.01s, 276.33KB readRequests/sec: 261.86Transfer/sec: 27.62KB

这没有太多的区别,但这应归于默认密码,所以让我们调整密码的代理选项。例如:

var agent = new https.Agent({  "key": key,  "cert": cert,  "ciphers": "AES256-GCM-SHA384"});

v0.10.22

Running 10s test @ http://localhost:3000/20 threads and 20 connectionsThread Stats Avg Stdev Max +/- StdevLatency 59.85ms 6.77ms 95.71ms 77.29%Req/Sec 16.39 2.36 22.00 61.97%3339 requests in 10.00s, 368.46KB readRequests/sec: 333.79Transfer/sec: 36.83KB

v0.11.10-pre (从主版本构建)

Running 10s test @ http://localhost:3000/20 threads and 20 connectionsThread Stats Avg Stdev Max +/- StdevLatency 38.99ms 5.96ms 71.87ms 86.22%Req/Sec 25.43 5.70 35.00 63.36%5160 requests in 10.00s, 569.41KB readRequests/sec: 515.80Transfer/sec: 56.92KB

正如我们所见,经过Fedor的修改,这有着巨大的区别:从0.10到0.12性能差不多差着2倍左右!

总结

有人可能会问“为什么不仅仅只是关掉SSL呢,关了之后它就会变得快起来”,且对于一些人来说这也是一种选择。实际上,当我问别人他们是如何解决SSL性能问题的时候这是比较有代表性的答案。但是,如果企业SSL要求的任何东西只增加不;且尽管已经做了很多来改善Node.js中的SSL,性能调整仍然还是需要的。我希望上述的一些技艺能够帮助你调整SSL用例性能。

最新资讯
超红荣誉派对 1000+红人与亿万粉丝的独特线上颁奖盛典

超红荣誉派对 1000+红

10月26日,微博2020超级红人节“超红荣誉派对”接棒“V
韩财界一二代掌门人时代渐落幕 换帅进程加快

韩财界一二代掌门人时

引领韩国实现“汉江奇迹”和奠定产业基础的大企业集团
变味的百亿补贴:业界称沦为口号 有企业成立至今还没卖出百亿

变味的百亿补贴:业界称

出现不到两年,百亿补贴和直播带货一样,已然成为“双11”
快来了解一下“冥王号”登陆小行星取样吧

快来了解一下“冥王号

目前,冥王号实时传回的数据表明,它的触碰式样品采集设备
有线电视已经没落,流媒体将取而代之

有线电视已经没落,流媒

据报道,美国的媒体公司正逐步对有线电视的未来达成共识
摩拜创始人胡玮炜退出广州摩拜科技有限公司法定代表人、董事等

摩拜创始人胡玮炜退出

近日,广州摩拜科技有限公司发生工商变更,胡玮炜退出法定
最新文章
详解Vue的ref特性的使用

详解Vue的ref特性的使

这篇文章主要介绍了详解Vue的ref特性的使用,文中通过
vue学习笔记之slot插槽基本用法实例分析

vue学习笔记之slot插

这篇文章主要介绍了vue学习笔记之slot插槽基本用法,结
vue跳转方式(打开新页面)及传参操作示例

vue跳转方式(打开新页

这篇文章主要介绍了vue跳转方式(打开新页面)及传参操作,
vue学习笔记之过滤器的基本使用方法实例分析

vue学习笔记之过滤器

这篇文章主要介绍了vue学习笔记之过滤器的基本使用方
js获取本日、本周、本月的时间代码

js获取本日、本周、本

本篇文章给大家分享的内容是利用js如何获取本日、本周
node crawler如何添加promise支持

node crawler如何添加

这篇文章主要介绍了node crawler如何添加promise支持,