# 資源上限

每次執行函式時，HakoRun 從 CPU、記憶體、請求大小與時間四個面向設限。

## 上限一覽

| 上限 | 預設 | 設定 | 超過時 | 平台 |
|------|------|------|--------|------|
| CPU | 1 核（`CPUQuota=100%`） | `MAX_CPUS` | 被 cgroup 節流 | Linux |
| 記憶體 | `128M`，swap 0 | `MAX_MEMORY` | 被 cgroup OOM 終止 | Linux |
| 請求 body | 256 KiB | `CODE_MAX_SIZE` | HTTP 400 | 全部 |
| 執行時間 | 30 秒 + 5 秒 | `TIMEOUT_SCRIPT` | 終止行程；非串流回 500，串流送 `error` | 全部 |

## systemd Slice

啟動時 `sandbox.NewSlice()` 寫入 `~/.config/systemd/user/hakorun.slice`，再執行 `systemctl --user daemon-reload` 與 `start`：

```ini
[Unit]
Description=FaaS Sandbox

[Slice]
CPUQuota=100%
MemoryMax=128M
MemorySwapMax=0
```

每個沙箱行程以 `systemd-run --scope --slice=hakorun.slice` 加入此 slice，因此上限是**所有同時執行的函式共用**，不是每個函式各自一份。建立 slice 失敗只記錄警告，服務仍會啟動，此時沒有 CPU／記憶體上限。

## 時間與大小

- 逾時：`TIMEOUT_SCRIPT` 秒數加 5 秒緩衝作為 context 截止時間；串流模式在客戶端斷線時也會立即終止行程。
- 請求大小：`http.MaxBytesReader` 套用在 `/run` 與 `/run-now` 的 body；`/upload` 不受此限。

## 相關頁面

- [沙箱](/zh/sandbox)
- [設定](/zh/configuration)
