时间:2021-05-18
在浏览互联网时,我们都知道,通过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函数包裹起来:
通过给连接增加简短的握手机制,会话恢复能降低连接数的使用。
保持活动
允许代理保持活动将缓和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.69KBv0.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.83KBv0.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用例性能。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
项目(nodejs)中需要一次性插入多笔数据到数据库,数据库是mysql的,由于循环插入的性能太差,就像使用批量插入的方法提高数据的插入性能。批量插入的数据库的
ssl证书是一种可以在网站服务器中配置的安全证书。也就是说,在网站配置了该证书之后,网站的安全性可以得到提高。因此,现在许多企业为他们的网站配置ssl证书来保护
服务器的实现很简单,先装一个nodeJs的模块,叫nodejs-websocket,直接在nodeJs命令行中敲入:npminstallnodejs-webso
电脑管家ssl协议未开启的原因: 1、客户端的SSL协议主要是基于网页的在Internet选项中修改。如果是服务器的话,应该是服务没有开启或者SSL模块的问题
以网络为例,ssl协议未开启的意思是指服务器中的服务没有开启或者没有SSL模块。SSL及其继任者传输层安全是为网络通信提供安全及数据完整性的一种安全协议。TLS