最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

提高NodeJS中SSL服務(wù)的性能

 更新時(shí)間:2014年07月15日 10:19:36   投稿:hebedich  
盡管OpenSSL露出驚天漏洞,但是基于SSL的加密協(xié)議還是應(yīng)用得最廣泛的,這只是OpenSSL這個(gè)開(kāi)源軟件本身的問(wèn)題(詳情: OpenSSL是坑貨寫(xiě)的),下面這篇文章提供了一些如何在NodeJS中,提高HTTPS性能方面的技巧

在瀏覽互聯(lián)網(wǎng)時(shí),我們都知道,通過(guò)SSL進(jìn)行加密是非常重要的。在貝寶(PayPal),安全是我們的首要任務(wù)。我們使用端到端的加密,不僅只是我們的公共網(wǎng)站,對(duì)于我們的內(nèi)部服務(wù)調(diào)用也同樣如此。SSL加密技術(shù)將在很大程度上影響node.js的性能。我們已經(jīng)花時(shí)間調(diào)整我們的對(duì)外服務(wù),并充分地利用他們。下面是一些我們發(fā)現(xiàn)能顯著地提高SSL對(duì)外性能的SSL配置調(diào)整清單。

SSL密碼

開(kāi)箱即用,Node.js 的SSL使用一組非常強(qiáng)大的密碼算法。特別是,迪菲赫爾曼密鑰交換和橢圓曲線算法是極其昂貴的。而且當(dāng)你在默認(rèn)配置中用了太多的對(duì)外SSL調(diào)用,Node.js的性能將從根本上得到削弱。為了得到它到底有多慢這個(gè)結(jié)論,這兒有個(gè)服務(wù)調(diào)用的CPU樣本:

918834.0ms 100.0% 0.0 node (91770)
911376.0ms 99.1% 0.0  start
911376.0ms 99.1% 0.0  node::Start
911363.0ms 99.1% 48.0  uv_run
909839.0ms 99.0% 438.0  uv__io_poll
876570.0ms 95.4% 849.0   uv__stream_io
873590.0ms 95.0% 32.0    node::StreamWrap::OnReadCommon
873373.0ms 95.0% 7.0     node::MakeCallback
873265.0ms 95.0% 15.0     node::MakeDomainCallback
873125.0ms 95.0% 61.0     v8::Function::Call
873049.0ms 95.0% 13364.0    _ZN2v88internalL6InvokeEbNS0
832660.0ms 90.6% 431.0     _ZN2v88internalL21Builtin
821687.0ms 89.4% 39.0      node::crypto::Connection::ClearOut
813884.0ms 88.5% 37.0       ssl23_connect
813562.0ms 88.5% 54.0       ssl3_connect
802651.0ms 87.3% 35.0        ssl3_send_client_key_exchange
417323.0ms 45.4% 7.0         EC_KEY_generate_key
383185.0ms 41.7% 12.0        ecdh_compute_key
1545.0ms 0.1% 4.0          tls1_generate_master_secret
123.0ms 0.0% 4.0           ssl3_do_write
...

讓我們重點(diǎn)關(guān)注一下密鑰的生成:

802651.0ms 87.3% 35.0 ssl3_send_client_key_exchange
417323.0ms 45.4% 7.0 EC_KEY_generate_key
383185.0ms 41.7% 12.0 ecdh_compute_key

這個(gè)調(diào)用87%的時(shí)間都花在了生成密鑰上!

這些密碼能被改變以減少密集的計(jì)算。這個(gè)想法已經(jīng)在https(或代理)得以實(shí)現(xiàn)了。例如:

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

上面的密鑰已經(jīng)沒(méi)用昂貴的迪菲赫爾曼密鑰交換。用相似的東西代替之后,在下面的樣例中我們能看到顯著的變化:

...
57945.0ms 32.5% 16.0 ssl3_send_client_key_exchange
28958.0ms 16.2% 9.0 generate_key
26827.0ms 15.0% 2.0 compute_key
...

通過(guò)OpenSSL文檔,你可以學(xué)習(xí)更多關(guān)于密碼串的東西。

SSL會(huì)話恢復(fù)
 
如果您的服務(wù)器支持SSL會(huì)話恢復(fù),那么你可以通過(guò)https(或代理)來(lái)傳遞會(huì)話。你也可以將代理的createConnection函數(shù)包裹起來(lái):

var createConnection = agent.createConnection;

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

通過(guò)給連接增加簡(jiǎn)短的握手機(jī)制,會(huì)話恢復(fù)能降低連接數(shù)的使用。

保持活動(dòng)
 
允許代理保持活動(dòng)將緩和SSL握手。一個(gè)保持活動(dòng)的代理,比如agentkeepalive可以修復(fù)結(jié)點(diǎn)保持活動(dòng)的問(wèn)題,但在Node0.12中它是非必須的。

另一個(gè)需要銘記在心的東西是代理的maxSockets,這個(gè)值高的話能對(duì)性能造成負(fù)面的影響。在你創(chuàng)建的對(duì)外連接數(shù)量的基礎(chǔ)上控制你的maxSockets值。

Slab的大小
 
tls.SLAB_BUFFER_SIZE決定了被tls客戶端(服務(wù)器)使用的slab緩沖區(qū)的分配大小。它的大小默認(rèn)為10MB。

