저는 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 플러드 경고를 생성합니다.
유용 이전의 사람을 찾을 수 있습니다 생각 또한. –
Node의 성능만큼이나 한 번에 모든 작업을 수행하는 모든 10k 연결이 단일 VPS에서 수행하는 것보다 더 많은 부하가 발생합니다. – Brad