インターネットを閲覧するとき、私たちは皆、SSLを介した暗号化が非常に重要であることを知っています。 PayPalでは、セキュリティが最優先事項です。公開ウェブサイトだけでなく、内部サービスコールにもエンドツーエンドの暗号化を使用しています。 SSL暗号化テクノロジーは、node.jsのパフォーマンスに大きく影響します。外部サービスを調整し、それらを最大限に活用するのに時間をかけました。以下は、SSLの外部パフォーマンスを大幅に改善することがわかったSSL構成のチューニングのリストです。
SSLパスワード
node.jsのSSLは、非常に強力なパスワードアルゴリズムセットを使用しています。特に、Hermannキー交換と楕円曲線アルゴリズムは非常に高価です。また、デフォルトの構成で外部SSLコールが多すぎると、node.jsのパフォーマンスが根本的に弱体化します。それがどれほど遅い結論を得るために、こちらがサービスコールのCPUサンプルを紹介します。
918834.0ms 100.0%0.0ノード(91770)911376.0ms 99.1%0.0 start911376.0ms 99.1%0.0ノード:: Start911363.0ms 99.1%48.0 UV_RUN909839.0MS 99.0%438.0 UV____438.0 849.0 UV__STREAM_IO873590MS 95.0%32.0ノード:: StreamWrap :: OnReadCommon873373.0MS 95.0%7.0ノード:: Makecallback873265.0ms 95.0%15.0ノード:: MakedomainCallback873125.0ms 95.0ms 95.0ms 95.0ms 95.0m v8 :: function :: call873049.0ms 95.0%13364.0 _ZN2V88INTRENLL6INVOKEEBNS0832660.0MS 90.6%431.0 _ZN2v88Internall21Builtin821687.0ms 89.4%39.0ノード:: Crypto :: Connection :: Clearout813884.0ms 88.5%37.0 SSL23_Connect813562.0ms 88.5%54.0 SSL3_Connect802651.0ms 87.3%35.0 SSL3 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_KEY_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 Keysと交換されなくなりました。同様のものを置き換えた後、次の例で大幅な変更を確認できます。
... 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では必要ありません。
覚えておくべきもう1つのことは、プロキシマックスソケットです。この値が高い場合、パフォーマンスにマイナスの影響を与える可能性があります。作成した外部接続の数に基づいて、マックスソケット値を制御します。
スラブサイズ
TLS.SLAB_BUFFER_SIZE TLSクライアント(サーバー)が使用するスラブバッファーの割り当てサイズを決定します。そのサイズのデフォルトは10MBです。
これらの割り当てられた間隔は、RSSを拡張し、ゴミ収集の時間を増やします。これは、大容量がパフォーマンスに影響を与えることを意味します。この容量を比較的低い値に調整すると、メモリとゴミ収集のパフォーマンスが向上する可能性があります。バージョン0.12では、スラブ割り当てが改善されており、それ以上の調整は必要ありません。
0.12のSSLの最近の変化
FedorのSSL強化バージョンをテストします。
テスト手順
SSLサービスプロキシとしてHTTPサービスを実行し、すべてマシンで実行されます。
V0.10.22
10Sテスト @ http://127.0.0.1:3000/20スレッドと20のConnectionSthread Stat ReadRequests/Sec:305.28Transfer/Sec:33.69kb
v0.11.10-pre(メインバージョンから構築)
10Sテスト @ http://127.0.0.1:3000/20スレッドと20のConnectionSthread Stat 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 connectionSthread統計Avg stdev max +/- stdevlatency 59.85ms 6.77ms 6.77ms 6.77ms 95.71ms 77.29%Req/sec 16.39 2.36 22.00 61.97%333 333.79 Transfer/Sec:36.83kb
v0.11.10-pre(メインバージョンから構築)
10Sテスト @ http:// localhost:3000/20スレッドと20 connectionSthread統計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.41kbs 515.80Transfer/Sec:56.92kb
ご覧のとおり、Fedorの修正後、これは大きな違いです。0.10から0.12のパフォーマンスはほぼ2倍悪化しています。
要約します
一部の人々は、「なぜSSLをオフにしないのか、オフになった後に速くなる」と尋ねるかもしれません。また、一部の人々にとってもオプションです。実際、これは、SSLのパフォーマンスの問題をどのように解決するかを他の人に尋ねるとき、より代表的な答えです。ただし、そのエンタープライズSSLが必要とする場合は、増加のみを必要としますが、減少しません。また、node.jsのSSLを改善するために多くのことを行っていますが、パフォーマンスの調整が必要です。上記の手法のいくつかが、SSLユースケースのパフォーマンスを調整するのに役立つことを願っています。