시스템

메모리 사용량, 가비지 컬렉션 통계, CPU 세부 정보, 프로세스 메타데이터를 포함한 런타임 시스템 정보를 조회합니다.

로딩

local system = require("system")

셧다운

종료 코드와 함께 시스템 셧다운 트리거. 터미널 앱에 유용합니다; 실행 중인 액터에서 호출하면 전체 시스템이 종료됩니다:

local ok, err = system.exit(0)
파라미터 타입 설명
code integer 종료 코드 (0 = 성공), 기본값 0

반환: boolean, error

모듈 목록 조회

메타데이터와 함께 로드된 모든 Lua 모듈 가져오기:

local mods, err = system.modules()

반환: table[], error

각 모듈 테이블에는 다음이 포함됩니다:

필드 타입 설명
name string 모듈 이름
description string 모듈 설명
class string[] 모듈 분류 태그

메모리 통계

상세 메모리 통계 가져오기:

local stats, err = system.memory.stats()

반환: table, error

통계 테이블 내용:

필드 타입 설명
alloc number 할당되고 사용 중인 바이트
total_alloc number 누적 할당 바이트
sys number 시스템에서 얻은 바이트
heap_alloc number 힙에 할당된 바이트
heap_sys number 시스템에서 힙을 위해 얻은 바이트
heap_idle number 유휴 스팬의 바이트
heap_in_use number 비유휴 스팬의 바이트
heap_released number OS에 반환된 바이트
heap_objects number 할당된 힙 객체 수
stack_in_use number 스택 할당자가 사용하는 바이트
stack_sys number 시스템에서 스택을 위해 얻은 바이트
mspan_in_use number 사용 중인 mspan 구조체의 바이트
mspan_sys number 시스템에서 mspan을 위해 얻은 바이트
num_gc number 완료된 GC 사이클 수
next_gc number 다음 GC를 위한 대상 힙 크기

현재 할당량

현재 할당된 바이트 가져오기:

local bytes, err = system.memory.allocated()

반환: number, error

힙 객체

할당된 힙 객체 수 가져오기:

local count, err = system.memory.heap_objects()

반환: number, error

메모리 제한

메모리 제한 설정 (이전 값 반환):

local prev, err = system.memory.set_limit(1024 * 1024 * 100)
파라미터 타입 설명
limit integer 바이트 단위 메모리 제한, -1은 무제한

반환: number, error

현재 메모리 제한 가져오기:

local limit, err = system.memory.get_limit()

반환: number, error

GC 강제 실행

가비지 컬렉션 강제 실행:

local ok, err = system.gc.collect()

반환: boolean, error

GC 대상 비율

GC 대상 비율 설정 (이전 값 반환). 값 100은 힙이 두 배가 될 때 GC가 트리거됨을 의미합니다:

local prev, err = system.gc.set_percent(200)
파라미터 타입 설명
percent integer GC 대상 비율

반환: number, error

현재 GC 대상 비율 가져오기:

local percent, err = system.gc.get_percent()

반환: number, error

고루틴 수

활성 고루틴 수 가져오기:

local count, err = system.runtime.goroutines()

반환: number, error

GOMAXPROCS

GOMAXPROCS 값 가져오기 또는 설정:

-- 현재 값 가져오기
local current, err = system.runtime.max_procs()

-- 새 값 설정
local prev, err = system.runtime.max_procs(4)
파라미터 타입 설명
n integer 제공되면 GOMAXPROCS 설정 (0보다 커야 함)

반환: number, error

CPU 수

논리 CPU 수 가져오기:

local cpus, err = system.runtime.cpu_count()

반환: number, error

프로세스 ID

현재 프로세스 ID 가져오기:

local pid, err = system.process.pid()

반환: number, error

호스트명

시스템 호스트명 가져오기:

local hostname, err = system.process.hostname()

반환: string, error

작업 디렉토리

런타임의 현재 작업 디렉토리 가져오기:

local dir, err = system.process.cwd()

반환: string, error

프로세스 호스트

워커 및 큐 통계와 함께 모든 프로세스 호스트 목록 조회:

local hosts, err = system.hosts.list()

반환: table[], error

각 호스트 테이블 내용:

필드 타입 설명
id string 호스트 레지스트리 ID
workers number 워커 풀 크기
processes number 이 호스트의 활성 프로세스
executed number 총 실행된 스텝
stolen number 다른 호스트에서 훔쳐온 스텝
queue_depth number 호스트 큐의 대기 항목

