Linux 커널 4.1.25가 설치된 ZTE 라우터가 있고 여기에 snmp 에이전트(mini-snmpd)를 설치하여 트래픽을 제어했습니다.
내가 얻은 데이터가 정확하지 않았기 때문에 몇 가지 조사를 한 결과 ifconfig와 /proc/net/dev 모두 잘못된 데이터를 제공하는 반면 zte 프로그램(cspd/httpd)은 올바른 값을 제공하고 있음을 발견했습니다.
ifconfig가 eth4에 대한 정보를 반환하는 경우 이는 내가 삽입한 인터페이스입니다.
RX 바이트: 177365531(161.1MiB) TX 바이트: 12507777123(11.6Gib)
라우터 웹 페이지에는 더 큰 내용이 표시되며 이 인터페이스에 대한 올바른 값은 다음과 같습니다.
수신/전송된 바이트 수 100655800471/286284079917
내가 만들면속도 테스트-cli내 컴퓨터에서 전송된 데이터 speedtest-cli 보고서(2/3GB 입/출력)에 따라 네트워크 카운터가 증가하는 것을 볼 수 있습니다. 그러나 ifconfig가 거의 움직이지 않으면 때로는 +300MB, 때로는 +100MB까지 증가합니다.
Speedtest by Ookla
Server: xxxxxx (id = 14979)
ISP: xxxxxx
Latency: 1.93 ms (0.12 ms jitter)
Download: 2339.50 Mbps (data used: 2.9 GB )
Upload: 2339.21 Mbps (data used: 2.1 GB )
Packet Loss: 0.0%
ZTE의 프로그램은 정확한 데이터를 얻는데 커널은 정확한 데이터를 얻지 못하는 이유가 있습니까?
편집하다:
글쎄요, 저는 해결책이 아니라 원인을 찾았다고 믿습니다(만약 해결책이 있다면).
조정 가능한 매개변수가 있습니다./proc/ZTE/sys/ffe
만약 내가한다면: 에코 npu 0 > /proc/zte/sys/ffe/cmd
좋은 네트워크 그래프가 보이기 시작했지만 들어오는 트래픽이 약 1.7Gbps로 제한되는 것 같습니다. (이전에는 약 2.35Gbps를 얻었습니다.)
만약 내가한다면: 에코 ffe 0 > /proc/zte/sys/ffe/cmd
다운로드 및 업로드 속도가 약 300mbps로 급격히 떨어졌습니다.
npu와 ffe가 무엇을 의미하는지 조사해 본 결과, 하드웨어 네트워크 가속기(네트워크 처리 장치 및 빨리 감기 엔진)인 것 같습니다.
/proc/net/dev가 npu를 통과하는 전체 트래픽을 인식하지 못하는 이유를 여전히 모르겠습니다. 그러나 사용자 공간의 프로그램은 인식하며, 이 문제가 어떻게든 해결될 수 있는지 여부도 알 수 없습니다. net/dev 파일을 업데이트하는지 확인하기 위해 사용할 no_delete, 타이머, flowctrl 옵션이 있습니다.
편집 2:
더 많은 조사를 한 후 cspd 프로세스에서 strace를 사용했고 라우터 네트워크에서 eth 통계를 요청하여 cspd 프로세스 함수 CmEthGetPortBasicStats() 전송에 대한 호출처럼 보이는 write()를 볼 수 있었습니다. cspd 바이너리를 보기 위해 ghidra를 사용하여 /dev/switch_dev 파일에 fopen()이 있고 기본 통계 및 속도 설정과 같은 다양한 작업을 요청할 때 값이 0x38(56)인 ioctl이 있는 것을 발견했습니다. , 이중, 인터페이스 켜기/끄기... switch_dev에서 데이터를 검색하기 위해 ioctl 프로그램을 만들려고 했습니다. 아직 성공하지 못했습니다. 몇 바이트만 수신했습니다.
편집 3:
좋습니다. cspd 바이너리에는 두 가지 기능이 있습니다.
https://i.stack.imgur.com/4OltN.png
이 함수는 내가 원하는 것을 정확히 수행하며, 모든 인터페이스에 대한 통계를 한 번에 수신합니다. 이 함수는 라우터 웹페이지에서 eth 통계를 확인할 때 호출됩니다.
https://i.stack.imgur.com/gfl1x.png
이 함수는 동일한 작업을 수행하지만 인터페이스별로 실행되며 콘솔에서 이 명령을 실행할 때 호출되는 것을 확인했습니다. sendcmd 1 switch_mgr getPortStats [iface 번호]
따라서 아직 /dev/switch_mgr과 직접 상호 작용할 수는 없지만 mini-snmpd 소스 코드를 패치하여 sendcmd 명령의 데이터가 추가된 가짜 /proc/net/dev를 생성했습니다. snmpd는 원본 대신 명령을 구문 분석하여 마침내 내가 찾던 것을 달성했습니다.
ioctl() 호출을 5 popen("sendcmd 1 switch_mgr...")으로 변경했기 때문에 이 솔루션이 완벽하지 않다는 것을 알고 있지만 이로 인해 눈에 띄는 오버헤드가 실제로 보이지 않으며 mini-snmpd가 올바른 숫자를 제공합니다. . 가짜를 만든 이후로 ifconfig가 수정되지 않는 것 같습니다./proc/net/dev존재하다/var/tmp/dev-fake, ifconfig는 정보를 얻지 못합니다. 나중에 새로운 정적 ifconfig를 컴파일할 수도 있지만 그것은 나에게 우선 순위가 아닙니다.
저는 이것으로 충분합니다. 그러나 누군가 저를 직접적으로 도와주고 싶다면/dev/스위치_dev