나의 도전
실제로 많은 트래픽을 볼 수있는 무차별 모드로 남겨진 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이있는 시스템이 없으므로 종료됩니다.
제안 사항 있어요? 아마도 내 트래픽 덤프를 수행하는 더 좋은 방법 일 수도 있습니다.
답변
tcpdump는 수신 데이터를 링 버퍼에 저장합니다. tcpdump가 내용을 처리하기 전에 버퍼가 오버 플로우되면 패킷이 유실됩니다.
기본 링 버퍼 크기는 아마도 2048 (2MiB)입니다.
버퍼 크기를 늘리려면 다음 -B
옵션을 추가하십시오 .
tcpdump -B 4096 ...
또한 더 빠른 디스크 스토리지를 사용해보십시오.
답변
나는 함께 살 수있는 해결책을 찾았습니다. 삭제 된 패키지는 .0047 %에서 .00013 %로 감소했습니다. 처음에는 그다지별로 보이지 않지만 수백만 개의 패킷을 이야기 할 때는 상당히 많습니다.
솔루션은 여러 가지로 구성되었습니다. 하나는 Michael Hampton이 제안한대로 링 버퍼 크기를 변경하는 것이 었습니다.
또한 램프를 생성하고 라이브 덤핑을 수행했으며 램프에서 디스크로 덤프를 이동하도록 압축 스크립트를 다시 작성했습니다. 디스크의 모든 테스트 및 벤치마킹에 따르면 디스크에 병목 현상이 발생하지 않음을 알 수 있지만 이는 매우 적은 양이지만 눈에 띄게 충분했습니다. 액세스 시간이 여기에서 매우 중요하다고 생각합니다.
하이퍼 스레딩을 비활성화하면 생각보다 많은 작업을 수행 할 수 있습니다.