특정 호스트에서 실행 중인 프로세스 목록 조회:

local procs, err = system.hosts.processes("app:host")
파라미터 타입 설명
host_id string 호스트 레지스트리 ID

반환: table[], error

각 프로세스 테이블 내용:

필드 타입 설명
pid string 프로세스 ID
host string 호스트 ID
source string 소스 엔트리 ID
state string 프로세스 상태
steps number 실행된 스텝
started_at number 시작 타임스탬프 (나노초)
parent string 부모 PID (없으면 생략)
actor_id string 액터 ID (없으면 생략)
stats table 프로세스별 통계 (선택적)

서비스 상태

특정 감독된 서비스의 상태 가져오기:

local state, err = system.supervisor.state("namespace:service")
파라미터 타입 설명
service_id string 서비스 ID (예: "namespace:service")

반환: table, error

상태 테이블 내용:

필드 타입 설명
id string 서비스 ID
status string 현재 상태
desired string 원하는 상태
retry_count number 재시도 횟수
last_update number 마지막 업데이트 타임스탬프 (나노초)
started_at number 시작 타임스탬프 (나노초)
details string 선택적 세부 정보 (포맷됨)

모든 서비스 상태

모든 감독된 서비스의 상태 가져오기:

local states, err = system.supervisor.states()

반환: table[], error

각 상태 테이블은 system.supervisor.state()와 같은 형식입니다.

클러스터 프리미티브

system.node, system.cluster, system.raft, system.lock 서브 테이블은 클러스터링 레이어를 노출합니다. 클러스터링이 활성화된 경우에 가장 유용합니다; 독립 노드에서는 예측 가능하게 저하됩니다 — system.raft.*는 "raft not available"을 보고하고, system.cluster는 로컬 노드만 보고하며, system.lock은 클러스터링이 제공하는 글로벌 레지스트리가 필요합니다.

모든 읽기 호출은 로컬이고 저렴합니다: 커밋된 상태에 대한 이 노드의 뷰를 보고하며, 네트워크를 차단하지 않습니다.

노드 정체성

system.node는 클러스터에서 이 노드 자체의 정체성을 보고합니다.

local id, err = system.node.id()      -- 이 노드의 ID
local addr, err = system.node.addr()  -- 광고된 네트워크 주소
local role, err = system.node.role()  -- "leader" | "voter" | "standby" | "non-member"
함수 반환 비고
system.node.id() string, error 릴레이 컨텍스트의 노드 ID
system.node.addr() string, error 광고된 주소 (예: 10.0.0.1:7946); 멤버십을 사용할 수 없으면 오류
system.node.role() string, error 이 노드의 Raft 역할; Raft가 실행 중이 아니면 오류 없이 "non-member" 반환

권한: node에 대한 system.read.

클러스터 멤버십

system.cluster는 클러스터 전체 뷰를 보고합니다: 멤버가 누구이고 누가 리더인지.

local members, err = system.cluster.members()  -- 노드 테이블 배열
local leader, err = system.cluster.leader()    -- 리더 노드 ID, 또는 알 수 없으면 ""
local n, err = system.cluster.size()           -- 보이는 멤버 수

system.cluster.members()는 노드 테이블 배열을 반환합니다. 로컬 노드가 한 번 포함되고 먼저 정렬됩니다.

필드 타입 설명
id string 노드 ID
is_local boolean 호출 노드의 경우 true
addr string 광고된 주소 (알 수 없으면 생략)
meta table 문자열-문자열 gossip 메타데이터 (없으면 생략)
함수 반환 비고
system.cluster.members() table[], error 멤버십 정보에 도달할 수 없으면 오류
system.cluster.leader() string, error 현재 Raft 리더의 ID; 리더를 알 수 없거나 Raft가 없으면 "" (오류 없음)
system.cluster.size() number, error 보이는 멤버 수; 멤버십 정보 없으면 0

권한: cluster에 대한 system.read.

Raft 상태

system.raft는 Raft 합의 코어에 대한 이 노드의 로컬 뷰를 읽습니다. 이 노드에서 Raft가 실행 중이 아니면 모든 함수가 nil, error("raft not available")를 반환합니다.

