Saat menjelajahi internet, kita semua tahu bahwa enkripsi melalui SSL sangat penting. Di PayPal, keamanan adalah prioritas utama kami. Kami menggunakan enkripsi ujung ke ujung, tidak hanya situs web publik kami, tetapi juga untuk panggilan layanan internal kami. Teknologi Enkripsi SSL akan sangat mempengaruhi kinerja Node.js. Kami telah meluangkan waktu untuk menyesuaikan layanan eksternal kami dan memanfaatkannya sebaik -baiknya. Berikut adalah daftar beberapa penyetelan konfigurasi SSL yang kami temukan secara signifikan meningkatkan kinerja eksternal SSL.
Kata Sandi SSL
Di luar kotak, SSL Node.js menggunakan set algoritma kata sandi yang sangat kuat. Secara khusus, Difee Hermann Key Exchange dan algoritma kurva elips sangat mahal. Dan ketika Anda menggunakan terlalu banyak panggilan SSL eksternal dalam konfigurasi default, kinerja node.js akan secara fundamental melemah. Untuk mendapatkan kesimpulan seberapa lambat itu, berikut adalah sampel CPU dari panggilan layanan:
918834.0ms 100.0% 0,0 simpul (91770) 911376.0ms 99.1% 0,0 start911376.0ms 99.1% 0,0 simpul :: start911363.0ms 99.1% 48.0 uv_run909839.0ms 99.0% 438.0.0 uv_run909839.0ms 99.0% 438.0.0M_Run909839.0MS 99.0% 438.0438.0.0M_RUN909839.0MS 99.0% 438.0438.0.0 uv__stream_io873590.0ms 95.0% 32.0 simpul :: streamwrap :: onreadCommon873373.0ms 95.0% 7.0 Node :: MakeCallback873265.0ms 95.0% 15.0 Node :: MakEdomainCallback873125.0ms 95.0 %.0% Node :: MakeDomainCallback873125.0ms 95.0% 95.0 %.0 %.0% 65.0% :: MakeDoMainCallback873125.0MS 95.0M8.0M8.0M8.0 MakeDomainCallback873125.0MS 95.0% 13364.0 _ZN2V88InternAll6Invokeebns0832660.0ms 90.6% 431.0 _Zn2v88InternAllall21builtin821687.0ms 89.4% 39.0 Node :: Crypto :: clearout :: CLEATOUT84.44.44.44.44.44.4.44.4.44.4.44.4.44.4.44.44.4.44.4.4.4.44. ssl23_connect813562.0ms 88.5% 54.0 ssl3_connect802651.0ms 87.3% 35.0 ssl3_send_client_key_exchange417323.0ms 45.4% 7.0 EC_KEY_GENERATE_KEY3185.0MS 45.4% 7.0 ECE_KEY_GENEATER_KEY318185.0MS 45.4% 7.0.0.0.0.0.0.0.0.0. ecdh_compute_key1545.0ms 0,1% 4.0 tls1_generate_master_secret123.0ms 0,0% 4.0 ssl3_do_write ...
Mari kita fokus pada pembuatan kunci:
802651.0ms 87.3% 35.0 ssl3_send_client_key_exchange417323.0ms 45.4% 7.0 ec_key_generate_key383185.0ms 41.7% 12.0 ecdh_compute_key
87% dari panggilan ini dihabiskan untuk menghasilkan kunci!
Kata sandi ini dapat diubah untuk mengurangi komputasi intensif. Gagasan ini telah diimplementasikan dalam HTTPS (atau proxy). Misalnya:
var agent = new https.agent ({"key": key, "cert": cert, "ciphers": "AES256-GCM-SHA384"});Kunci di atas tidak lagi dipertukarkan dengan Keys Diffie Herman yang mahal. Setelah mengganti sesuatu yang serupa, kita dapat melihat perubahan signifikan dalam contoh berikut:
... 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 ...
Dengan dokumentasi OpenSSL, Anda dapat mempelajari lebih lanjut tentang string kata sandi.
Pemulihan Sesi SSL
Jika server Anda mendukung pemulihan sesi SSL, maka Anda dapat melewati sesi melalui HTTPS (atau proxy). Anda juga dapat membungkus fungsi CreateConnection proxy:
var createConnection = agent.createConnection; agent.createConnection = function (options) {options.Session = sesi; return createConnection.call (agen, opsi);};Dengan menambahkan sistem pemegang telepon pendek ke koneksi, pemulihan sesi dapat mengurangi penggunaan koneksi.
Tetap aktif
Mengizinkan proxy tetap aktif akan memudahkan jabat tangan SSL. Agen tetap hidup, seperti agenkeepalive, dapat memperbaiki masalah node tetap aktif, tetapi di node0.12 tidak perlu.
Hal lain yang perlu diingat adalah proxy maxsockets. Jika nilai ini tinggi, ia dapat berdampak negatif pada kinerja. Kontrol Nilai MaxSockets Anda berdasarkan jumlah koneksi eksternal yang Anda buat.
Ukuran pelat
tls.slab_buffer_size menentukan ukuran alokasi buffer slab yang digunakan oleh klien TLS (server). Ukurannya default hingga 10MB.
Interval yang dialokasikan ini akan memperluas RSS Anda dan meningkatkan waktu untuk pengumpulan sampah. Ini berarti bahwa kapasitas tinggi akan mempengaruhi kinerja. Menyesuaikan kapasitas ini dengan nilai yang relatif rendah dapat meningkatkan kinerja pengumpulan memori dan sampah. Dalam versi 0.12, alokasi slab telah ditingkatkan dan tidak diperlukan penyesuaian lebih lanjut.
Perubahan terbaru dalam SSL di 0,12
Uji versi fedor yang ditingkatkan SSL.
Instruksi tes
Jalankan layanan HTTP sebagai proxy layanan SSL, semuanya berjalan di mesin.
V0.10.22
Menjalankan 10s Test @ http://127.0.0.1:3000/20 Threads dan 20 ConnectionsThread Stats AVG Stdev Max +/- Stdevlatency 69.38ms 30.43ms 268.56MS 95.24%REQ/SEC 14.95 4.16 20.00 58.65%305%305.10s.95.95.95 4.16 20.00 58.65%305%305.16s.95.95.95.95.95.95.95.95.95. ReadRequests/Sec: 305.28Transfer/Sec: 33.69KB
V0.11.10-Pre (dibangun dari versi utama)
Menjalankan Tes 10s @ http://127.0.0.1:3000/20 Threads dan 20 ConnectionsThread Stats AVG Stdev Max +/- Stdevlatency 75.87ms 7.10ms 102.87ms 71.55%Req/Sec 12.77 2.43 19.00 64.17%2620 Permintaan pada 10.01.77, 277 2.43 19.00 64.17%2620 Permintaan pada 10.01.77.77 2.43 19.00 64.17%2620 Permintaan pada 10.01.01.77, 277 2.43 19.00 64.17%2620 Permintaan pada 10.01.77, 2.43 19.00 64.17%2620 Permintaan pada 10.01.2.01120 Permintaan pada 10.01.77, 2.43 19.00 64.00 64.17%2620 DI 10.012%22.77, 261.86Transfer/Sec: 27.62kb
Tidak ada banyak perbedaan, tetapi ini harus dikaitkan dengan kata sandi default, jadi mari kita sesuaikan opsi proxy untuk kata sandi. Misalnya:
var agent = new https.agent ({"key": key, "cert": cert, "ciphers": "AES256-GCM-SHA384"});V0.10.22
Menjalankan 10s test @ http: // localhost: 3000/20 Threads dan 20 ConnectionThread Stats AVG STDEV MAX +/- Stdevlatency 59.85ms 6.77ms 95.71ms 77.29%Req/Sec 16.39 2.36 22.00 61.97%3339%Permintaan pada 10.00S, 5.36. 333.79Transfer/detik: 36.83kb
V0.11.10-Pre (dibangun dari versi utama)
Running 10s test @ http://localhost:3000/20 threads and 20 connectionsThread Stats 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.41KB readRequests/sec: 515.80Transfer/detik: 56.92kb
Seperti yang bisa kita lihat, setelah modifikasi Fedor, ini adalah perbedaan besar: kinerja dari 0,10 hingga 0,12 hampir 2 kali lebih buruk!
Meringkaskan
Beberapa orang mungkin bertanya "mengapa tidak mematikan SSL, itu akan menjadi lebih cepat setelah dimatikan", dan bagi sebagian orang itu juga merupakan pilihan. Sebenarnya, ini adalah jawaban yang lebih representatif ketika saya bertanya kepada orang lain bagaimana mereka menyelesaikan masalah kinerja SSL. Namun, jika ada yang perusahaan SSL hanya membutuhkan peningkatan tetapi tidak berkurang; Dan meskipun banyak melakukan untuk meningkatkan SSL di Node.js, penyetelan kinerja masih diperlukan. Saya berharap beberapa teknik yang disebutkan di atas akan membantu Anda menyesuaikan kinerja kasus penggunaan SSL.