<div style="text-align: right; background-color: #f5f5f5; padding: 4px 12px; border-radius: 5px; display: inline-block; float: right; font-size: 1.4rem;">
Last Updated:2025/07/01
</div>
# 分配工作(Job)資源
[TOC]
<br>
在提交工作(Job)前,必須確保所指定的資源量(如 CPU、記憶體)不超過單一計算節點的最大可分配資源限制。
<font color="red">➤ 用戶可使用指令 `scontrol show node <node>` 查詢節點的最大資源限制</font>:
```
[user@ilgn01]$ sinfo -p visual
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
up 2-00:00:00 6 idle gpn[01-06]
# 查詢節點 gpn01,欄位 “CfgTRES” 即為最大可分配資源量
# 下面範例說明gpn01最大可分配量為:
# CPU 核心數為 112 (cpu=112)
# 記憶體為482582M (mem=482582M)
# GPU為2 (gres/gpu=2)
# 同一佇列下的計算節點(gpn[01-06]),最大可分配資源量通常都是相同的
[user@ilgn01]$ scontrol show node gpn01
NodeName=gpn01 Arch=x86_64 CoresPerSocket=56
…
CfgTRES=cpu=112,mem=482582M,billing=112,gres/gpu=2
…
```
<br>
---
<br>
## 正確提交範例
- **若未指定記憶體參數(如 `--mem`),系統預設會分配節點的最大可用記憶體。**
```
[user@ilgn01]$ salloc -A <PORJECT_ID> -p development -N 2 -c 112
salloc: Granted job allocation 7202
salloc: Waiting for resource configuration
salloc: Nodes icpnq[134-135] are ready for job
```
- **使用 `scontrol show job <job_id>` 查詢成功提交的工作與分配的資源。**
```
# NumNodes=2 : 分配2個計算節點
# NumCPUs=224: 總共分配224 CPU核心,等於每個節點分配112個CPU核心
# mem=965164M: 總共分配965164MiB記憶體,等於每個節點分配482582MiB
# NumTasks=2 : 若您沒有指定 task 相關的任何參數,則每個節點預設執行1個任務
# CPUs/Task=112: 每個任務使用112個 CPU 核心
[user@ilgn01 salloc_7202 ~]$ scontrol show job 7202
JobId=7202 JobName=interactive
…
NumNodes=2 NumCPUs=224 NumTasks=2 CPUs/Task=112 ReqB:S:C:T=0:0:*:*
TRES=cpu=224,mem=965164M,node=2,billing=224
…
```
<br>
---
<br>
## 常見錯誤範例
若您提交的工作,其指定的資源超過計算節點的最大可分配資源量,就會出現如下的錯誤,導致無法成功提交工作:
- **錯誤一:CPU 核心數超過單節點限制**
```
# 佇列 “development” 單一計算節點的CPU最大可分配資源量為112
# 若工作分配二台節點(-N 2),卻需要單節點 120個CPU Core(-c 120),提交就會失敗
# 若您沒指定記憶體相關參數(如 --mem),預設會分配計算節點的最大可用記憶體
[user@ilgn01]$ salloc -A <PORJECT_ID> -p development -N 2 -c 120
salloc: error: CPU count per node can not be satisfied
salloc: error: Job submit/allocate failed: Requested node configuration is not available
```
- **錯誤二:記憶體超出單節點限制**
```
# 佇列 “development” 單一計算節點的Memory最大可分配資源量為482582M
# 若工作分配二台節點(-N 2),要求單節點 112個CPU Core(-c 112)是正確的
# 但指定單節點500GiB記憶體(--mem=500G),提交一樣會失敗
[user@ilgn01]$ salloc -A <PORJECT_ID> -p development -N 2 -c 112 --mem=500G
salloc: error: Memory specification can not be satisfied
salloc: error: Job submit/allocate failed: Requested node configuration is not available
```
<br>
---
<br>
## 分配多任務進行平行計算
根據計算程式特性,可能需要於**單一節點分配多個任務(Task)進行平行計算**,才能充分利用運算資源並獲得最佳的運算效率。
- **平行計算任務範例:**
```
# 將分配2個節點,每個節點執行112個task,每個 task 用 1 CPU 執行程式
# 若您沒指定記憶體相關參數(如 --mem 或 --mem-per-cpu),預設會分配計算節點的最大可用記憶體
[user@ilgn01]$ salloc -A <PORJECT_ID> -p development -N 2 --ntasks-per-node=112
salloc: Granted job allocation 7203
salloc: Waiting for resource configuration
salloc: Nodes icpnq[134-135] are ready for job
```
- **查詢成功提交的工作狀態**
```
# NumNodes=2 : 分配2個計算節點
# NumCPUs=224 : 總共分配224 CPU核心,等於每個節點分配112個CPU核心
# mem=965164M : 總共分配965164MiB記憶體,等於每個節點分配482582MiB
# NumTasks=224: 每個節點執行112個任務
# CPUs/Task=1 : 每個任務使用1個 CPU 核心
[user@ilgn01 salloc_7203 ~]$ scontrol show job 7203
JobId=7203 JobName=interactive
…
NumNodes=2 NumCPUs=224 NumTasks=224 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=224,mem=965164M,node=2,billing=224
…
```
:::danger
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i> **注意:**
若 job script 未指定記憶體參數,系統將根據該 job 索取的 CPU 核心總數量去配置該 job 的最大可用記憶體。若執行過程中出現 OOM(Out of Memory)錯誤,請檢查程式是否需要索取更多記憶體。
- **X86 架構**:ct開頭Queue,每核心最多分配 **4308MB** 記憶體。
- **ARM 架構**:每核心最多分配 **1554MB** 記憶體。
:::