Rumah > Artikel > hujung hadapan web > Meningkatkan prestasi perkhidmatan SSL dalam NodeJS_node.js
Apabila melayari internet, kita semua tahu bahawa penyulitan melalui SSL adalah sangat penting. Di PayPal, keselamatan adalah keutamaan kami. Kami menggunakan penyulitan hujung ke hujung, bukan sahaja untuk tapak web awam kami, tetapi untuk panggilan perkhidmatan dalaman kami juga. Teknologi penyulitan SSL akan menjejaskan prestasi node.js pada tahap yang besar. Kami telah meluangkan masa untuk menyesuaikan perkhidmatan luaran kami dan memanfaatkannya sepenuhnya. Di bawah ialah senarai beberapa tweak konfigurasi SSL yang kami dapati untuk meningkatkan prestasi luaran SSL dengan ketara.
Kata Laluan SSL
Di luar kotak, SSL untuk Node.js menggunakan set algoritma kriptografi yang sangat kuat. Khususnya, pertukaran kunci Diffie-Hellman dan algoritma lengkung eliptik adalah sangat mahal. Dan apabila anda menggunakan terlalu banyak panggilan SSL keluar dalam konfigurasi lalai, prestasi Node.js akan menjadi lemah secara asasnya. Untuk mengetahui betapa perlahannya, berikut ialah contoh CPU bagi panggilan perkhidmatan:
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 ...
Mari fokus pada penjanaan utama:
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% masa dalam panggilan ini dihabiskan untuk menjana kunci!
Kata laluan ini boleh ditukar untuk menjadikannya kurang intensif pengiraan. Idea ini telah dilaksanakan dengan https (atau proksi). Contohnya:
var agent = new https.Agent({ "key": key, "cert": cert, "ciphers": "AES256-GCM-SHA384" });
Kunci di atas belum ditukar dengan kunci Diffie-Hellman yang mahal. Selepas menggantikannya dengan sesuatu yang serupa, kita dapat melihat perubahan ketara dalam contoh di bawah:
... 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 ...
Anda boleh mengetahui lebih lanjut tentang rentetan sifir melalui dokumentasi OpenSSL.
Resume Sesi SSL
Jika pelayan anda menyokong penyambungan semula sesi SSL, maka anda boleh lulus sesi melalui https (atau proksi). Anda juga boleh membungkus fungsi createConnection proksi:
var createConnection = agent.createConnection; agent.createConnection = function (options) { options.session = session; return createConnection.call(agent, options); };
Penyambungan semula sesi boleh mengurangkan bilangan sambungan yang digunakan dengan menambahkan mekanisme jabat tangan pendek pada sambungan.
Kekal aktif
Membenarkan proksi kekal hidup akan memudahkan jabat tangan SSL. Ejen keep-alive seperti agentkeepalive boleh membetulkan masalah nod keep-alive, tetapi ia tidak diperlukan dalam Node 0.12.
Perkara lain yang perlu diingat ialah maxSockets proksi, nilai yang tinggi boleh memberi kesan negatif terhadap prestasi. Kawal nilai maxSockets anda berdasarkan bilangan sambungan keluar yang anda buat.
Saiz papak
tls.SLAB_BUFFER_SIZE menentukan saiz yang diperuntukkan bagi penimbal papak yang digunakan oleh klien (pelayan) tls. Saiznya lalai kepada 10MB.
Julat yang diperuntukkan ini akan mengembangkan rss anda dan meningkatkan masa pengumpulan sampah. Ini bermakna kapasiti yang tinggi akan memberi kesan kepada prestasi. Melaraskan kapasiti ini kepada nilai yang lebih rendah boleh meningkatkan prestasi memori dan pengumpulan sampah. Dalam versi 0.12, peruntukan papak telah ditambah baik dan tiada pelarasan lanjut diperlukan.
Perubahan terbaru kepada SSL dalam 0.12
Uji versi SSL Fedor yang dipertingkatkan.
Arahan ujian
Jalankan perkhidmatan http sebagai proksi perkhidmatan SSL, semuanya berjalan pada mesin ini.
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-pra (Bina daripada versi utama)
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
Ini tidak membuat banyak perbezaan, tetapi itu disebabkan oleh kata laluan lalai, jadi mari kita laraskan pilihan proksi kata laluan. Contohnya:
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-pra (Bina daripada versi utama)
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
Seperti yang kita lihat, selepas pengubahsuaian Fedor, terdapat perbezaan yang besar: perbezaan prestasi dari 0.10 hingga 0.12 hampir 2 kali ganda!
Ringkasan
Sesetengah orang mungkin bertanya "Mengapa tidak matikan sahaja SSL, ia akan menjadi lebih pantas selepas mematikannya", dan bagi sesetengah orang ini juga merupakan pilihan. Sebenarnya, ini adalah jawapan yang agak biasa apabila saya bertanya kepada orang bagaimana mereka menyelesaikan isu prestasi SSL. Walau bagaimanapun, jika keperluan SSL perusahaan tidak meningkat, dan walaupun banyak yang telah dilakukan untuk menambah baik SSL dalam Node.js, penalaan prestasi masih diperlukan. Saya berharap beberapa teknik di atas akan membantu anda menyesuaikan prestasi kes penggunaan SSL anda.