ethtool의 원리 소개 및 네트워크 카드 패킷 손실 문제 해결 아이디어
이전에 LVS 네트워크 카드의 과도한 트래픽 부하로 인한 소프트 인터럽트로 인한 패킷 손실 문제를 기록한 적이 있습니다. 압박감이 별로 없을 때는 확률이 높지 않습니다. 이번에 공유하고 싶은 주제는 일반적인 서버 네트워크 카드 패킷 손실에 대한 문제 해결 아이디어입니다. 지점 간 패킷 손실 솔루션에 대해 알고 싶다면 이전 기사를 참조하는 것이 좋습니다. MTR을 사용하여 네트워크 문제를 진단하는 방법 Linux의 경우 일반적으로 사용되는 네트워크 카드 패킷 손실 분석 도구는 당연히 ethtool입니다.
2020년 6월 22일 - 첫 번째 초안
원본 텍스트 읽기 - 작업 드라이버 및 하드웨어
ethtool은 네트워크 드라이버 및 하드웨어를 제어하기 위한 표준 Linux 유틸리티입니다. 특히 유선 이더넷 장치에 사용할 수 있습니다.
대부분의 기능은 특정 드라이버의 지원에 따라 다릅니다.
ethtool을 사용하여 볼 수 있습니다. 네트워크 장치(특히 유선 이더넷 장치)에 대한 드라이버 매개변수 및 하드웨어 설정을 수정합니다. 자동 협상, 속도, 이중 및 Wake-on-LAN을 포함하여 필요에 따라 이더넷 카드의 매개변수를 변경할 수 있습니다. 이더넷 카드를 구성하면 컴퓨터가 네트워크를 통해 효율적으로 통신할 수 있습니다. 이 도구는 Linux 시스템에 연결된 이더넷 장치에 대한 많은 정보를 제공합니다.
데이터 패킷 수신은 많은 기본 기술 세부 사항이 포함된 복잡한 프로세스이지만 일반적으로 다음 단계가 필요합니다.
데이터 패킷을 수신한 후 NIC는 먼저 커널에 동기화되어야 합니다. , 중간의 브리지는 rx 링 버퍼입니다. 실제로 rx 링 버퍼는 실제 패킷 데이터를 저장하지 않고 디스크립터가 실제 저장 주소를 가리키는 영역입니다.
드라이버 처리 속도가 네트워크 카드의 패킷 수신 속도를 따라가지 못하는 경우, 드라이버는 버퍼를 할당할 시간이 없고, NIC가 수신한 데이터 패킷을 제때에 sk_buffer에 쓸 수 없습니다. NIC의 내부 버퍼가 가득 차면 일부 데이터가 삭제되어 패킷이 손실됩니다. 패킷 손실의 이 부분은 rx_fifo_errors이며, 이는 /proc/net/dev의 fifo 필드 증가와 ifconfig의 오버런 표시기 증가에 반영됩니다.
이때 데이터 패킷은 sk_buffer로 전송되었습니다. 앞서 언급했듯이 이는 드라이버가 메모리에 할당한 버퍼이며 DMA를 통해 기록됩니다. 이 방법은 CPU에 의존하지 않고 메모리에 직접 데이터를 기록하므로 커널은 실제로 새 데이터가 로드되었는지 알지 못합니다. 메모리. 그렇다면 새로운 데이터가 들어왔음을 커널에 어떻게 알릴 수 있을까요? 대답은 인터럽트입니다. 이는 새로운 데이터가 들어왔으며 후속 처리가 필요함을 커널에 알려줍니다.
인터럽트의 경우 하드 인터럽트와 소프트 인터럽트가 포함됩니다. 먼저 차이점을 간략하게 이해해야 합니다.
NIC가 데이터 패킷을 커널 버퍼 sk_buffer에 복사할 때. DMA를 통해 NIC는 즉시 하드웨어 인터럽트를 시작합니다. CPU가 이를 수신한 후 먼저 네트워크 카드 인터럽트에 해당하는 인터럽트 핸들러가 네트워크 카드 드라이버의 일부로 진입한 다음 소프트 인터럽트를 시작하고 하위 절반에 진입하여 데이터를 소비하기 시작합니다. sk_buffer를 처리하기 위해 커널 프로토콜 스택에 넘겨줍니다.
인터럽트를 통해 네트워크 카드 데이터 요청에 빠르고 신속하게 응답할 수 있지만, 데이터 양이 많으면 CPU가 인터럽트를 가장 많이 처리하게 됩니다. 시간이 걸리고 효율성이 매우 낮습니다. 이러한 문제를 해결하기 위해 현재 커널과 드라이버에서는 데이터 처리를 위해 NAPI(new API)라는 방식을 사용하고 있는데, 그 원리는 간단히 말해 인터럽트 + 폴링(polling)으로 데이터의 양이 많은 경우에는 폴링(polling)을 통해 수신한다. 인터럽트 여러 번의 중단을 피하기 위해 특정 수의 패킷 후에 반환됩니다.
(1) RX 오류
너무 긴 프레임 오류, 링 버퍼 오버플로 오류, crc 검사 오류 및 프레임 동기화 오류를 포함하여 총 패킷 수신 오류 수를 나타냅니다. , fifo 오버런 및 누락된 패키지 등
(2) RX Drop
데이터 패킷이 링 버퍼에 들어 갔지만 메모리 부족 등 시스템상의 이유로 복사하는 과정에서 삭제되었음을 나타냅니다. 메모리.
(3) RX 오버런
링 버퍼(드라이버 큐라고도 함)에서 전송된 IO가 커널이 처리할 수 있는 IO보다 커서 발생하는 fifo 오버런을 나타냅니다. , 링 버퍼 IRQ 요청을 시작하기 전의 버퍼를 나타냅니다. 분명히 오버런이 증가한다는 것은 데이터 패킷이 링 버퍼에 도달하기 전에 네트워크 카드의 물리적 계층에 의해 폐기된다는 것을 의미하며, CPU가 인터럽트를 즉시 처리할 수 없는 것이 링 버퍼가 가득 찬 이유 중 하나입니다. 위 시스템의 경우 인터럽트가 고르지 않게 분산되어 있고(모두 core0에서 눌림) 선호도 부족으로 인해 패킷 손실이 발생하기 때문입니다.
(4) RX 프레임
잘못 정렬된 프레임을 나타냅니다.
네트워크 라인의 패킷은 먼저 네트워크 카드에 의해 획득됩니다. 네트워크 카드는 패킷의 CRC 검사를 확인하여 무결성을 확인한 다음 패킷 헤더를 제거하여 프레임을 획득합니다. 네트워크 카드는 MAC 패킷의 대상 MAC 주소를 확인합니다. 이 네트워크 카드의 MAC 주소와 다르면 폐기됩니다(무차별 모드 제외).
네트워크 카드는 프레임을 네트워크 카드 내부의 FIFO 버퍼에 복사하여 하드웨어 인터럽트를 트리거합니다. (링 버퍼가 있는 네트워크 카드가 있는 경우 소프트웨어 인터럽트가 발생하기 전에 프레임이 링 버퍼에 저장될 수 있는 것으로 보입니다.(Linux에서 프레임의 방향에 대해서는 다음 기사에서 자세히 설명하겠습니다.) 링 버퍼는 공유됩니다. Linux 커널 소스 코드의 네트워크 카드 드라이버는 공간을 할당하기 위해 kcalloc을 사용하므로 일반적으로 링 버퍼에는 상한이 있습니다. 또한 링 버퍼 크기는 저장할 수 있는 프레임 수를 나타내야 하며, 일부 시스템에서는 링 버퍼 크기를 설정하는 ethtool 명령을 사용할 수 없습니다. 아직 이유는 모르겠지만 드라이버가 지원하지 않을 수도 있습니다.)
네트워크 카드 드라이버. 하드 인터럽트 처리 기능을 통해 sk_buff가 구성되고 프레임이 네트워크 카드 FIFO에서 메모리로 복사됩니다. skb를 처리한 다음 커널에 넘겨 처리합니다. (napi를 지원하는 네트워크 카드는 하드 인터럽트를 발생시키지 않고 링 버퍼에 직접 배치해야 합니다. 대신 소프트 인터럽트를 직접 사용하여 링 버퍼의 데이터를 복사하고 처리를 위해 상위 계층으로 직접 보냅니다. 각 네트워크 카드 )
이 과정에서 네트워크 카드 칩은 프레임에 대해 MAC 필터링을 수행하여 시스템 부하를 줄입니다. (무차별 모드 제외)
네트워크 카드 드라이버는 IP 패킷에 14바이트 MAC 헤더를 추가하여 프레임을 형성합니다(아직 CRC 없음). 프레임(아직 CRC 없음)에는 송신자와 수신자의 MAC 주소가 포함되어 있습니다. 드라이버가 MAC 헤더를 생성하므로 원하는 대로 주소를 입력하거나 호스트 위장을 수행할 수 있습니다.
드라이버는 네트워크 카드에서 처리되는 네트워크 카드 칩 내부의 버퍼에 프레임(아직 CRC 없음)을 복사합니다.
네트워크 카드 칩은 불완전한 프레임(CRC 부족)을 전송할 수 있는 패킷으로 다시 캡슐화합니다. 즉, 헤더 동기화 정보와 CRC 검사를 추가한 다음 이를 네트워크 회선에 던져서 완전한 IP 패킷이 전송되고 네트워크 케이블에 연결된 모든 네트워크 카드가 패킷을 볼 수 있습니다.
인터럽트를 생성하는 각 장치에는 장치 드라이버의 일부인 해당 인터럽트 핸들러가 있습니다. 각 네트워크 카드에는 인터럽트가 수신되었음을 네트워크 카드에 알리고 네트워크 카드 버퍼의 데이터 패킷을 메모리에 복사하는 데 사용되는 인터럽트 핸들러가 있습니다.
네트워크 카드는 네트워크로부터 데이터 패킷을 수신하면 데이터 패킷이 도착했음을 커널에 알려야 합니다. 네트워크 카드는 즉시 인터럽트를 발생시킵니다. 커널은 네트워크 카드에 등록된 인터럽트 핸들러 기능을 실행하여 응답합니다. 인터럽트 핸들러는 실행을 시작하고 하드웨어에 알리고 최신 네트워크 데이터 패킷을 메모리에 복사한 다음 네트워크 카드에서 더 많은 데이터 패킷을 읽습니다.
하드웨어와 관련된 중요하고 긴급한 작업입니다.
일반적으로 커널은 네트워크 패킷을 수신하기 위한 네트워크 카드의 캐시 크기가 고정되어 있고 시스템 메모리보다 훨씬 작기 때문에 네트워크 패킷을 시스템 메모리에 빠르게 복사해야 합니다. 따라서 위의 복사 작업이 지연되면 필연적으로 네트워크 카드 FIFO 버퍼가 오버플로됩니다. 들어오는 데이터 패킷이 네트워크 카드의 캐시를 채우고 후속 패킷은 ifconfig에서 삭제될 수만 있습니다.
네트워크 데이터 패킷이 시스템 메모리에 복사되면 중단된 작업이 완료된 후 시스템에 의해 중단되기 전에 실행 중이던 프로그램에 제어권이 반환됩니다.
네트워크 카드의 커널 버퍼는 PC 메모리에 있고 커널에 의해 제어되는 반면, 네트워크 카드에는 FIFO 버퍼 또는 링 버퍼가 있어 둘을 구별해야 합니다. FIFO는 상대적으로 크기가 작으며, 그 안에 데이터가 있으면 커널 버퍼에 데이터를 저장하려고 시도합니다.
네트워크 카드의 버퍼는 커널 공간이나 사용자 공간에 속하지 않습니다. 이는 네트워크 카드와 운영 체제 사이에 버퍼를 허용하는 하드웨어 버퍼입니다.
커널 버퍼는 커널 공간, 메모리에 있으며 커널 프로그램에서 데이터 버퍼로 사용됩니다. 하드웨어 영역에서 읽거나 쓰기
사용자 버퍼는 사용자 공간, 메모리에 있으며 사용자 프로그램에서 하드웨어에서 읽거나 쓰기 위한 데이터 버퍼로 사용됩니다. >
또한 상호 작용을 통해 데이터 속도를 높이기 위해 커널 버퍼를 사용자 공간에 매핑하여 커널 프로그램과 사용자 프로그램이 동시에 이 범위에 액세스할 수 있습니다.
링 버퍼가 있는 네트워크 카드의 경우 링 버퍼는 드라이버와 네트워크 카드 간에 공유되므로 커널은 링 버퍼에 직접 액세스할 수 있습니다. 일반적으로 프레임 복사본은 자체 커널 공간에 복사됩니다. 상위 계층 프로토콜에서는 사용자가 데이터를 얻을 때까지 후속 skb가 skb 포인터 전송 방식에 따라 전달됩니다. 따라서 링 버퍼 네트워크 카드의 경우 프레임이 에서 전달될 때 많은 수의 복사본이 발생합니다. 커널에 의해 제어되는 컴퓨터 메모리에 대한 링 버퍼).
네트워크 카드는 데이터 링크 계층에서 작동하며 데이터 볼륨 링크 계층은 일부 확인을 수행하고 이를 프레임으로 캡슐화합니다. 검증에 오류가 있는지 확인하고, 전송에 문제가 있는지 판단할 수 있습니다. 그런 다음 소프트웨어 수준에서 버퍼가 너무 작아서 패킷이 손실되는지 여부를 확인합니다.
기계는 종종 패킷 손실 경보를 수신합니다. 먼저 가장 낮은 계층에 문제가 있는지 확인하십시오.
(1) 작업 모드가 정상인지 확인하십시오.
(2) 테스트가 정상인지 확인
Speed, Duplex, CRC 등은 모두 정상이며 물리적 간섭은 기본적으로 배제할 수 있습니다.
ethtool -S 출력의 수신 카운터에서 rx_crc_errors가 증가하는 이유는 무엇입니까?
ethtool -S 출력을 확인하고 삭제 및 오류가 있는 위치를 찾으십시오.
rx_crc_errors 에 해당하는 번호
p1p1의 인터페이스 유형, 연결 모드, 속도 및 기타 정보와 현재 네트워크 케이블이 연결되어 있는지 여부를 표시합니다(네트워크 케이블인 경우 지원되는 포트는 TP, 광섬유인 경우 Fiber를 표시합니다), 다음은 세 가지 중요한 키워드의 예입니다.
지원되는 포트: [FIBRE]
속도: 10000Mb/s
링크 감지됨: 예
ethtool
Linux 드라이버에 대한 카운터 문제 해결
ethtool 출력에 rx_crc_errors가 표시되는 이유는 무엇입니까?
Ping 요청 오류 분석
ifconfig 명령에 대한 자세한 설명
ethtool 명령에 대한 자세한 설명
ethtool은 네트워크 카드 패킷 손실의 심각한 문제와 네트워크 원리를 해결합니다. 카드