핵심 기능
Skynet 프레임워크의 skynet.socket.limit 메서드는 네트워크 통신 시 소켓의 입력/출력 버퍼 크기를 제어하여 메모리 사용량을 최적화합니다. 이 기능은 고가용성 환경에서 전송 데이터의 양을 제한해 서비스 장애를 예방하며, 특히 대규모 동시 접속 시 메모리 누수를 방지하는 데 효과적입니다.
주요 역할
- 메모리 보호: 특정 연결이 과도한 데이터를 전송해 메모리 부족을 유발하는 경우를 차단
- 통계량 조절: 입력 버퍼 크기에 따라 읽기 작업을 일시 중단해 네트워크 스트레스를 분산
- 서비스 안정성: 단일 연결의 처리 지연이 전체 시스템에 영향을 주는 문제를 방지
사용 방법
-- 소켓 버퍼 제한 설정
skynet.socket.limit(fd, limit)
파라미터:
- fd: skynet.socket.listen 또는 skynet.socket.connect로 생성된 파일 디스크립터
- limit: 제한 크기(바이트 단위), 초과 시 읽기 작업 일시 중단
사례별 적용
1. 대용량 패킷 대응
local skynet = require "skynet"
skynet.start(function()
local listen_fd = skynet.socket.listen("0.0.0.0", 8888)
skynet.socket.start(listen_fd, function(conn_fd, addr)
-- 입력 버퍼 제한 1MB 설정
skynet.socket.limit(conn_fd, 1024 * 1024)
skynet.socket.start(conn_fd, function(data, sz)
-- 데이터 처리 로직
end)
end)
end)
2. 동적 제한 조절
local function handle_data(conn_fd, data)
if string.find(data, "PRIORITY") then
skynet.socket.limit(conn_fd, 2 * 1024 * 1024) -- 2MB 제한
else
skynet.socket.limit(conn_fd, 512 * 1024) -- 512KB 제한
end
end
작동 원리
- 버퍼 분리 제어: 입력/출력 버퍼 모두 제한되지만, 주로 입력 버퍼 관리에 집중
- 작동 메커니즘:
- 입력 버퍼 크기가 제한치를 넘으면
socket.pause()호출 - 데이터 소비 후
socket.resume()로 읽기 재개
- 입력 버퍼 크기가 제한치를 넘으면
- 기본값: 제한 설정 없을 경우 기본 입력 버퍼 크기는 8MB
주의 사항
- 단위 정확성: 바이트 단위로 계산해야 하며, 1MB = 1048576 바이트
- 생애 주기: 연결 종료 시 자동 해제되므로 초기 설정이 중요
- 상호 연동:
skynet.socket.write와 함께 사용해 세부 제어 가능 - 모니터링:
skynet.socket.info로 현재 버퍼 상태 확인 가능
실제 예제
local skynet = require "skynet"
skynet.start(function()
local listen_fd = skynet.socket.listen("0.0.0.0", 8888)
skynet.socket.start(listen_fd, function(conn_fd, addr)
skynet.socket.limit(conn_fd, 1024 * 1024) -- 1MB 제한
skynet.socket.start(conn_fd, function(data, sz)
skynet.socket.write(conn_fd, data)
end)
skynet.socket.close(conn_fd)
end)
end)