NodeJSにおけるSSLサービスの性能を向上させる.

5071 ワード

インターネットを見ていると、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  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
...
鍵の生成に注目しましょう.

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
この呼び出しは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_exchange
28958.0ms 16.2% 9.0 generate_key
26827.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握手を緩和することができます.1つの活動を維持するエージェント、例えば、agentkeepaliveは、ノード0.12において、ノード0.12において、ノードの活動を修復することができるが、それは必須ではない.
もう一つの心に銘記するべきものは代理のmaxSocketsであり、この値が高いと性能に悪影響を与える.あなたが作成した対外接続の数に基づいて、maxSocketsの値をコントロールします.
Slabのサイズ  tls.SLAB_BUFER_SIZEは、tlsクライアント(サーバ)によって使用されるslabバッファの割り当てサイズを決定した.そのサイズはデフォルトでは10 MBです.
これらの配分の区間はあなたのrssを広げて、ゴミ回収の時間を増やします.これは、高容量が性能に影響を及ぼすことを意味する.この容量を低い値に調整するとメモリやゴミ収集の性能が向上します.0.12バージョンでは、slabの割り当ては改善されました.これ以上調整する必要はありません.
SSLは0.12における最近の変化  FedorのSSL拡張版をテストします.
テストの説明
SSLサービスの代行であるhttpサービスを運行しています.全部本機で運行しています.
v 0.12

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
v 0.1.10-pre(メインバージョンから構築)

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
この違いはあまりないですが、これはデフォルトのパスワードですので、パスワードのプロキシオプションを調整します.たとえば:

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

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
v 0.1.10-pre(メインバージョンから構築)

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
私たちが見ているように、Fedorの修正を経て、これは大きな違いがあります.0.10から0.12までの性能は2倍ぐらい違います.
締め括りをつける
SSLを切るだけではなく、切ったら速くなるのはなぜですか?実際にSSLの性能問題をどうやって解決しますか?しかし、もし企業SSLが要求するものが増えても減らない.また、Node.jsのSSLを改善するために多くのことをしましたが、性能調整はまだ必要です.上記のいくつかのスキルがSSLの用例性能を調整するのを助けてくれることを願っています.