這些分配的區(qū)間將會(huì)擴(kuò)展你的rss且會(huì)增加垃圾回收的時(shí)間。這意味著高容量將會(huì)影響到性能。把這個(gè)容量調(diào)整到一個(gè)比較低的值可以改善內(nèi)存和垃圾收集的性能。在0.12 版本中,slab的分配已經(jīng)得到改善了,沒(méi)有必須再調(diào)整了。

SSL在0.12中近期的改變
 
測(cè)試Fedor的SSL增強(qiáng)版。

測(cè)試說(shuō)明

運(yùn)行一個(gè)作為SSL服務(wù)代理的http服務(wù),全部運(yùn)行在本機(jī)上。

v0.10.22

Running 10s test @ http://127.0.0.1:3000/
20 threads and 20 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 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 read
Requests/sec: 305.28
Transfer/sec: 33.69KB

v0.11.10-pre (從主版本構(gòu)建)

Running 10s test @ http://127.0.0.1:3000/
20 threads and 20 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 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 read
Requests/sec: 261.86
Transfer/sec: 27.62KB

這沒(méi)有太多的區(qū)別,但這應(yīng)歸于默認(rèn)密碼,所以讓我們調(diào)整密碼的代理選項(xiàng)。例如:

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 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 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 read
Requests/sec: 333.79
Transfer/sec: 36.83KB

v0.11.10-pre (從主版本構(gòu)建)

Running 10s test @ http://localhost:3000/
20 threads and 20 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 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 read
Requests/sec: 515.80
Transfer/sec: 56.92KB

正如我們所見(jiàn),經(jīng)過(guò)Fedor的修改,這有著巨大的區(qū)別:從0.10到0.12性能差不多差著2倍左右!

總結(jié)

有人可能會(huì)問(wèn)“為什么不僅僅只是關(guān)掉SSL呢,關(guān)了之后它就會(huì)變得快起來(lái)”,且對(duì)于一些人來(lái)說(shuō)這也是一種選擇。實(shí)際上,當(dāng)我問(wèn)別人他們是如何解決SSL性能問(wèn)題的時(shí)候這是比較有代表性的答案。但是,如果企業(yè)SSL要求的任何東西只增加不減少;且盡管已經(jīng)做了很多來(lái)改善Node.js中的SSL,性能調(diào)整仍然還是需要的。我希望上述的一些技藝能夠幫助你調(diào)整SSL用例性能。

相關(guān)文章

  • node高并發(fā)原理機(jī)制解讀

    node高并發(fā)原理機(jī)制解讀

    這篇文章主要介紹了node高并發(fā)原理機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 詳解使用Typescript開(kāi)發(fā)node.js項(xiàng)目(簡(jiǎn)單的環(huán)境配置)

    詳解使用Typescript開(kāi)發(fā)node.js項(xiàng)目(簡(jiǎn)單的環(huán)境配置)

    本篇文章主要介紹了詳解使用Typescript開(kāi)發(fā)node.js項(xiàng)目(簡(jiǎn)單的環(huán)境配置),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-10-10
  • 淺談nodejs中的類定義和繼承的套路

    淺談nodejs中的類定義和繼承的套路

    本篇文章主要介紹了淺談nodejs中的類定義和繼承的套路,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Node.js實(shí)現(xiàn)批量去除BOM文件頭

    Node.js實(shí)現(xiàn)批量去除BOM文件頭

    這篇文章主要介紹了Node.js實(shí)現(xiàn)批量去除BOM文件頭,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-12-12
  • Node.JS獲取GET,POST數(shù)據(jù)之queryString模塊使用方法詳解

    Node.JS獲取GET,POST數(shù)據(jù)之queryString模塊使用方法詳解

    本文將詳細(xì)介紹nodeJS中的queryString模塊使用方法,包括Node.JS獲取GET,POST數(shù)據(jù)的方法,需要的朋友可以參考下
    2020-02-02
  • nodejs二進(jìn)制與Buffer的介紹與使用

    nodejs二進(jìn)制與Buffer的介紹與使用

    這篇文章主要給大家介紹了關(guān)于nodejs二進(jìn)制與Buffer的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用nodejs具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • nvm mac 環(huán)境搭建過(guò)程

    nvm mac 環(huán)境搭建過(guò)程

    這篇文章主要為大家介紹了nvm mac 環(huán)境搭建過(guò)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Node.js筆記之process模塊解讀

    Node.js筆記之process模塊解讀

    這篇文章主要介紹了Node.js process模塊解讀,process存在于全局對(duì)象上,不需要使用require()加載即可使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • express中static中間件的具體使用方法

    express中static中間件的具體使用方法

    這篇文章主要介紹了express中static中間件的具體使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • node中短信api實(shí)現(xiàn)驗(yàn)證碼登錄的示例代碼

    node中短信api實(shí)現(xiàn)驗(yàn)證碼登錄的示例代碼

    這篇文章主要介紹了node中短信api實(shí)現(xiàn)驗(yàn)證碼登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評(píng)論

连江县| 霍州市| 甘南县| 商水县| 开封县| 墨脱县| 海城市| 开远市| 繁昌县| 永仁县| 闸北区| 会理县| 白沙| 东山县| 乐都县| 贵阳市| 柞水县| 林周县| 崇礼县| 山阴县| 浮山县| 盐池县| 五莲县| 清流县| 四平市| 紫阳县| 井研县| 汝南县| 宜兰市| 赤水市| 汾西县| 秀山| 宁陕县| 博白县| 赤峰市| 工布江达县| 射阳县| 丹江口市| 洮南市| 定陶县| 泸西县|