เมื่อเรียกดูอินเทอร์เน็ตเราทุกคนรู้ว่าการเข้ารหัสผ่าน SSL มีความสำคัญมาก ที่ PayPal ความปลอดภัยเป็นสิ่งสำคัญที่สุดของเรา เราใช้การเข้ารหัสแบบ end-to-end ไม่ใช่แค่เว็บไซต์สาธารณะของเรา แต่ยังรวมถึงการโทรภายในของเราด้วย เทคโนโลยีการเข้ารหัส SSL จะส่งผลกระทบอย่างมากต่อประสิทธิภาพของ Node.js เราใช้เวลาในการปรับบริการภายนอกของเราและใช้ประโยชน์สูงสุดจากพวกเขา นี่คือรายการของการปรับแต่งการกำหนดค่า SSL บางอย่างที่เราพบว่าปรับปรุงประสิทธิภาพภายนอกของ SSL อย่างมีนัยสำคัญ
รหัสผ่าน SSL
SSL ของ Node.js ใช้ชุดอัลกอริทึมรหัสผ่านที่ทรงพลังมาก โดยเฉพาะอย่างยิ่งการแลกเปลี่ยนคีย์ Hermann Difee Hermann และอัลกอริธึมเส้นโค้งรูปไข่มีราคาแพงมาก และเมื่อคุณใช้การเรียก SSL ภายนอกมากเกินไปในการกำหนดค่าเริ่มต้นประสิทธิภาพของ node.js จะอ่อนแอลงโดยพื้นฐาน เพื่อให้ได้ข้อสรุปว่ามันช้าแค่ไหนนี่คือตัวอย่าง CPU ของการโทรบริการ:
918834.0ms 100.0% 0.0 โหนด (91770) 911376.0ms 99.1% 0.0 start911376.0ms 99.1% 0.0 โหนด :: start911363.0ms 99.1% 48.0 uv_run909839.0ms 99.0% 438.0 849.0 UV__stream_io873590.0ms 95.0% 32.0 Node :: StreamWrap :: OnReadCommon873373.0ms 95.0% 7.0 Node :: Makecallback873265.0ms 95.0% 15.0 Node v8 :: ฟังก์ชั่น :: call873049.0ms 95.0% 13364.0 _zn2v88internall6invokeebns0832660.0ms 90.6% 431.0 _zn2v88l Node :: Crypto :: การเชื่อมต่อ :: Clearout813884.0ms 88.5% 37.0 SSL23_Connect813562.0ms 88.5% 54.0 SSL3_Connect802651.0MS 87.3% 35.0 SSL3_SLIANGENT_CLIANG41.0MS EC_KEY_GENERETER_KEY383185.0MS 41.7% 12.0 ECDH_COMPUTE_KEY1545.0MS 0.1% 4.0 TLS1_GENERETER_MASTER_SECRET123.0MS 0.0% 4.0 SSL3_DO_WRITE ...
มามุ่งเน้นไปที่การสร้างคีย์:
802651.0MS 87.3% 35.0 SSL3_SEND_CLIENT_KEY_EXCHANGE417323.0MS 45.4% 7.0 EC_KEY_GENERETER_KEY383185.0MS 41.7% 12.0 ECDH_COMSOMET_KEY_KEY_KEY
87% ของการโทรนี้ใช้ในการสร้างคีย์!
รหัสผ่านเหล่านี้สามารถเปลี่ยนแปลงได้เพื่อลดการคำนวณอย่างเข้มข้น แนวคิดนี้ได้ถูกนำไปใช้ใน HTTPS (หรือพร็อกซี) ตัวอย่างเช่น:
var agent = ใหม่ https.agent ({"key": คีย์, "ใบรับรอง": ใบรับรอง, "ciphers": "aes256-gcm-sha384"});คีย์ข้างต้นจะไม่แลกเปลี่ยนกับปุ่ม Herman Diffie Herman ที่มีราคาแพงอีกต่อไป หลังจากแทนที่สิ่งที่คล้ายกันเราจะเห็นการเปลี่ยนแปลงที่สำคัญในตัวอย่างต่อไปนี้:
... 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 ...
ด้วยเอกสาร OpenSSL คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับสตริงรหัสผ่าน
การกู้คืนเซสชัน SSL
หากเซิร์ฟเวอร์ของคุณรองรับการกู้คืนเซสชัน SSL คุณสามารถผ่านเซสชันผ่าน HTTPS (หรือพร็อกซี) นอกจากนี้คุณยังสามารถสรุปฟังก์ชั่น createConnection ของพร็อกซี:
var createConnection = agent.createConnection; agent.createConnection = function (ตัวเลือก) {opotions.session = เซสชัน; ส่งคืน createConnection.call (ตัวแทน, ตัวเลือก);};ด้วยการเพิ่มระบบที่ยึดโทรศัพท์สั้นลงในการเชื่อมต่อการกู้คืนเซสชันสามารถลดการใช้การเชื่อมต่อได้
ใช้งาน
การอนุญาตให้พร็อกซียังคงใช้งานอยู่จะช่วยลดการจับมือกัน SSL ตัวแทนที่เก็บรักษาเช่น Agentykeepalive สามารถแก้ไขปัญหาของโหนดที่ใช้งานได้ แต่ใน node0.12 ไม่จำเป็น
อีกสิ่งที่ต้องจดจำคือพร็อกซีแม็กซ็อกเก็ต หากค่านี้สูงก็อาจมีผลกระทบเชิงลบต่อประสิทธิภาพ ควบคุมค่า MaxSockets ของคุณตามจำนวนการเชื่อมต่อภายนอกที่คุณสร้าง
ขนาดแผ่น
TLS.SLAB_BUFFER_SIZE กำหนดขนาดการจัดสรรของบัฟเฟอร์แผ่นพื้นที่ใช้โดยไคลเอนต์ TLS (เซิร์ฟเวอร์) ขนาดเริ่มต้นเป็น 10MB
ช่วงเวลาที่จัดสรรเหล่านี้จะขยาย RSS ของคุณและเพิ่มเวลาสำหรับการรวบรวมขยะ ซึ่งหมายความว่าความจุสูงจะส่งผลต่อประสิทธิภาพ การปรับความสามารถนี้ให้เป็นค่าที่ค่อนข้างต่ำสามารถปรับปรุงประสิทธิภาพการรวบรวมหน่วยความจำและขยะ ในเวอร์ชัน 0.12 การจัดสรรแผ่นพื้นได้รับการปรับปรุงและไม่จำเป็นต้องมีการปรับเพิ่มเติม
การเปลี่ยนแปลงล่าสุดใน SSL ใน 0.12
ทดสอบ Fedor รุ่น SSL ที่ปรับปรุงแล้ว
คำแนะนำทดสอบ
เรียกใช้บริการ HTTP เป็นพร็อกซีบริการ SSL ทั้งหมดทำงานบนเครื่อง
v0.10.22
รัน 10S TEST @ http://127.0.0.1:3000/20 เธรดและ 20 การเชื่อมต่อสถิติ stdev max +/- stdevlatency 69.38ms 30.43ms 268.56ms 95.24%Req/วินาที 14.95 4.16 readRequests/วินาที: 305.28transfer/วินาที: 33.69KB
v0.11.10-pre (สร้างจากเวอร์ชันหลัก)
รัน 10S TEST @ http://127.0.0.1:3000/20 เธรดและ 20 การเชื่อมต่อสถิติ stdev stdev max +/- stdevlatency 75.87ms 7.10ms 102.87ms 71.55%REQ/วินาที 12.77 2.43 19.00 64.17 261.86transfer/วินาที: 27.62KB
มีความแตกต่างไม่มากนัก แต่ควรเป็นผลมาจากรหัสผ่านเริ่มต้นดังนั้นเรามาปรับตัวเลือกพร็อกซีสำหรับรหัสผ่าน ตัวอย่างเช่น:
var agent = ใหม่ https.agent ({"key": คีย์, "ใบรับรอง": ใบรับรอง, "ciphers": "aes256-gcm-sha384"});v0.10.22
รัน 10S ทดสอบ @ http: // localhost: 3000/20 เธรดและ 20 connectionsthread stats avg stdev max +/- stdevlatency 59.85ms 6.77ms 95.71ms 77.29%req/sec 16.39 2.36 22.00 61.97%3339 333.79transfer/วินาที: 36.83KB
v0.11.10-pre (สร้างจากเวอร์ชันหลัก)
รัน 10S ทดสอบ @ http: // localhost: 3000/20 เธรดและ 20 connectionsthread สถิติ avg stdev max +/- stdevlatency 38.99ms 5.96ms 71.87ms 86.22%REQ/Sec 25.43 5.70 35.00 63.36%5160 515.80transfer/วินาที: 56.92KB
อย่างที่เราเห็นหลังจากการดัดแปลงของ Fedor นี่คือความแตกต่างอย่างมาก: ประสิทธิภาพจาก 0.10 ถึง 0.12 นั้นแย่ลงเกือบ 2 เท่า!
สรุป
บางคนอาจถามว่า "ทำไมไม่เพียงแค่ปิด SSL มันจะเร็วขึ้นหลังจากปิด" และสำหรับบางคนมันก็เป็นตัวเลือกเช่นกัน ที่จริงแล้วนี่เป็นคำตอบที่เป็นตัวแทนมากขึ้นเมื่อฉันถามคนอื่นว่าพวกเขาแก้ปัญหาประสิทธิภาพของ SSL ได้อย่างไร อย่างไรก็ตามหากสิ่งใดที่องค์กร SSL ต้องการเพิ่มขึ้น แต่ไม่ลดลง และแม้จะมีการทำหลายอย่างเพื่อปรับปรุง SSL ใน node.js แต่ก็ยังต้องการการปรับแต่งประสิทธิภาพ ฉันหวังว่าเทคนิคบางอย่างที่กล่าวถึงข้างต้นจะช่วยให้คุณปรับประสิทธิภาพของกรณีการใช้ SSL