Skynet의 소켓 제한 기능 사용법

핵심 기능

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

작동 원리

  1. 버퍼 분리 제어: 입력/출력 버퍼 모두 제한되지만, 주로 입력 버퍼 관리에 집중
  2. 작동 메커니즘:
    • 입력 버퍼 크기가 제한치를 넘으면 socket.pause() 호출
    • 데이터 소비 후 socket.resume()로 읽기 재개
  3. 기본값: 제한 설정 없을 경우 기본 입력 버퍼 크기는 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)

태그: SkyNet Socket Programming Network Resource Management Buffer Control

6월 27일 04:13에 게시됨