이번 프로젝트에서 소켓 통신을 맡게 되면서, 한 가지 신경 쓴 게 있었다.
바로 [ 불필요한 소켓 연결을 줄이는 것 ] 이었다.
그런데 팀원 중 한명이
"근데, 소켓 연결 많으면 뭐가 안 좋은데?"라고 물어봤을 때,
"우리 돈이 많이 나가니까...? " 대답을 이렇게밖에 못 했다.
그 말도 틀리진 않았지만, 그 순간
내가 정확히 왜 그런지 설명 못 하네?싶었다.
그래서 이번 기회에 확실히 정리해보고자 한다.
웹 개발을 하다 보면 종종
근데 이게 정확히 뭘 의미하는지,
왜 줄여야 하는지 헷갈릴 때가 많다.
오늘은 이 두 가지 개념을 알아보자.
서버와 클라이언트를 이어주는 도로가 있다고 생각해보자.
이 도로 위를 달리는 자동차가 바로 네트워크 트래픽, 즉 오고 가는 데이터의 양이다.
도로 자체는 네트워크 리소스다.
도로 = 리소스 (서버/클라이언트가 데이터를 보내기 위해 확보한 자원)
자동차 = 트래픽 (실제로 오고 간 데이터)
도로를 만들고 유지하려면 비용이 든다.
가드레일, 표지판, 관리 인력, 도로 점검 등 운영 리소스가 필요하다.
그런데 생각해보자.
차는 다니고 있지만, 그 도로가 꼭 필요한 건 아니라면?
그냥 비효율적으로 연결만 유지되고 있는 상태일 수도 있다.
(서버와 클라이언트가 데이터를 주고 받지만 필요하지 않는 데이터라면?)
도로를 계속 유지하느라 비용이 든다.
관리 인력은 분산되고, 예산도 낭비된다.
차가 다니는 만큼 트래픽도 쌓인다.
도로 유지뿐 아니라, 그 위를 달리는 자동차(데이터)가 많아지면
전체 시스템에 부담이 늘어날 수밖에 없다.
이게 바로 리소스 낭비다.
리소스 낭비는 자연스레 트래픽 증가로 이어질 수 있다.
인터넷을 통해 주고받은 모~든 데이터를 말한다.
웹에서 우리가 어떤 행동을 하든 대부분은 트래픽을 유발한다.
[예시]
우리가 웹에서 무언가를 “요청하고 받는 순간”마다 트래픽이 발생한다.
[정의]
"인터넷 통신을 위해 쓰는 서버/클라이언트의 자원"이라고 보면 된다.
트래픽은 오가는 양이고, 리소스는 그걸 보내고 받기 위해 드는 힘이라고 생각하면 쉽다.
어떤 것들이 있을까?
리소스 | 의미 |
---|---|
소켓 연결 수 | 서버가 동시에 처리할 수 있는 연결 개수 (제한 있음!) |
대역폭 | 1초에 주고받을 수 있는 데이터 양 |
CPU 시간 | 데이터를 처리하는 데 걸리는 계산 시간 |
메모리 | 연결을 유지하거나 데이터를 잠깐 저장하는 공간 |
예를 들어, 사용자가 채팅 기능을 쓰지 않는데도 소켓을 연결하면?
좀 더 자세히 알아보자.
서버와 클라이언트는 도대제 어떤 자원을 쓰는걸까?
소켓 연결이 유지되려면 필요한 자원들을 예시로 들어보자.
리소스 | 설명 |
---|---|
파일 디스크립터 (FD) | 소켓 1개마다 서버는 FD 1개를 씁니다 (리눅스 기준 최대치 존재) |
메모리 | 연결마다 버퍼, 메시지 큐, 연결 상태 등 메모리 차지 |
CPU 처리 시간 | 연결 유지, 핑/퐁 처리, 이벤트 전파 등에 CPU 시간 소모 |
이벤트 루프 처리량 | 연결 수가 많아질수록 I/O 이벤트 처리량도 부담됨 |
네트워크 스레드 수 | 일부 서버 구조는 연결 수만큼 스레드/컨텍스트 필요 (멀티스레드 서버 등) |
예시로 살펴보자.
A 사용자가 채팅 기능을 쓰지도 않는데 백그라운드에서 소켓이 연결되어 있다면?
[서버]
ping/pong을 일정 주기로 주고받고,
연결 상태를 추적하고 (접속 중인지, 에러인지 등),
심지어 브로드캐스트 메시지를 보내고
메시지가 안 오더라도 “듣고 있는” 상태를 유지해야 해요.→ 즉, 아무 일도 안 해도, CPU + 메모리 + 연결 슬롯(FD)이 점점 소비된다.
개발자 입장에서 할 수 있는 건 생각보다 단순하다.
"네트워크 트래픽"과 "리소스"는 그냥 기술적인 용어가 아니다.
성능, 사용자 경험, 그리고 비용에 직접적인 영향을 주는 핵심 개념이다.
결국, 우리가 "불필요한 연결을 줄이자"는 건
단순히 돈을 아끼기 위한 게 아니라,
더 빠르고 안정적인 시스템을 만들기 위한 기본 원칙이었다.
성능 최적화를 위해서
지금 이 연결이 꼭 필요한지? 를 늘 생각해보자.
좋은 정보 감사합니다 ^^