사용량이 많은 인터페이스에서 tcpdumping시 많은 손실 된 패키지


11

나의 도전

실제로 많은 트래픽을 볼 수있는 무차별 모드로 남겨진 2 개의 인터페이스에서 많은 데이터를 tcpdumping해야합니다.

그것을 요 ​​약하기

  • 2 개의 인터페이스에서 무차별 모드로 모든 트래픽 기록
  • 이러한 인터페이스에는 IP 주소가 할당 되지 않습니다
  • pcap 파일은 ~ 1G마다 회전해야합니다
  • 10TB의 파일이 저장되면 가장 오래된 파일을 자릅니다.

내가 현재하는 일

지금은 다음과 같이 tcpdump를 사용합니다.

ifconfig ethX promisc
ifconfig ethX promisc
tcpdump -n -C 1000 -z /data/compress.sh -i any -w /data/livedump/capture.pcap $FILTER

$FILTER내가 사용할 수 있도록 SRC / DST 필터가 들어 있습니다 -i any. 그 이유는 두 개의 인터페이스가 있고 두 개가 아닌 단일 스레드에서 덤프를 실행하고 싶기 때문입니다.

compress.sh tar를 다른 CPU 코어에 할당하고, 데이터를 압축하고, 적절한 파일 이름을 지정하여 아카이브 위치로 옮깁니다.

두 개의 인터페이스를 지정할 수 없으므로 필터를 사용하고 any인터페이스 에서 덤프하도록 선택했습니다 .

지금은 하우스 키핑을하지 않지만 디스크 모니터링을 계획하고 100G가 남았을 때 가장 오래된 파일을 초기화하기 시작합니다.

그리고 지금; 내 문제

패킷이 끊어졌습니다. 이것은 몇 시간 동안 실행되어 약 250 기가의 pcap 파일을 수집 한 덤프에서 가져온 것입니다.

430083369 packets captured
430115470 packets received by filter
32057 packets dropped by kernel  <-- This is my concern

너무 많은 패킷이 손실되지 않도록하려면 어떻게해야합니까?

내가 이미 시도하거나 본 것들

값이 변경 /proc/sys/net/core/rmem_max되었고 /proc/sys/net/core/rmem_default실제로 도움이 된 부분은 실제로 손실 된 패킷의 절반 정도만 처리했습니다.

또한 gulp를 살펴 봤습니다. gulp 의 문제점은 한 프로세스에서 여러 인터페이스를 지원하지 않으며 인터페이스에 IP 주소가 없으면 화를냅니다. 불행히도, 그것은 내 경우에는 거래 차단기입니다.

다음 문제는 파이프를 통해 트래픽이 흐를 때 자동 회전이 불가능하다는 것입니다. 하나의 거대한 10TB 파일을 얻는 것은 그리 효율적이지 않으며 wireshark를 실행할 수있는 10TB 이상의 RAM이있는 시스템이 없으므로 종료됩니다.

제안 사항 있어요? 아마도 내 트래픽 덤프를 수행하는 더 좋은 방법 일 수도 있습니다.


내 경우에는 -s0 옵션을 사용하고 -s1600 (MTU 바로 위)으로 변경하면 해결되었습니다.
LatinSuD

답변:


11

tcpdump는 수신 데이터를 링 버퍼에 저장합니다. tcpdump가 내용을 처리하기 전에 버퍼가 오버 플로우되면 패킷이 유실됩니다.

기본 링 버퍼 크기는 아마도 2048 (2MiB)입니다.

버퍼 크기를 늘리려면 다음 -B옵션을 추가하십시오 .

tcpdump -B 4096 ...

또한 더 빠른 디스크 스토리지를 사용해보십시오.


버퍼 크기를 변경해 보겠습니다. 디스크 저장 속도가 문제가 아니라고 확신합니다. 덤프 및 17 기가 파일을 복사 할 때 약 15M / sec의 데이터를 기록합니다. 17179869184 바이트 (17GB) 복사, 23.5737 초, 729MB / s (bs = 8k count = 2048k 사용)
Frands Hansen

7

나는 함께 살 수있는 해결책을 찾았습니다. 삭제 된 패키지는 .0047 %에서 .00013 %로 감소했습니다. 처음에는 그다지별로 보이지 않지만 수백만 개의 패킷을 이야기 할 때는 상당히 많습니다.

솔루션은 여러 가지로 구성되었습니다. 하나는 Michael Hampton이 제안한대로 링 버퍼 크기를 변경하는 것이 었습니다.

또한 램프를 생성하고 라이브 덤핑을 수행했으며 램프에서 디스크로 덤프를 이동하도록 압축 스크립트를 다시 작성했습니다. 디스크의 모든 테스트 및 벤치마킹에 따르면 디스크에 병목 현상이 발생하지 않음을 알 수 있지만 이는 매우 적은 양이지만 눈에 띄게 충분했습니다. 액세스 시간이 여기에서 매우 중요하다고 생각합니다.

하이퍼 스레딩을 비활성화하면 생각보다 많은 작업을 수행 할 수 있습니다.


"하이퍼 스레딩 비활성화"가 많은 도움을 의미합니까? 얼마나 도움이 될까요? 감사.
가난한 개발자

솔직히, 나는 더 이상 구체적인 내용을 기억할 수 없습니다. 그 이후로 직장을 바꾸었지만 필자가 작성한 내용에서 하이퍼 스레딩을 사용하지 않도록 설정하면 문제가 해결 된 것으로 보입니다.
Frands Hansen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.