2012-08-18 4 views
7

저는 10k 클라이언트가 모든 데이터를 한 번, 3 분마다 제출하려고 정확하게 타이밍을 맞춘 다소 일반적인 응용 프로그램을 만들고 있습니다. 그러나, 나는 매우를보고 있어요,Node.js가 많은 동시 연결로 어려움을 겪고 있습니다

ab -c 10000 -n 10000 -r "http://example.com/submit?data=foo" 
나는 rackspacecloud에 우분투 12.4에 Node.js를 사용하고

이 제출을 수집하는 인스턴스를 VPS :이 'AB'명령은 상당히 정확하게 현실 세계에서 하나 공세를 시뮬레이션 Node에서 이상한 행동을합니다. 심지어 모든 비즈니스 로직을 제거하고 http 요청을 no-op로 전환 할 때도 마찬가지입니다.

테스트가 약 90 % 완료되면 오랜 시간 동안 중단됩니다. 이상하게도 이것은 90 %에서 일관되게 발생합니다 - c = n = 10k, 9000; 4500에서 c = n = 5k; 1800에서 c = n = 2k에 대해. 실제로 오류없이 테스트가 실제로 완료됩니다. 하지만 ab 및 노드 로그는 테스트 실행의 약 80-90 %까지 연속 처리를 표시 한 다음 완료하기 전에 오래 동안 일시 중지합니다.

노드가 요청을 정상적으로 처리 할 때 CPU 사용은 일반적으로 약 50-70 %입니다. 정지 기간 동안 CPU는 최대 100 % 증가합니다. 불규칙한 CPU 응답과 실제 연결 수와 관련이없는 것으로 보이는 사이 (% 완료)에는 가비지 수집기를 의심하지 않습니다.

로컬 호스트와 원격 서버에서이 'ab'를 실행 해 보았습니다. 동일한 효과입니다.

아마도 TCP 연결과 관련된 것으로 의심 스럽지만 아마도 연결을 닫는 것과 관련이 있습니다. 그러나 구성 변경이 도움이되지는 않았습니다. 내 변경 : 나는 또한 나타났습니다

net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216 
net.ipv4.tcp_rmem = 4096 87380 16777216 
net.ipv4.tcp_wmem = 4096 65536 16777216 
net.ipv4.tcp_max_orphans = 20000 
net.ipv4.tcp_max_syn_backlog = 10000 
net.core.somaxconn = 10000 
net.core.netdev_max_backlog = 10000 

: 내가들을 때

  • ulimit를
  • 999999 -n은(), I는

sysctl을 변경 10000에 백 로그를 설정 커널 로그에서 msg를 얻는 경향이 있습니다 :

TCP: Possible SYN flooding on port 80. Sending cookies. Check SNMP counters. 

TCP 백 로그 대기열이 오버플로하지 않을 정도로 깊어 야하기 때문에 나는이 메시지에 당혹 스럽다. syn 쿠키를 비활성화하면 "보내는 쿠키"가 "연결 삭제"로 이동합니다.

나는 이것이 일종의 리눅스 TCP 스택 튜닝 문제라고 추측하며 그물에서 찾을 수있는 모든 것에 대해 읽었습니다. 나는 아무 것도 노력하지 않았다. 어떤 충고?

업데이트 : 동작이 변경되지 않고 tcp_max_syn_backlog, somaxconn, netdev_max_backlog 및 listen() 백 로그 매개 변수가 50k로 설정되었습니다. 여전히 SYN 플러드 경고를 생성합니다.

+1

유용 이전의 사람을 찾을 수 있습니다 생각 또한. –

+1

Node의 성능만큼이나 한 번에 모든 작업을 수행하는 모든 10k 연결이 단일 VPS에서 수행하는 것보다 더 많은 부하가 발생합니다. – Brad

답변

3

동일한 머신 실행 노드에서 ab를 실행하고 있습니까? 그렇지 않다면 1G 또는 10G NIC가 있습니까? 그렇다면 실제로 20,000 개의 연결을 처리하려고하지 않습니까?

또한 net.core.somaxconn을 10,000으로 변경하면 해당 컴퓨터에서 다른 소켓이 열려 있지 않은 것입니까? 그렇게하면 10,000 명이 충분히 높지 않습니다.

nodejs 클러스터를 사용하여 프로세스 당 열린 연결 수를 분산 시키려고 했습니까?

+0

나는 localhost와 다른 컴퓨터에서 ab를 실행했다. 두 경우 모두 로컬 호스트에서 테스트가 더 빨라지 긴하지만 동일한 일시 중지 동작을 나타냅니다. 일시 정지 동작은 8k 및 5k 테스트에서 발생하지만 (2k 테스트에서는 다소 적음), somaxconn을 50k로 설정하여 테스트를 다시 실행합니다. 리던던시 및로드 균형 조정을 위해 이러한 시스템 클러스터를 사용할 계획이지만이 테스트는 얼마나 많은 인스턴스가 필요한지 파악하는 것입니다. – stickfigure

+0

필자는 매개 변수가 50k로 설정된 테스트를 실행했으며 동작은 변경되지 않았습니다. 가장 놀라운 것은 SYN 범람 경고입니다. 백 로그를 50k로 설정하면 대기열이 오버플로 될 것으로 예상하지 않습니다. – stickfigure

+0

@stickfigure이 답변보기 http://serverfault.com/questions/294209/possible-syn-flooding-in-log-despite-low-number-of-syn-recv-connections –

관련 문제