시스템
시스템
섹션 제목: “시스템”메모리 사용량, 가비지 컬렉션 통계, 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 강제 실행
섹션 제목: “GC 강제 실행”가비지 컬렉션 강제 실행:
local ok, err = system.gc.collect()반환: boolean, error
GC 대상 비율
섹션 제목: “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”GOMAXPROCS 값 가져오기 또는 설정:
-- 현재 값 가져오기local current, err = system.runtime.max_procs()
-- 새 값 설정local prev, err = system.runtime.max_procs(4)| 파라미터 | 타입 | 설명 |
|---|---|---|
n | integer | 제공되면 GOMAXPROCS 설정 (0보다 커야 함) |
반환: number, error
CPU 수
섹션 제목: “CPU 수”논리 CPU 수 가져오기:
local cpus, err = system.runtime.cpu_count()반환: number, error
프로세스 ID
섹션 제목: “프로세스 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() -- 이 노드의 IDlocal 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 상태
섹션 제목: “Raft 상태”system.raft는 Raft 합의 코어에 대한 이 노드의 로컬 뷰를 읽습니다. 이 노드에서 Raft가 실행 중이 아니면 모든 함수가 nil, error(“raft not available”)를 반환합니다.
local leader, err = system.raft.is_leader() -- booleanlocal member, err = system.raft.is_member() -- boolean: voter 또는 standbylocal 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 | 아니오 |
에러 처리는 에러 처리를 참조하세요.