블로그로 돌아가기
·11분 분량·productdevbook

Mac 개발자와 시스템 관리자를 위한 대역폭 모니터링

macOS에서 개발자와 시스템 관리자를 위한 실용적인 대역폭 모니터링 구성입니다. 프로세스별 가시성, 스크립팅 훅, 디버깅 전술을 다룹니다.

  • Developer tools
  • macOS
  • Network monitoring
  • Sysadmin

90초 걸려야 할 테스트 스위트가 14분 걸리고 CI가 시간 초과되고 있습니다. 로컬 실행도 느립니다. 프로파일러를 붙여 봅니다 — CPU는 괜찮습니다. 메모리도 괜찮습니다. 그러다 테스트 픽스처가 실행당 수백 개의 외부 HTTPS 요청을 만들고 있다는 것을 알아챕니다. 누군가가 3개월 전에 setup 훅에 실제 API 호출을 추가했고, 이제 모든 PR이 방금 속도 제한된 샌드박스 엔드포인트를 두드리고 있기 때문입니다. 대역폭 모니터링이 첫날에 잡았을 일입니다.

Mac의 개발자와 시스템 관리자에게 네트워크 관찰 가능성은 복리로 쌓이는 기술 중 하나입니다. 어떤 도구가 어떤 질문에 답하는지 알게 되면, 실제로는 명백한 일을 하는 폭주 프로세스인 문제에 시간을 낭비하는 것을 멈추게 됩니다. 이 글은 작업용 스택입니다. tcpdump를 언제 잡을지, Wireshark는 언제, nettop는 언제, ova 같은 앱별 모니터는 언제, 그리고 이들을 어떻게 결합할지. Mac용 개발자 대역폭 모니터를 검색해 왔다면, 여기 목표는 마케팅 투어가 아니라 실용적인 결정 트리입니다.

네 가지 수준, 간략하게

진단 도구는 네 가지 추상화 수준에 걸쳐 있습니다.

  1. 패킷 바이트tcpdump. 선상의 모든 바이트와 헤더. 가장 낮은 수준. 캡처 후 분석에 좋음.
  2. 패킷 검사 — Wireshark. tcpdump의 데이터를 읽기 쉬운 프로토콜 계층으로 디코딩. 연결이 무엇을 하는지 이해하는 데 좋음.
  3. 라이브 프로세스별nettop. macOS 네이티브, 프로세스별 현재 연결과 속도를 보여줌.
  4. 시간에 걸친 앱별 합계 — ova. 메뉴 바 앱, 스크럽 가능한 기록, 도우미 프로세스 접기.

이를 잘 사용하는 비결은 수준을 질문에 맞추는 것입니다. "지난주 우리 테스트 스위트가 얼마나 대역폭을 사용했는가"라고 묻는다면, tcpdump는 잘못된 답입니다. ova 또는 유사한 앱별 기록 도구가 옳습니다. "이 특정 HTTPS 연결이 왜 느린가"라고 묻는다면, nettop은 알려주지 않을 것입니다. Wireshark가 필요합니다.

tcpdump: 선상의 바이트 뷰

tcpdump는 모든 Mac에 있습니다. 다음과 같을 때 적절한 도구입니다.

  • 특정 프로토콜 문제(TLS 핸드셰이크 실패, 재전송, 단편화)를 의심할 때.
  • 나중 분석을 위해 트래픽을 캡처해야 할 때.
  • GUI 도구를 사용할 수 없는 서버급 컴퓨터에서 작업할 때.

유용한 기본 캡처:

sudo tcpdump -i en0 -n -s 0 -w capture.pcap
  • -i en0 — Wi-Fi 인터페이스에서 캡처(둘 다 있는 Mac에서 이더넷에는 en1 사용, 또는 ifconfig 확인).
  • -n — 호스트 이름을 해석하지 않음(훨씬 빠름).
  • -s 0 — 헤더만이 아니라 전체 패킷을 캡처.
  • -w capture.pcap — Wireshark가 읽을 수 있는 pcap 파일에 쓰기.

