Rumah  >  Artikel  >  hujung hadapan web  >  Meningkatkan prestasi perkhidmatan SSL dalam NodeJS_node.js

Meningkatkan prestasi perkhidmatan SSL dalam NodeJS_node.js

WBOY
WBOYasal
2016-05-16 16:41:511930semak imbas

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.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn