# Linux SLUB 配置器的 Per-CPU Freelist 設計與多核效能分析
contributed by <`davidzwei`>
> 課程 quiz3 的兩道題目提供了切入點。calculate_order() 裡的 roundup_pow_of_two() 是 SLUB 決定 slab 頁面數的核心計算;
> 想要研究:
SLUB 如何在 allocation 速度、記憶體碎片率、以及多核競爭之間取得平衡?
## 先備知識
https://hackmd.io/@sysprog/linux-memory
https://hackmd.io/@sysprog/linux-slab
https://fosdem.org/2026/schedule/event/DPXVYJ-slub-sheaves-update/
[mm/slub.c](https://github.com/torvalds/linux/blob/master/mm/slub.c)
<!-- ## slub 歷史演化
- SLUB(2007)
- ...
- SLAB 移除(6.8)→ 只剩 SLUB
- 2026 SLUB percpu sheaves(6.18) -->
## 相關研究整理
### cmpxchg 路徑的原始碼追蹤
- `mm/slub.c → slab_alloc_node() → __slab_alloc() → ___slab_alloc()`
- `this_cpu_cmpxchg_double` 在哪裡,保護什麼
### SLUB Fast Path 與 Slow Path 機制分析
Linux Kernel v6.17
`void *__slab_alloc_node` 會決定 slowpath, fastpath
- [ ] fastpath:
- fastpath 發生條件
- this_cpu_cmpxchg_double
- tid 的用途
- [ ] slowpath:
當 fastpath 條件不滿足,會走向 slowpath
```c
if (!USE_LOCKLESS_FAST_PATH() ||
unlikely(!object || !slab || !node_match(slab, node))) {
object = __slab_alloc(s, gfpflags, node, addr, c, orig_size);
}
```
- 發生 slow path 條件:
- 與數學模型的對應:
- 透過實驗檢查是否符合
### lab, quiz 延伸問題
- `is_power_of_2` 在 SLUB order 計算的角色
`mm/slub.c` → `calculate_sizes()` → `get_order()`
- 連結 quiz3 Problem F
- 1. 原始碼追蹤:`calculate_sizes() → get_order() → roundup_pow_of_two()`
- 2. 觀察:/sys/kernel/slab/*/order 的實際數值,印證碎片率分析
- N 核 coherence traffic 數學模型
- 直接引用 warmup spinlock 教材的公式框架,套用到 freelist
### SLUB maintainer Vlastimil Babka 在 FOSDEM 2026 提出了「SLUB percpu sheaves」的新設計
動機正是現有 SLUB 的 per-CPU freelist 在某些情境下不夠有效率,目標是改善 bulk allocation 和 cmpxchg 操作的效能。
- 概念
- 原始碼追蹤
- trylock 用途
## 開發環境
```sh
$ gcc --version
gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 39 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 12
On-line CPU(s) list: 0-11
Vendor ID: GenuineIntel
Model name: 12th Gen Intel(R) Core(TM) i5-12400
CPU family: 6
Model: 151
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 1
Stepping: 2
CPU(s) scaling MHz: 11%
CPU max MHz: 5600.0000
CPU min MHz: 800.0000
BogoMIPS: 4992.00
$ uname -r
6.17.0-20-generic
```
tools
```sh
$ sudo bpftool prog list 2>&1 | head -3
58: cgroup_device name s_snapd_desktop tag 03b4eaae2f14641a gpl
loaded_at 2026-04-18T20:16:18+0800 uid 1000
xlated 296B jited 164B memlock 4096B map_ids 1
$ sudo perf stat ls 2>&1 | tail -5
0.000000000 seconds user
0.002412000 seconds sys
```
## 實驗
<!-- - freelist 滿溢觸發 partial list 遷移時的 cmpxchg 路徑,與 spinlock 的對比
- 用 perf 量化 kmalloc 在不同 allocation size 下的 L1/L2 miss rate
- quiz3 Problem F(is_power_of_2、SLUB order 計算)、warmup 的 cache coherence spinlock -->
- 改變三個變數,觀察 SLUB fast/slow path 的比例如何變化:
* 變數一:object size → 決定走哪個 size class
* 變數二:lifetime → 決定 freelist 的回收頻率
* 變數三:thread 數 → 決定 per-CPU 的競爭程度
* 方法
* eBPF kprobe `___slab_alloc` 紀錄 slow path 比例變化
- 升級到 kernel 6.18,啟用 sheaves 用同樣的 workload 重跑
- 比較差異 vs kernel 6.17
## 研究問題
本研究要回答三個問題:
- Q1. per-CPU freelist 在幾個執行緒之後 slow path 比例開始
非線性上升?
- object size × lifetime × thread 數
- 觀察與記錄問題
<!-- (object size × thread 數的退化矩陣) -->
<!-- - Q2. object size 和 lifetime 如何影響 freelist 的有效性? -->
- Q2. kernel 6.18 的 sheaves 機制在相同 workload 下,
slow path 比例改善了多少?
- 觀察與紀錄問題
## References
- [2026 fosdem](https://fosdem.org/2026/schedule/event/DPXVYJ-slub-sheaves-update/)
- [mm/slub.c](https://github.com/torvalds/linux/blob/master/mm/slub.c)