Maison > interface Web > js tutoriel > Améliorer les performances des services SSL dans NodeJS_node.js

Améliorer les performances des services SSL dans NodeJS_node.js

WBOY
Libérer: 2016-05-16 16:41:51
original
1964 Les gens l'ont consulté

Lorsque nous naviguons sur Internet, nous savons tous que le cryptage via SSL est très important. Chez PayPal, la sécurité est notre priorité absolue. Nous utilisons le cryptage de bout en bout, non seulement pour notre site Web public, mais également pour nos appels de service internes. La technologie de cryptage SSL affectera dans une large mesure les performances de node.js. Nous avons pris le temps d'adapter nos services externes et d'en tirer le meilleur parti. Vous trouverez ci-dessous une liste de quelques ajustements de configuration SSL que nous avons trouvés pour améliorer considérablement les performances externes de SSL.

Mot de passe SSL

Prêt à l'emploi, SSL pour Node.js utilise un ensemble très puissant d'algorithmes cryptographiques. En particulier, les algorithmes d’échange de clés Diffie-Hellman et de courbe elliptique sont extrêmement coûteux. Et lorsque vous utilisez trop d’appels SSL sortants dans la configuration par défaut, les performances de Node.js seront fondamentalement affaiblies. Pour avoir une idée de sa lenteur, voici un exemple de CPU d'un appel de service :

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
...
Copier après la connexion

Concentrons-nous sur la génération de clés :

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
Copier après la connexion

87 % du temps de cet appel est consacré à la génération de clés !

Ces mots de passe peuvent être modifiés pour les rendre moins gourmands en calcul. Cette idée a été implémentée avec https (ou proxy). Par exemple :

var agent = new https.Agent({
  "key": key,
  "cert": cert,
  "ciphers": "AES256-GCM-SHA384"
});
Copier après la connexion
Copier après la connexion

La clé ci-dessus n'a pas été échangée avec la coûteuse clé Diffie-Hellman. Après l'avoir remplacé par quelque chose de similaire, nous pouvons constater un changement significatif dans l'exemple ci-dessous :

...
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
...
Copier après la connexion

Vous pouvez en savoir plus sur les chaînes de chiffrement grâce à la documentation OpenSSL.

Reprise de session SSL

Si votre serveur prend en charge la reprise de session SSL, vous pouvez alors transmettre la session via https (ou proxy). Vous pouvez également envelopper la fonction createConnection du proxy :

var createConnection = agent.createConnection;

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

Copier après la connexion

La reprise de session peut réduire le nombre de connexions utilisées en ajoutant un court mécanisme de prise de contact à la connexion.

Restez actif

Permettre au proxy de rester en vie facilitera la négociation SSL. Un agent keep-alive tel que agentkeepalive peut résoudre le problème de keep-alive du nœud, mais il n'est pas requis dans Node 0.12.

Une autre chose à garder à l’esprit concerne les maxSockets du proxy, une valeur élevée peut avoir un impact négatif sur les performances. Contrôlez votre valeur maxSockets en fonction du nombre de connexions sortantes que vous créez.

Taille de la dalle

tls.SLAB_BUFFER_SIZE détermine la taille allouée du tampon de dalle utilisé par le client tls (serveur). Sa taille par défaut est de 10 Mo.

Ces plages allouées élargiront votre flux RSS et augmenteront le temps de collecte des ordures. Cela signifie qu’une capacité élevée aura un impact sur les performances. L'ajustement de cette capacité à une valeur inférieure peut améliorer les performances de la mémoire et du garbage collection. Dans la version 0.12, l'allocation des dalles a été améliorée et aucun autre ajustement n'est requis.

Modifications récentes apportées à SSL dans la version 0.12

Testez la version améliorée SSL de Fedor.

Instructions du test

Exécutez un service http en tant que proxy de service SSL, le tout fonctionnant sur cette machine.

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
Copier après la connexion

v0.11.10-pre (Build à partir de la version principale)

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
Copier après la connexion

Cela ne fait pas beaucoup de différence, mais cela est dû au mot de passe par défaut, ajustons donc les options de proxy du mot de passe. Par exemple :

var agent = new https.Agent({
  "key": key,
  "cert": cert,
  "ciphers": "AES256-GCM-SHA384"
});
Copier après la connexion
Copier après la connexion

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
Copier après la connexion

v0.11.10-pre (Build à partir de la version principale)

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
Copier après la connexion

Comme on peut le voir, après la modification de Fedor, il y a une énorme différence : la différence de performances de 0,10 à 0,12 est presque 2 fois !

Résumé

Certaines personnes peuvent demander "Pourquoi ne pas simplement désactiver SSL, cela deviendra plus rapide après l'avoir désactivé", et pour certaines personnes, c'est également une option. En fait, c'est une réponse assez courante lorsque je demande aux gens comment ils résolvent les problèmes de performances SSL. Cependant, si les exigences SSL des entreprises sont loin d’être augmentées, et même si beaucoup a été fait pour améliorer SSL dans Node.js, un ajustement des performances est toujours nécessaire. J'espère que certaines des techniques ci-dessus vous aideront à affiner les performances de vos cas d'utilisation SSL.

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal