Система

Получение информации о среде выполнения: использование памяти, статистика сборщика мусора, сведения о 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 Байт в простаивающих span
heap_in_use number Байт в активных span
heap_released number Байт возвращено ОС
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 ноды из relay-контекста
system.node.addr() string, error Рекламируемый адрес (например, 10.0.0.1:7946); ошибка если membership недоступен
system.node.role() string, error Raft-роль этой ноды; возвращает "non-member" (без ошибки) когда Raft не запущен

Разрешение: system.read на node.

Membership кластера

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 Ошибка если информация о membership недоступна
system.cluster.leader() string, error ID текущего лидера Raft; "" (без ошибки) когда лидер неизвестен или Raft отсутствует
system.cluster.size() number, error Количество видимых членов; 0 если информация о membership недоступна

Разрешение: system.read на cluster.

Состояние Raft

system.raft читает локальный вид ядра консенсуса Raft этой ноды. Каждая функция возвращает nil, error ("raft not available") когда Raft не запущен на этой ноде.

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 term
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 True если эта нода является voter или standby в зафиксированной конфигурации
system.raft.role() string, error "leader" / "voter" / "standby" / "non-member"
system.raft.term() number, error Текущий term; 0 если недоступен из статистики
system.raft.commit_index() number, error Наибольший зафиксированный индекс лога на этой ноде
system.raft.stats() table, error Полная сырая карта статистики; ключи и значения — строки

Разрешение: system.read на raft, за исключением system.raft.stats(), которая требует system.read на raft_stats.

Распределённые блокировки

system.lock обеспечивает кластерное взаимное исключение. Блокировка — это глобально уникальное имя, принадлежащее вызывающему процессу. Построена на области Strong, поэтому в кластере может существовать не более одного держателя, и блокировка автоматически освобождается при выходе держателя или уходе его ноды — зависших блокировок нет для очистки.

local ok, err = system.lock.acquire("orders.migration")
if ok then
  -- критическая секция: только один держатель в кластере
  system.lock.release("orders.migration")
end

Захват fail-fast: если блокировка уже занята, немедленно возвращает false, не блокируясь, поэтому вызывающие реализуют собственный retry и backoff. Только текущий держатель может освободить; освобождение блокировки, которой вы не владеете, — безопасная no-op.

Функция Возвращает Результаты
system.lock.acquire(name) boolean, error true, nil — захвачено; false, error — уже занято (kind errors.ALREADY_EXISTS); nil, error — при ошибке
system.lock.release(name) boolean, error true, nil — освобождено; false, nil — не занято или занято другим процессом; nil, error — при ошибке
Параметр Тип Описание
name string Кластерное имя блокировки

Разрешение: system.lock на name блокировки (политика может ограничивать, какие имена вызывающий может блокировать).

Разрешения

Системные операции подчиняются вычислению политики безопасности.

Действие Ресурс Описание
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 Чтение membership кластера и лидера
system.read raft Чтение состояния Raft
system.read raft_stats Чтение сырой карты статистики Raft
system.lock <имя блокировки> Захват или освобождение распределённой блокировки
system.exit - Инициировать завершение системы

Ошибки

Условие Kind Повторяемо
Доступ запрещён errors.INVALID нет
Некорректный аргумент errors.INVALID нет
Отсутствует обязательный аргумент errors.INVALID нет
Менеджер кода недоступен errors.INTERNAL нет
Информация о сервисе недоступна errors.INTERNAL нет
Ошибка ОС (hostname, cwd) errors.INTERNAL нет
Raft не запущен на этой ноде errors.INTERNAL нет
Membership недоступен errors.INTERNAL нет
Блокировка уже занята errors.ALREADY_EXISTS нет

См. Обработка ошибок для работы с ошибками.