Files
hakmem/CURRENT_TASK.md
Moe Charm (CI) bcfb4f6b59 Remove dead code: UltraHot, RingCache, FrontC23, Class5 Hotpath
(cherry-picked from 225b6fcc7, conflicts resolved)
2025-11-26 12:33:49 +09:00

114 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CURRENT TASK Performance Optimization Status
**Last Updated**: 2025-11-25
**Scope**: Random Mixed 16-1024B / Arena Allocator / Architecture Limit Analysis
---
## 🎯 現状サマリ
### ✅ Arena Allocator 実装完了 - mmap 95% 削減達成
| Metric | Before | After | Improvement |
|--------|--------|-------|-------------|
| mmap syscalls | 401 | 32 | -92% |
| munmap syscalls | 378 | 3 | -99% |
| Performance (10M) | ~60M ops/s | **68-70M ops/s** | +15% |
### 現在の性能比較 (10M iterations)
```
System malloc: 93M ops/s (baseline)
HAKMEM: 68-70M ops/s (73-76% of system malloc)
Gap: ~25% (構造的オーバーヘッド)
```
---
## 🔬 Phase 27 調査結果: アーキテクチャ限界の確認
### 試した最適化(すべて失敗)
| 最適化案 | 結果 | 効果 |
|---------|------|------|
| C5 TLS容量 2倍 (1024→2048) | 68-69M | 変化なし |
| Registry lookup削除 | 68-70M | 変化なし |
| Ultra SLIM 4-layer | ~69M | 変化なし |
| **Phase 27-A: Ultra-Inline (全size)** | **56-61M** | **-15% 悪化** ❌ |
| **Phase 27-B: Ultra-Inline (9-512B)** | **61-62M** | **-10% 悪化** ❌ |
### Phase 27 失敗の原因
- Workload の ~52% が headerless classes (cls 0: 1-8B, cls 7: 513-1024B)
- Headerless クラスをフィルタする条件分岐自体が overhead
- Classes 1-6 からの利益 < 条件分岐の overhead
### 残り 25% ギャップの原因(構造的オーバーヘッド)
1. **Header byte オーバーヘッド** - alloc/free 1 バイト書き込み/読み込み
2. **TLS SLL カウンタ** - 毎回 count++ / count-- (vs tcache: pointer のみ)
3. **多層分岐** - 4-5層 dispatch (vs tcache: 2-3層)
### 結論
**68-70M ops/s が現アーキテクチャの実質的な限界**。System malloc 93M ops/s に到達するには:
- Header-free design への全面的な見直し
- tcache 模倣カウンタ削除分岐削減
が必要だが現時点では投資対効果が低い
---
## 📁 主要な修正ファイルArena Allocator 実装)
- `core/box/ss_cache_box.inc:138-229` - SSArena allocator 追加
- `core/box/tls_sll_box.h:509-561` - Release mode recycle check オプショナル化
- `core/tiny_free_fast_v2.inc.h:113-148` - Release mode cross-check 削除
- `core/hakmem_tiny_sll_cap_box.inc:8-25` - C5 容量を full capacity に変更
- `core/hakmem_policy.c:24-30` - min_keep tuning
- `core/tiny_alloc_fast_sfc.inc.h:18-26` - SFC defaults tuning
---
## 🗃 過去の問題と解決(参考)
### Arena Allocator 以前の状態
- **Random Mixed (5M ops)**: ~56-60M ops/s, **mmap 418回** (mimalloc 26倍)
- **根本原因**: SuperSlab = allocation単位 = cache単位 という設計ミスマッチ
- **問題**: ws=256 では Slab 5-15% 使用率で停滞 完全 EMPTY にならない LRU キャッシュ不発 毎回 mmap/munmap
### Arena Allocator による解決
- SuperSlab OS 単位として扱う Arena allocator 実装
- mmap 418回 32回 (-92%)、munmap 378回 3回 (-99%)
- 性能 60M 68-70M ops/s (+15%)
---
## 📊 他アロケータとのアーキテクチャ対応(参考)
| HAKMEM | mimalloc | tcmalloc | jemalloc |
|--------|----------|----------|----------|
| SuperSlab (2MB) | Segment (~2MiB) | PageHeap | Extent |
| Slab (64KB) | Page (~64KiB) | Span | Run/slab |
| per-class freelist | pages_queue | Central freelist | bin/slab lists |
| Arena allocator | segment cache | PageHeap | extent_avail |
---
## 🚀 将来の可能性(長期)
### Slab-level EMPTY Recycling未実装
- **Goal**: Slab cross-class で再利用可能にする
- **設計**: EMPTY slab lock-free stack で管理alloc 時に class_idx を動的割り当て
- **期待効果**: メモリ効率向上ただし性能向上は限定的
### Abandoned SuperSlabMT 用、未実装)
- **Goal**: スレッド終了後のメモリを他スレッドから reclaim
- **設計**: mimalloc abandoned segments 相当
- **実装タイミング**: MT ワークロードで必要になってから
---
## ✅ 完成したマイルストーン
1. **Arena Allocator 実装** - mmap 95% 削減達成
2. **Phase 27 調査** - アーキテクチャ限界の確認
3. **性能 68-70M ops/s** - System malloc 73-76% に到達
**現在の推奨**: 68-70M ops/s baseline として受け入れ他のワークロードMid-Large, Larson の最適化に注力する