local leader, err = system.raft.is_leader()      -- boolean
local member, err = system.raft.is_member()      -- boolean: voter 또는 standby
local role, err = system.raft.role()             -- system.node.role()과 같은 값
local term, err = system.raft.term()             -- 현재 Raft 텀
local idx, err = system.raft.commit_index()      -- 가장 높은 커밋된 로그 인덱스
local stats, err = system.raft.stats()           -- 원시 통계 맵 (string -> string)
함수 반환 비고
system.raft.is_leader() boolean, error 이 노드가 현재 리더이면 true
system.raft.is_member() boolean, error 이 노드가 커밋된 구성에서 voter 또는 standby이면 true
system.raft.role() string, error "leader" / "voter" / "standby" / "non-member"
system.raft.term() number, error 현재 텀; 통계에서 사용할 수 없으면 0
system.raft.commit_index() number, error 이 노드의 가장 높은 커밋된 로그 인덱스
system.raft.stats() table, error 전체 원시 통계 맵; 키와 값은 문자열

권한: raft에 대한 system.read, system.raft.stats()raft_stats에 대한 system.read 필요.

분산 잠금

system.lock은 클러스터 전체 상호 배제를 제공합니다. 잠금은 호출 프로세스가 소유한 전역 고유 이름입니다. Strong 이름 범위 위에 구축되어 클러스터 전체에 최대 하나의 보유자만 존재할 수 있으며, 보유자 프로세스가 종료되거나 해당 노드가 떠나면 잠금이 자동으로 해제됩니다 — 정리할 고착된 잠금이 없습니다.

local ok, err = system.lock.acquire("orders.migration")
if ok then
  -- critical section: only one holder cluster-wide
  system.lock.release("orders.migration")
end

획득은 실패-즉시 방식입니다: 잠금이 이미 보유 중이면 차단하는 대신 즉시 false를 반환하므로 호출자가 자체 재시도와 백오프를 구현합니다. 현재 보유자만 해제할 수 있습니다; 보유하지 않은 잠금을 해제하는 것은 안전한 no-op입니다.

함수 반환 결과
system.lock.acquire(name) boolean, error true, nil 획득됨; false, error 이미 보유됨 (종류 errors.ALREADY_EXISTS); nil, error 실패 시
system.lock.release(name) boolean, error true, nil 해제됨; false, nil 보유하지 않거나 다른 프로세스가 보유; nil, error 실패 시
파라미터 타입 설명
name string 클러스터 전체 잠금 이름

권한: 잠금 name에 대한 system.lock (따라서 정책이 호출자가 잠글 수 있는 이름을 제한할 수 있음).

권한

시스템 작업은 보안 정책 평가 대상입니다.

액션 리소스 설명
system.read memory 메모리 통계 읽기
system.read memory_limit 메모리 제한 읽기
system.control memory_limit 메모리 제한 설정
system.read gc_percent GC 비율 읽기
system.gc gc 가비지 컬렉션 강제 실행
system.gc gc_percent GC 비율 설정
system.read goroutines 고루틴 수 읽기
system.read gomaxprocs GOMAXPROCS 읽기
system.control gomaxprocs GOMAXPROCS 설정
system.read cpu CPU 수 읽기
system.read pid 프로세스 ID 읽기
system.read hostname 호스트명 읽기
system.read cwd 작업 디렉토리 읽기
system.read hosts 호스트 / 호스트 프로세스 목록 조회
system.read modules 로드된 모듈 목록 조회
system.read supervisor 슈퍼바이저 상태 읽기
system.read node 이 노드의 정체성 읽기
system.read cluster 클러스터 멤버십 및 리더 읽기
system.read raft Raft 상태 읽기
system.read raft_stats 원시 Raft 통계 맵 읽기
system.lock <잠금 이름> 분산 잠금 획득 또는 해제
system.exit - 시스템 셧다운 트리거

에러

조건 종류 재시도 가능
권한 거부됨 errors.INVALID 아니오
잘못된 인수 errors.INVALID 아니오
필수 인수 누락 errors.INVALID 아니오
코드 매니저 사용 불가 errors.INTERNAL 아니오
서비스 정보 사용 불가 errors.INTERNAL 아니오
OS 오류 (호스트명, cwd) errors.INTERNAL 아니오
이 노드에서 Raft 미실행 errors.INTERNAL 아니오
멤버십 사용 불가 errors.INTERNAL 아니오
잠금 이미 보유됨 errors.ALREADY_EXISTS 아니오

에러 처리는 에러 처리를 참조하세요.