필터링:

sudo tcpdump -i en0 -n 'host api.example.com and port 443'
sudo tcpdump -i en0 -n 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'

첫 번째는 HTTPS의 특정 호스트 이름으로의 트래픽만 캡처합니다. 두 번째는 TCP 연결 설정/해제만 캡처합니다. 페이로드 바이트에 빠지지 않고 연결 수를 세는 데 유용합니다.

Wireshark: 프로토콜 디코드

Wireshark는 pcap 파일을 읽고 읽기 쉬운 계층으로 디코딩합니다. 이더넷 프레임, IP 패킷, TCP 세그먼트, TLS 레코드, HTTP 요청. 무료, 로컬, 클라우드 컴포넌트 없음. Homebrew로 설치하세요.

brew install --cask wireshark

표시 필터 언어가 마법입니다. 영향력이 큰 몇 가지 필터:

  • http.response.code >= 400 — 실패한 HTTP 응답 표시.
  • tcp.analysis.retransmission — TCP 재전송 표시. 종종 네트워크 혼잡이나 피어 문제의 신호.
  • tls.handshake.type == 1 — TLS Client Hello 표시(연결당 하나).
  • dns and dns.qry.name contains "example.com" — 특정 도메인의 DNS 쿼리 표시.

Wireshark는 "오늘 Slack이 얼마나 대역폭을 사용했는가"에는 과합니다. 하지만 "다른 것은 성공하는데 이 특정 연결은 왜 30초에 시간 초과되는가"에는 정확히 알맞습니다. 클라이언트 컴퓨터에서 캡처된 pcap이 있고 사후에 조사해야 할 때도 적절한 도구입니다.

nettop: 라이브 프로세스별 뷰

nettop은 macOS와 함께 제공됩니다. 앱별 라이브 모니터에 가장 가까운 내장 등가물입니다.

sudo nettop -P -m route

유용한 플래그:

  • -P — 프로세스별 그룹화.
  • -m route — 경로 정보(어느 인터페이스) 표시.
  • -x — 바이트 수 표시(속도뿐만 아니라).
  • -c <interval> — 주기적 새로 고침, 예를 들어 -c 2.
  • -J bytes_in,bytes_out,interface — 표시할 특정 열 선택.

nettop은 텍스트 전용이고, 자체 화면을 새로 고치며, SSH를 통해 작동합니다. 원격 Mac(CI 러너, 분류를 위해 SSH한 동료의 컴퓨터)에서 빠른 "지금 이상한 것이 있는가" 답이 필요할 때 적절한 도구입니다.

단점: nettop은 기록이 없습니다. 종료하는 순간 데이터가 사라집니다.

ova: 도우미 접기와 함께하는 앱별 기록

ova는 메뉴 바에 자리 잡고 nettop이 제공하지 않는 것을 제공합니다. 지속적인 기록, 스크럽 가능한 타임라인, 도우미 프로세스 접기. 약 1Hz로 샘플링하며, 데이터는 로컬에 쓰여지고 삭제할 때까지 머무릅니다.

ova가 내장 도구가 하지 않는 두 가지를 합니다.

  1. 도우미 프로세스 접기. Chrome은 탭당 하나의 도우미 PID를 만듭니다. Slack은 자체 도우미 아키텍처를 가집니다. Discord, Telegram, 일반적으로 Electron 앱이 그렇게 합니다. nettop은 이를 별도의 행("Slack Helper (Plugin)", "Slack Helper (GPU)" 등)으로 보여주는데, 기술적으로는 정확하지만 읽기 어렵습니다. ova는 이를 "Slack" 아래로 접어서 행이 실제로 의미하는 것이 됩니다.
  2. 스크럽 가능한 기록. "지난 화요일 오후 3시에 무슨 일이 있었는가"는 타임라인을 클릭하고 드래그해 답할 수 있습니다. nettop의 답은 "전혀 모릅니다, 실행하고 있지 않았습니다"입니다.
