인터넷을 탐색 할 때, 우리는 모두 SSL을 통한 암호화가 매우 중요하다는 것을 알고 있습니다. PayPal에서 보안이 최우선 과제입니다. 우리는 공개 웹 사이트뿐만 아니라 내부 서비스 통화에도 엔드 투 엔드 암호화를 사용합니다. SSL 암호화 기술은 Node.js의 성능에 큰 영향을 미칩니다. 우리는 외부 서비스를 조정하고 최대한 활용하는 데 시간이 걸렸습니다. 다음은 SSL의 외부 성능을 크게 향상시키는 일부 SSL 구성 튜닝 목록입니다.
SSL 비밀번호
Node.js의 SSL은 매우 강력한 비밀번호 알고리즘 세트를 사용합니다. 특히 Difee Hermann Key Exchange 및 타원 곡선 알고리즘은 매우 비쌉니다. 기본 구성에서 너무 많은 외부 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 UV__ IO_POLL 876570.0mS 99.0 MET 8760.0MS 89.0 uv__stream_io873590.0ms 95.0% 32.0 노드 :: streamwrap :: onreadcommon873373.0ms 95.0% 7.0 노드 :: makecallback873265.0ms 95.0% 15.0 node :: Makedomaincallback873125.0ms 95.0% 61.0 v8 :: 95.0% 13364.0 _ZN2V88INTERNALL6INVOKEEBNS0832660.0MS 90.6% 431.0 _ZN2V88INTERNALL21BUILTIN821687.0ms 89.4% 39.0 NODE :: CONTO :: CONTECTION :: CLEAROUT813884.0ms 88.5% 37.0mms 88.5% 37. 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 41.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 ...
열쇠의 생성에 중점을 봅시다 :
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%는 키를 생성하는 데 소비됩니다!
이러한 암호는 집중적 인 컴퓨팅을 줄이기 위해 변경할 수 있습니다. 이 아이디어는 HTTPS (또는 프록시)로 구현되었습니다. 예를 들어:
var agent = new https.agent ({ "키": 키, "cert": cert, "ciphers": "AES256-GCM-SHA384"});위의 키는 더 이상 고가의 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.createConnect = function (옵션) {옵션 .session = 세션; CreateConnection.call (에이전트, 옵션);}을 반환합니다.연결에 짧은 전화 홀더 시스템을 추가하면 세션 복구는 연결 사용을 줄일 수 있습니다.
활동적인 상태를 유지하십시오
프록시를 활성 상태로 유지하면 SSL 핸드 셰이크가 용이 해집니다. Agent-Keepalive와 같은 Keep-Agive 에이전트는 Node의 문제를 활성화하는 문제를 해결할 수 있지만 Node0.12에서는 필요하지 않습니다.
기억해야 할 또 다른 것은 프록시 MaxSockets입니다. 이 값이 높으면 성능에 부정적인 영향을 줄 수 있습니다. 생성 한 외부 연결 수에 따라 MaxSockets 값을 제어하십시오.
슬래브 크기
tls.slab_buffer_size tls 클라이언트 (서버)가 사용하는 슬래브 버퍼의 할당 크기를 결정합니다. 크기 기본값은 10MB입니다.
이 할당 된 간격은 RSS를 확장하고 쓰레기 수집 시간을 증가시킵니다. 이는 대량 용량이 성능에 영향을 미칠 것임을 의미합니다. 이 용량을 비교적 낮은 값으로 조정하면 메모리 및 쓰레기 수집 성능이 향상 될 수 있습니다. 버전 0.12에서 슬래브 할당이 개선되었으며 더 이상 조정이 필요하지 않습니다.
0.12의 SSL의 최근 변화
Fedor의 SSL 향상된 버전을 테스트하십시오.
테스트 지침
HTTP 서비스를 SSL 서비스 프록시로 실행하여 모두 기계에서 실행하십시오.
v0.10.22
실행 10s test @ http://127.0.0.1:3000/20 스레드 및 20 개의 ConnectionsthreadsThreads Stats AVG STDEV MAX +/- STDEVLATENCY 69.38MS 30.43MS 268.56MS 95.24%REQ/SEC 14.95 4.16 20.00 58.65%3055 요청 10.01S, 337.12K ReadRequests/sec : 305.28transfer/sec : 33.69kb
v0.11.10-pre (메인 버전에서 구축)
실행 10s test @ http://127.0.0.1:3000/20 스레드 및 20 개의 ConnectionsthreadsThreadsThreadSTDEV STDEV MAX +/- STDEVLATENCY 7.10MS 102.87MS 71.55%req/sec 12.77 2.43 19.00 64.17%2620 10.01S, 276.36.33KB READREQUESTS/SECS : 261.86transfer/sec : 27.62kb
큰 차이는 없지만 기본 비밀번호에 기인해야하므로 비밀번호의 프록시 옵션을 조정하겠습니다. 예를 들어:
var agent = new https.agent ({ "키": 키, "cert": cert, "ciphers": "AES256-GCM-SHA384"});v0.10.22
실행 10s test @ http : // localhost : 3000/20 스레드 및 20 개의 ConnectionsthreadsThread Stats AVG STDEV MAX +/- STDEVLATENCY 59.85ms 6.77ms 95.71ms 77.29%REQ/SEC 16.39 2.36 22.00 61.97%3339 요청 10.00S, 368.46KB ReadRequests/Sec : 333.79 트랜스퍼/초 : 36.83KB
v0.11.10-pre (메인 버전에서 구축)
실행 10s test @ http : // localhost : 3000/20 스레드 및 20 개의 ConnectionsThreadsThread Stats AVG STDEV MAX +/- STDEVLATENCY 38.99ms 5.96MS 71.87MS 86.22%REQ/SEC 25.43 5.70 35.00 63.36%5160 10.00S의 요청, 569. 515.80Transfer/sec : 56.92KB
우리가 볼 수 있듯이 Fedor 수정 후, 이것은 큰 차이입니다. 0.10에서 0.12의 성능은 거의 2 배 더 악화됩니다!
요약
어떤 사람들은 "왜 SSL을 끄는 것이 아니라, 그것이 꺼지면 더 빨라질 것"이라고 물을 수 있으며, 어떤 사람들에게는 옵션이기도합니다. 실제로, 이것은 다른 사람들이 SSL 성능 문제를 어떻게 해결하는지 물어 보면 더 대표적인 답변입니다. 그러나 Enterprise SSL이 증가 해야하는 경우 증가하지만 감소하지는 않습니다. 그리고 Node.js에서 SSL을 개선하기 위해 많은 노력을 기울이더라도 성능 튜닝이 여전히 필요합니다. 위에서 언급 한 기술 중 일부가 SSL 사용 사례의 성능을 조정하는 데 도움이되기를 바랍니다.