다음 설정의 성능을 확인하기 위해 일련의로드 테스트를 실행하고 있습니다.
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
요컨대, node.js 테스트 스위트는 x 초마다 설정된 양의 메트릭을 다른 서버에있는 StatsD 인스턴스로 보냅니다. 그런 다음 StatsD는 매초마다 동일한 서버에있는 Graphite 인스턴스로 지표를 플러시합니다. 그런 다음 테스트 스위트가 실제로 전송 한 메트릭 수와 Graphite가 얼마나 많은 메트릭을 수신하여 테스트 스위트와 Graphite 간의 패킷 손실을 확인했는지 살펴 봅니다.
그러나 때때로 20-50 % 범위의 매우 큰 패킷 드롭률 (UDP 프로토콜과 함께 전송 됨)을 얻었습니다. 따라서 StatsD의 성능 문제 일 수있는 것으로 보아이 패킷이 삭제 된 위치를 조사하기 시작했습니다. 그래서 시스템의 모든 부분에서 메트릭을 로깅하기 시작하여이 드롭이 발생한 위치를 추적했습니다. 그리고 이것은 상황이 이상 해지는 곳입니다.
내가 사용하고 는 tcpdump를 테스트 실행 완료되면 내가 검사 캡처 파일을 만들 수 있습니다. 그러나 tcpdump를 실행하여 테스트를 실행할 때마다 패킷 손실이 거의 없습니다! tcpdump가 어떻게 든 테스트의 성능을 향상시키는 것처럼 보이며 이것이 왜 그리고 어떻게 수행되는지 알 수 없습니다. 서버와 클라이언트 모두에서 tcpdump 메시지를 기록하기 위해 다음 명령을 실행하고 있습니다.
tcpdump -i any -n port 8125 -w test.cap
하나의 특정 테스트 사례에서 40000 메트릭 / s를 보냅니다. tcpdump를 실행하는 동안의 패킷 손실은 약 4 %이고 패킷 손실은 약 20 %입니다.
두 시스템 모두 다음 설정으로 Xen VM으로 실행됩니다.
- Intel Xeon E5-2630 v2 @ 2.60GHz
- 2GB RAM
- 우분투 14.04 x86_64
잠재적 인 원인을 이미 확인한 것 :
- UDP 버퍼 수신 / 전송 크기 늘리기
- 테스트에 영향을주는 CPU로드 (클라이언트와 서버 측 모두에서 최대 40-50 %의 부하)
- 'any'대신 특정 인터페이스에서 tcpdump를 실행합니다.
- '-p'와 함께 tcpdump를 실행하여 무차별 모드를 비활성화합니다.
- 서버에서만 tcpdump를 실행합니다. 이로 인해 패킷 손실이 20 % 발생했으며 테스트에 영향을 미치지 않는 것 같습니다.
- 클라이언트에서만 tcpdump를 실행합니다. 결과적으로 성능이 향상되었습니다.
- netdev_max_backlog 및 netdev_budget을 2 ^ 32-1로 증가시킵니다. 이것은 아무런 차이가 없었습니다.
- 모든 NIC에서 가능한 모든 무차별 모드 설정을 시도했습니다 (서버 켜기 및 클라이언트 끄기, 서버 끄기 및 클라이언트 켜기, 둘 다 켜기, 모두 끄기). 이것은 아무런 차이가 없었습니다.
ifconfig eth0 promisc
활성화 및 ifconfig eth0 -promisc
비활성화합니다. 차이가 나면 두 시스템에서 가능한 4 가지 promisc on / off 조합을 비교해보십시오. 문제의 원인을 찾아내는 데 도움이 될 수 있습니다.
-p
차이가 있는지 확인하기 위해 옵션 을 전달 하지 않아도됩니다.