도우미 프로세스 접기
ova는 모든 도우미 PID를 상위 앱 아래로 그룹화하므로 일곱 개의 도우미 행 대신 "Slack"을 읽게 됩니다.

개발자의 일상 — "빌드가 레지스트리를 두드렸는가", "어떤 테스트가 4GB를 끌어왔는가", "매시 정각의 그 반복되는 급증은 무엇인가" — 에 대해, ova는 격식 없이 빠르게 답합니다. nettop은 "지금 당장, 설치 없이"가 필요할 때의 대체입니다.

구체적인 예

API 두드리기 디버깅

팀이 스테이징 API가 느리다고 불평합니다. 클라이언트가 재시도 루프에 있다고 의심합니다. 문제의 개발자의 Mac 메뉴 바에 ova가 있는 채로, 느려짐 시간으로 스크럽하면 팀의 CLI 도구가 15분 동안 80MB/s로 급증하는 것을 봅니다. 그것이 단서입니다. 30초 캡처에 Wireshark를 열고 확인합니다. 모든 요청이 503을 받고 있고 클라이언트가 100ms 백오프로 재시도하고 있습니다. 버그는 재시도 정책에 있습니다 — 지수가 아니라 상수 — 그리고 이제 정확히 무엇을 고쳐야 할지 압니다.

폭주하는 테스트 프로세스 찾기

CI는 괜찮은데 로컬 테스트 실행이 느립니다. ova를 열고, 스위트를 실행하고, 급증을 스크럽합니다. 30초 창에 node가 200MB를 끌어오는 것을 봅니다. 의심스러운 포트로 필터링된 tcpdump는 테스트 픽스처가 기록된 픽스처를 사용하는 대신 실제 CDN에서 라이브 데이터를 매 테스트마다 가져오고 있음을 보여줍니다. 로컬 픽스처로 교체하면 스위트가 90초로 돌아갑니다.

공급업체 라이브러리에서 의외의 외부 통신

규정 준수 검토에서 코드베이스가 어디로든 본부에 전화하는지 묻습니다. 정적 분석은 부분적입니다. 유일한 결정적 답은 "대표적인 사용 동안 네트워크를 지켜보라"입니다. ova로 한 시간 동안 앱을 실행하고, 검증을 위해 같은 시간을 tcpdump로 캡처합니다. nettop의 호스트 이름 열에서 본 목적지를 교차 점검합니다. 예상치 못한 것은 조사됩니다. 이런 종류의 감사는 앱별 기록 없이는 어렵습니다.

시스템 관리자의 플릿에서 폭주하는 동기화 에이전트

내부 Slack 메시지: "Mac이 느립니다." SSH로 들어가서 sudo nettop -P -m route를 실행합니다. 모두가 설치한 줄 잊은 백업 에이전트가 전체 재인덱싱을 하면서 30MB/s를 지속적으로 끌어오고 있습니다. 데몬을 죽이고 일정을 고치는 티켓을 제출합니다. 5분 수정, 올바른 도구 없이는 한 시간 걸렸을 일.

ova 작동 모습 보기

한눈에 볼 수 있는 메뉴 바 대역폭 모니터 — 로컬, 서명, 약 3MB.

macOS용 다운로드

스크립트 가능한 후크

자동화를 위해:

JSON 비슷한 출력의 nettop

nettop -P -L 1 -k state,interface_name,rx_dupe,rx_ooo,re-tx,rtt_avg,rcvsize,tx_win,tc_class,tc_mgt,cc_algo,P,C,R,W -J bytes_in,bytes_out

이는 스크립트로 캡처할 수 있는 단일 샘플(-L 1 플래그)을 생성합니다. 약간 가공한 후 awk 또는 jq에 파이프하세요.

대역폭 임계값

빠른 "어떤 프로세스가 X를 초과하면 알림" 스크립트는 nettop 주변에 만들 수 있습니다.

sudo nettop -P -L 1 -J bytes_in,bytes_out -k state,interface_name,P,C,R,W \
  | awk 'NR>1 && ($2+$3) > 1000000 {print}'

