서버 데이터 버퍼 문제 찾기

2101 단어
어떤 서버에서 데이터 분실이 발생했을 때, 그것들은 틀림없이 어떤 원인 때문일 것이다.우리는 왜 데이터 패키지를 잃어버렸는지 어떻게 분석합니까?
다음은 우리가 알고 싶은 상황입니다.
  • 하나의 패킷이 컴퓨터의 네트워크 스택(RX)에 들어갑니다(예: 포트 8000에서).포트 8000에 해당하는 응용 프로그램이 수신되기 전에 분실되었습니다..
  • 패킷(TX) 전송그것은 당신의 기계에서 나오기 전에 잃어버렸습니다.

  • 본고는 "데이터 패키지가 네트워크 전송 과정에서 잃어버렸으니traceroute/계수 TCP로 재전송하여 진단합시다"(물론 중요하지만)!
    데이터 패키지가 버려졌는지 어떻게 알 수 있습니까?
    제가 트위터에 질문을 했는데 아주 유용한 답이 나왔어요. "넷stat-i 보세요!"이것은 내 노트북에서 실행된 결과입니다.
    bork@kiwi~> sudo netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg docker0 1500 0 0 0 0 0 0 0 0 0 BMU enp0s25 1500 0 1235101 0 242 0 745760 0 0 0 BMRU lo 65536 0 21558 0 0 0 21558 0 0 0 LRU nlmon0 3776 0 551262 0 0 0 0 0 0 0 ORU

    보아하니 받은 (RX) 데이터 패키지가 enp0s25 (내 무선 카드) 에서 분실된 것 같다.하지만 TX 가방을 잃어버리지 않았습니다.
    어떤 사람도 나에게 ethtool-S를 실행하는 것이 도움이 될 것이라고 알려주지만, 나의 ethtool에는 -S 옵션이 없다.
    왜 패킷이 버려졌는지 어떻게 알아요?
    구글 검색을 통해 멋진 도구인dropwatch를 발견했다.기존 Ubuntu 설치 패키지는 없지만 github를 통해 다운로드할 수 있습니다.
    https//github.com/pavel-odintsov/drop_watch
    다음은 내가 컴파일할 수 있는 설명입니다.
    sudo apt-get install -y libnl-3-dev libnl-genl-3-dev binutils-dev libreadline6-dev git clone https://github.com/pavel-odintsov/drop_watch cd drop_watch/src vim Makefile # comment out the -Werror argument to gcc make

    여기는 출력!그것은 나에게 어떤 내부 핵 함수가 데이터 패키지를 잃어버렸는지 알려준다. 쿨!
    sudo ./dropwatch -l kas Initalizing kallsyms db dropwatch> start Enabling monitoring... Kernel monitoring activated. Issue Ctrl-C to stop monitoring 1 drops at tcp_v4_do_rcv+cd (0xffffffff81799bad) 10 drops at tcp_v4_rcv+80 (0xffffffff8179a620) 1 drops at sk_stream_kill_queues+57 (0xffffffff81729ca7) 4 drops at unix_release_sock+20e (0xffffffff817dc94e) 1 drops at igmp_rcv+e1 (0xffffffff817b4c41) 1 drops at igmp_rcv+e1 (0xffffffff817b4c41)

    퍼프로 버려진 데이터 패키지 모니터링
    무슨 일이 일어났는지 디버깅하는 또 다른 멋진 방법이 있다.
    thomas graf는 퍼프를 사용하여 kfree_를 감시할 수 있다고 알려주었다skb 이벤트, 데이터 패키지를 언제 버릴지 알려줍니다.
    sudo perf record -g -a -e skb:kfree_skb sudo perf script

    좋은 웹페이지 즐겨찾기