![Linux TCP, 스트림 쓰기 시 예기치 않은 지연을 디버깅하는 방법은 무엇입니까?](https://linux55.com/image/161402/Linux%20TCP%2C%20%EC%8A%A4%ED%8A%B8%EB%A6%BC%20%EC%93%B0%EA%B8%B0%20%EC%8B%9C%20%EC%98%88%EA%B8%B0%EC%B9%98%20%EC%95%8A%EC%9D%80%20%EC%A7%80%EC%97%B0%EC%9D%84%20%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
문제: 내 음악 서버 코드는 차단 소켓을 통한 간단한 TCP 연결을 사용하고 바이트를 클라이언트(로지텍 스퀴즈 박스)로 스트리밍해야 합니다. 복잡하지 않습니다. 파일에서 64k를 읽고 squeezebox에 쓰고 반복합니다. 서버와 스퀴즈박스 클라이언트가 동일한 스위치에 연결되어 있어 너무 바쁘지 않은 로컬 LAN에서 모두 실행됩니다. Squeezebox는 스트림을 매우 빠르게 소비하지 않으므로 서버는 거의 모든 하드웨어에서 클라이언트의 요구 사항을 충족하는 데 아무런 문제가 없습니다.
서버가 Raspberry pi 3B+에서 실행되는 경우 실제로는 전혀 문제가 없습니다. 파이 제로가 따라잡을 수 있을지도 모릅니다. 내 Linux 노트북에서 실행하면 모든 것이 정상입니다. 주기적으로 스퀴즈 박스의 내부 버퍼가 얼마나 꽉 찼는지 물어볼 수 있는데, 그 버퍼는 빠르게 약 99% 이상에 도달하여 그대로 유지됩니다. 예상한 대로 서버 write()(처음 몇 개 이후)는 대부분의 시간을 차단합니다.
하지만 서버를 Linux를 실행하는 Azulle Inspire로 옮기고 동일한 스위치에 연결했는데 뭔가 크게 잘못되었습니다. 음악이 재생되기 시작했지만 곧 발작과 시작으로 사라졌습니다. Squeezebox는 버퍼가 가득 차기 시작하지만 무언가가 멈추고 버퍼가 매우 빠르게 비워져서(가끔 약간 올라가서 일부 트래픽이 통과하지만 충분히 닫히지 않는 것 같습니다) 음악이 중지된다고 보고합니다. 서버에서는 계속해서 쓰는 중이라고 하는데 예상보다 쓰기 시간이 오래 걸립니다.
Azulle에는 가끔 다른 네트워크 작업이 있으며 모두 잘 작동하지만 대부분의 다른 응용 프로그램에서는 짧은 네트워크 지연을 느끼지 못할 것입니다. 그러나 음악 서버가 실행되는 동안 NUC(및 네트워크)는 유휴 상태입니다. 이는 CPU나 대역폭 문제가 아닙니다.
케이블을 바꾸고, 스위치를 바꾸고, 스위치의 다른 포트를 사용해 보았습니다. 다른 버퍼 크기를 보내려고했습니다. 효과가 없습니다. 내가 생각할 수 있는 것은 TCP 스택이나 이더넷 하드웨어에 뭔가 매우 이상한 점이 있다는 것뿐입니다.
어떻게 디버깅할 수 있나요? Linux 노트북은 Linux 4.15.0-55-generic을 실행하여 제대로 작동합니다(적절한 업그레이드로 변경되지는 않습니다). Azuelle은 Linux 4.15.0-64-generic, Mint를 실행하고 있습니다. 4.15.0에서 TCP 처리가 얼마나 근본적으로 바뀌었는지 믿을 수 없습니다. 저는 커널 구성이나 디버깅은 물론이고 tcpdump와 같은 도구에도 익숙하지 않아서 도움을 구하고 있습니다...
Linux 노트북과 Azuelle 사이의 핑 시간은 일관되게 약 0.2ms와 0.35ms이며 일반적인 값은 0.33ms입니다.
나는 길을 잃었다. 티아.
답변1
tcpdump를 사용하여 스트림을 캡처합니다.
tcpdump -i iface -s 1500 -w out.cap 'tcp and port xxx'
두 포트 번호 중 하나인 iface
네트워크 인터페이스는 어디에 있습니까?xxx
그런 다음 out.cap
Wireshark로 열고 추적에서 무엇을 얻을 수 있는지 확인하십시오. 무슨 일이 일어나고 있는지 분명해야합니다. 그렇지 않다면 다시 게시해 주세요.
FWIW, 당신이 말하는 바에 따르면 MTU 문제처럼 들립니다.
답변2
글쎄, 그게 나에게 필요한 단서였어.
MTU 크기가 궁금했을 때 이것을 발견했습니다.
/sys/class/net/enp1s0/mtu:1500 /sys/class/net/lo/mtu:65536 /sys/class/net/wlp2s0/mtu:1500
모든 것이 정상이지만 wlp는 무선 연결처럼 보입니다. 무선 전화? 아직 열려 있나요? 그래서 wlp... 인터페이스에서 tcpdump를 수행했고 프로토콜에서 인식된 메시지와 긴 ACK 문자열, 그리고 스트림에서 몇 초 동안 재생되는 음악을 본 다음 실패했습니다.
그런 다음 무선을 끄고 다시 시도했습니다. 말더듬이 없습니다. 모두 제일 좋다.
이상하게도 서버는 무선 액세스 포인트에서 불과 몇 피트 떨어져 있습니다. 사용 중이더라도 대역폭이 부족하면 안 됩니다. 어떤 이유로 두 개를 동시에 열면 문제가 발생할지 궁금했지만 그럴 수는 없을 것 같습니다...