Maison > Article > interface Web > Améliorer les performances des services SSL dans NodeJS_node.js
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 ...
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
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" });
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 ...
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); };
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
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
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" });
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 (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
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.