(거칠지만 기능적입니다.) 프로덕션 품질 버전은 호스트별 트래픽에 iftop을, 인터페이스 수준에 bmon을 보세요.

워치독으로서의 tcpdump

sudo tcpdump -i en0 -n 'host suspicious.example.com' -w "/tmp/capture-$(date +%Y%m%d-%H%M).pcap" -G 3600 -W 24

1시간 캡처 파일을 회전시키며, 24개를 유지합니다. "이게 언제 일어나는지 모르지만 다음에 잡고 싶다"에 유용합니다.

ova 내보내기

ova는 기록을 로컬에 씁니다. 그것을 대시보드나 보고서로 보내야 한다면, 내보내기 경로가 적절한 시작점입니다. 데이터는 본인의 것이며, 중간에 공급업체 동기화 계층이 없습니다.

Mac 워크플로가 실제로 필요로 하는 올바른 개발자 대역폭 모니터 선택

짧은 매트릭스:

질문적절한 도구
지금 무엇이 내 네트워크를 사용하는가?nettop, ova
어제 오후 3시에 무엇이 내 네트워크를 사용했는가?ova
이 특정 TCP 연결이 왜 느린가?Wireshark
TLS 핸드셰이크 실패가 있는가?Wireshark
지난주의 전체 바이트 합계는?ova
프로세스 X가 호스트 Y와 통신하는가?nettop, tcpdump
나중 포렌식 검토를 위한 캡처?tcpdump → pcap
SSH를 통한 일회성 원격 진단?nettop

패턴은 다음과 같습니다. nettop과 ova는 "무엇"과 "언제"에, tcpdump와 Wireshark는 프로토콜 수준의 "왜"에 사용됩니다. 대부분의 개발자 대상 질문은 Wireshark를 열지 않고 답해집니다. 그것은 진정으로 혼란스러운 프로토콜 문제를 위해 보존된 더 낮은 빈도의 도구입니다.

시스템 관리자 고유 패턴

Mac 플릿(소규모 팀, 디자인 스튜디오, 비디오 숍)을 유지한다면, 패턴이 다릅니다.

  • 먼저 발견. 무엇이 실행되고 있는지 보기 위해 SSH 또는 원격 관리를 통해 각 컴퓨터에서 sudo nettop -P -m route를 실행하세요. 익숙하지 않은 프로세스를 찾으세요. 원치 않는 브라우저 확장, 번들된 애드웨어, 잊혀진 베타 소프트웨어의 명백한 신호입니다.
  • 파워 유저에 대한 기록. 팀의 무거운 네트워크 사용자(데일리를 업로드하는 비디오 편집자, 큰 아티팩트를 푸시하는 개발자)에게는, 앱별 기록 도구가 일어나는 순간에 거기 있을 필요 없이 반복되는 문제를 잡습니다.
  • 문서화된 기준선. "좋은" Mac과 "불평하는" Mac에 대해 nettop 출력을 캡처하세요. 차이는 보통 명백합니다.

다음에 할 일

Mac용 개발자 대역폭 모니터 스택에서 0에서 시작한다면, 항상 켜진 기록 뷰를 위해 ova를 설치하고, 위의 세 가지 nettop 주문을 배우고, 필요할 때를 위해 Wireshark를 북마크하세요. 그것이 작업 세트입니다. 개발자나 시스템 관리자의 하루의 대부분의 문제는 앱별 또는 프로세스별 수준에서 해결됩니다. 패킷 수준 도구는 매일이 아니라 매월 나타나는 더 어려운 경우를 위해 거기 있습니다.

API를 두드리는 테스트 스위트, 폭주하는 동기화 에이전트, 빌드당 8GB를 몰래 다운로드하는 CI 러너 — 이 모든 것은 올바른 도구를 여는 순간 보입니다. 비용은 몇 분의 설정입니다. 보상은 다음번에 무언가가 "이유 없이 느릴" 때 답이 두 시간의 프로파일러 사냥 대신 메뉴 바에 있다는 것입니다.