# Android/Linux 内核内存管理调研——阶段性发现（停止点汇报）

> ⚠️ 勘误（2026-09-16，主分析会话复核后追加）：
> 1. §2 中"min_ttl_ms 经 compare API 确认首次出现于 v6.3"**有误**——7b8144e63d84 是文档提交（改动 Documentation/mm/multigen_lru.rst +15 行与 mm/vmscan.c +4 行注释），min_ttl_ms sysfs 接口在 **6.1 已存在**（skill 存档 linux-6.1_mm_vmscan.c:5381 `__ATTR(min_ttl_ms, …)` 为证）；
> 2. §8 中"memory.reclaim 合入版本未能在线确认 [记忆: 6.1]"——**已核验确认 v6.1**：torvalds/linux v6.1 mm/memcontrol.c:6583 存在 `static ssize_t memory_reclaim(...)` 完整实现（无 swappiness 选项；swappiness 选项 6.12 在位、更早版本未查）。
> 本文件其余内容维持原样；两处修正已同步进主文档《xnu-vs-linux-mem-optimization.md》附录 B。

> 调研时间：2026-09-16（UTC）。原目标为「截至 2026 年初」的现状报告；本文以当时实际可核验的数据为准。
> 调研方法说明见文末。标注约定：**[确认]** = 本次在线核验过一手来源；**[记忆]** = 我的既有知识，未能在线验证；**未完成** = 无结论。

## 工具情况

- **web_search 工具：报错，不可用。** 两次调用均返回：`Error: DeepSeek search has no API key for "DEEPSEEK_API_KEY"; store it through the credentials service (the web Models page writes it), export it in the launching environment, or set a literal "apiKey" in the web-search-deepseek config`。
- **替代方法**：用 curl 直连一手来源。可达并实际使用：
  - `kernel.org` 全家：`releases.json`、`docs.kernel.org`（文档）、`git.kernel.org`（可达，但 gitweb 全库 log grep 会服务端超时，基本不可用）
  - `source.android.google.cn`（source.android.com 的中国镜像，部分页面可达）——Android 官方文档主要来源
  - `developer.android.google.cn`（developer.android.com 镜像）
  - `api.github.com` + `raw.githubusercontent.com`（torvalds/linux 镜像：commit 搜索 API、按文件提交历史 API、compare API 判定「哪个 tag 首次包含某提交」）
  - `kernelnewbies.org`（每版本特性页 Linux_6.X，条目带提交链接）
  - `lwn.net`（站点可达；搜索页可用但对 zram 等查询返回 0 结果，未产出引用）
- **不可达**：`lore.kernel.org`、`patchwork.kernel.org`（均被 Anubis 反爬挑战拦截，拿不到补丁讨论）；`source.android.com`、`android.googlesource.com` 本体（超时）→ **AOSP/GKI 源码、lmkd 源码、Pixel 内核 config 无法访问**；`web.archive.org`、`phoronix.com`、`spinics.net`、`yhbt.net`、github.com 网页版（仅 API 可用）均不可达。

## 1. 内核版本现状 [确认]

- 主线现状（kernel.org `releases.json`，2026-09-14 快照）：mainline = **7.3-rc3**（2026-09-13），stable = 7.2.6，7.1 已 EOL。即 2026 年中版本号已切换为 7.x；「2026 年初」时点对应 **6.18**（2025-11 末发布）与 **6.19**（2026 年初）。6.18 为 2025 LTS、6.12 为 2024 LTS 属 [记忆]（未逐一核验 longterm 列表）。
- Android GKI 分支（source.android.google.cn 内核文档树，确认存在对应 release build 页）：android12-5.10、android13-5.10/5.15、android14-5.15/6.1、**android15-6.6（Android 15, 2024）**、**android16-6.12（Android 16, 2025）**、**android17-6.18（Android 17）**。
- android-common 文档：Android 15 起每个 LTS 只出一个新 GKI；设备发布只能用最近两个内核版本（Android 15 launch kernels = android15-6.6 + android14-6.1）。另注：自 2026 年起 AOSP 源码改为每年 Q2/Q4 两次发布。

## 2. MGLRU [部分确认]

- 合入 6.1：找到系列提交 `mm: multi-gen LRU: groundwork`（ec1c86b25f46，2022-09-26，即 6.1 merge window）[版本归属由日期推断，未跑 compare 验证]。
- min_ttl_ms / 工作集保护：提交 7b8144e63d84 `mm: multi-gen LRU: section for working set protection`（2023-02-02），**经 GitHub compare API 确认首次出现于 v6.3**。
- `docs.kernel.org/admin-guide/mm/multigen_lru.html` 确认语义：min_ttl_ms 保护 N 毫秒工作集不被驱逐、保不住则触发 OOM killer；建议 N=1000（基于 ~100ms 人类可感延迟）；`lru_gen/enabled` 开关 + `CONFIG_LRU_GEN_ENABLED`；另有 lru_gen 主动回收接口（evict ≤ min_gen_nr 的 generation）与工作集直方图。
- **Android 是否默认启用：未能确认**（android.googlesource.com 不可达，查不到 GKI defconfig / Pixel config；Android 官方文档全篇未提 MGLRU）。[记忆：Pixel 8 起（Android 14）启用 MGLRU；android15-6.6+ 的 GKI 开了 CONFIG_LRU_GEN——均未在线验证。] 与老 LRU 的性能对比数据：未完成。

## 3. zram / zswap [大部分确认]

- **zram recompression：确认合入 v6.2**（84b33bf78889 `zram: introduce recompress sysfs knob` 等 Sergey Senozhatsky 系列，compare API 确认 v6.2；kernelnewbies 6.2 页对应条目 "zram: Support multiple compression streams"）。
- 重要后续：**chained recompression 已被移除**（cedfa028b54e `zram: remove chained recompression`，2026-04-05，晚于 v6.18，按提交日期在 ~7.0 merge window）[最终版本号未跑 compare 确认]。
- zram writeback 演进（已拉取 zram_drv.c 全量提交史 2022-04~2026-08，200 条）：incompressible writeback（b46f9ea3cb35，2022-11，6.2 窗口）；writeback/recompress target selection rework（3f909a60cec1 / 330edc2bc059，2024-11，~6.13）；recompression loop rework（b0624f0b2234，2025-03，~6.15）；modernize writeback interface（cf42d4cccf0d，2025-05，~6.16）；writeback bio batching（f405066a1f0d，2025-11）；**compressed data writeback 新模式**（d38fab605c66 + `writeback_compressed` attr，2026-01）。
- **zram 大 folio（multi-page folio）支持：截至 2026-08 尚未合入主线。** 我核对了 torvalds 树 `drivers/block/zram/zram_drv.c` 的全部 200 个提交（2022-04~2026-08），无任何 large folio 提交；2026-06 的 mm-stable merge 里也只有 "zram: writeback fixes"。原问题「在哪个版本合入」的前提不成立。[记忆：Barry Song 等发过 RFC 系列 `zram: support large folios` 带性能数据，一直未落地；最新状态未在线确认。]
- 相邻能力：**zswap 的 large folio swap-out 在 6.13 合入**（kernelnewbies 6.13 页条目 "zswap swap-out of large folios"）；large folio swap-in（同步 IO 设备）提交 242d12c98174（2024-09-17，按日期为 6.12 窗口 [版本未 compare 确认]）。
- zsmalloc：6.15 有 `zsmalloc/zram: there be preemption` 系列（kernelnewbies 条目）；2026-08 还有 f7bf5cd5b5f2 `zsmalloc: account for handle size in class lookup`。
- Android 侧生产使用见第 11 项 mmd：Android 17 已在用 recompression + writeback + per-process writeback。

## 4. lmkd [确认，材料丰富]

- 官方文档 source.android.google.cn/docs/core/perf/lmkd（最后更新 2025-03-26）：内核 lowmemorykiller 驱动自上游 **4.12 起移除**；用户态 lmkd 在检测不到内核 LMK 驱动时激活（Android 9+），内核要求 `CONFIG_ANDROID_LOW_MEMORY_KILLER=n`、`CONFIG_MEMCG=y`、`CONFIG_MEMCG_SWAP=y`。
- 迁移原因（文档原文归纳）：阈值硬编码、不随内存压力扩缩、伙伴厂商各自魔改、挂在 slab shrinker API 上做「搜目标+杀进程」的重活拖慢 vmscan、活跃 page cache 工作负载下表现差（只抖不杀）。
- Android 10+：PSI monitor 模式（`ro.lmk.use_psi` 默认 true，`CONFIG_PSI=y`；相对 vmpressure 误报少、过滤开销小）。Android 11：新 kill 策略参数：`ro.lmk.psi_partial_stall_ms`（高性能 70 / 低内存 200）、`psi_complete_stall_ms`（700）、`thrashing_limit`（100/30）、`swap_util_max`、`swap_free_low_percentage`（20/10）；要求内核 PIDFD 支持；`ro.lmk.use_minfree_levels` 可退回旧阈值模式；`ro.config.low_ram` 区分高低端策略。
- Android 14/15/16 的 lmkd 增量（更新的 per-UID memcg kill 路径等）：**未能确认**（lmkd 源码在 aosp-mirror 上不存在、android.googlesource.com 不可达；官方文档只写到 Android 11 策略层）。

## 5. PSI [部分确认]

- lmkd 文档确认系统级用法：PSI monitor（部分/完全失速阈值事件）+ 特权用户态进程订阅；PSI 补丁曾回移到 4.9/4.14。
- **per-cgroup PSI（memory.pressure / cgroup.pressure）在 Android 的具体使用方式：未能确认**——Android 官方文档未提及；docs.kernel.org 的 cgroup-v2 与 accounting/psi 文档已抓到本地但按指示停止，未细读。

## 6. DAMON / DAMOS [未完成]

- 仅抓取了 `docs.kernel.org/mm/damon/design.html`（未解析）。damon_reclaim / damon_lru_sort 的合入版本（[记忆：DAMON core 5.15、DAMON-based reclamation 5.17]）与 Google / Meta / Cloudflare 生产使用情况均**未在线验证**。
- 间接相关 [确认]：kernelnewbies 6.15 页有条目 "Adding Proactive Memory Reclaim Statistics"（memory.reclaim 的统计，6.15 合入）。

## 7. mTHP + Android 16K page [确认]

- mTHP：kernelnewbies 6.8 页确认 "Multi-size transparent huge pages for anonymous memory" 为 6.8 亮点特性；默认不改变行为、需显式启用（`/sys/kernel/mm/transparent_hugepage/hugepages-*kB/enabled` [记忆]）；推荐 LWN 文章 "Large folios for anonymous memory"。后续 6.13 有 "Add per-order mTHP swpin counters"。arm64 具体默认值/配置符号未逐一核验 [记忆：arm64 与 x86 在 6.8 同时获得 anon mTHP]。
- 16K page（source.android.google.cn 16kb-page-size 系列 + developer.android.google.cn page-sizes，后者 2026-09-15 更新）：
  - Android 15 起 AOSP 支持 16K page size 构建，默认关闭、以开发者选项提供；内核需 `CONFIG_ARM64_16K_PAGES`（Kleaf：`--page_size=16k`）；16K ELF 对齐自 android14-6.1 起可用于 4K/16K 内核。
  - 支持 16K 启动（开发者选项）的设备：Pixel 8/8 Pro（Android 15 QPR1+）、Pixel 8a、Pixel 9/9 Pro/9 Pro XL（15 QPR2+）、Pixel 9a（Android 16+）。
  - **Google Play 要求：targeting Android 15+（API 35）的 64 位应用必须支持 16K page size；2027-02-01 起不支持的更新无法发布**（此前公告的 2025-11-01 时限已放宽为此 [由当前文档推断]）。另有 16K backcompat 模式（`bionic.linker.16kb.app_compat.enabled`）。
  - 官方收益数据：内存压力下应用启动时间平均降低 3.16%（代价：平均内存略增）。我抓取的文档范围内未见已量产的 16K 消费设备。

## 8. cgroup v2 memory controller 在 Android [确认，含关键新发现]

- 上游接口语义（docs.kernel.org/admin-guide/cgroup-v2.html，已核验）：`memory.reclaim`（`echo 1G > memory.reclaim` 主动回收；可 over/under reclaim、不足返 -EAGAIN；不视为压力信号）；`memory.high`（节流 + 重回收、不触发 OOM；O_NONBLOCK 可绕过同步回收）；`memory.oom.group`（OOM 时整组同杀）。
- memory.reclaim 合入版本：**未能在线确认** [记忆：6.1，Yosry Ahmed 系列]。
- Android 通用机制（cgroups 文档确认）：Android 10+ 以 `cgroups.json` + `task_profiles.json` 任务配置文件抽象 cgroup（v1/v2 并存）；示例含 memory cgroup（v1 `/dev/memcg`、`memory.soft_limit_in_bytes`、`memory.swappiness`——**后台任务示例值 swappiness=150**）；cgroup v2 freezer 挂 `/sys/fs/cgroup`；存在 `UsePerAppMemcg()` API（查询是否启用 per-app memcg）。
- **Android 17 新增 memory-limiter 系统服务（官方文档确认）**：用 cgroup v2 按进程限内存，依赖 `memory.high`（软限→节流+主动回收）与 **`memory.swap.max`（限制单进程 ZRAM/swap 用量）**；按可见性分档（16GB 设备：可见 10G / 不可见 5G / swap 5G；12GB：8G/4G/4G）；监控 UID≥10000；cached 态「先冻结、再尽量回收」；超限可触发 statsd 诊断。配置文件 `/system/etc/memory-limiter-config.xml`。
- **关键问题（zram/zswap 压缩页是否记账到原 memcg）：未完成在线验证。** 已确认的间接证据：lmkd 官方文档要求 `CONFIG_MEMCG_SWAP=y`（swap 记账开启）。机制层面 [记忆，未在线验证]：swap-out 时原 memcg 按整页（未压缩大小）uncharge，swap entry 记入 memcg；zsmalloc/zswap pool 的物理压缩内存是内核内存、记账在 root cgroup，不归属原进程 cgroup；zswap 侧 Nhat Pham（Meta）有 memcg accounting 相关补丁系列（状态未确认）。GitHub 检索噪音中确认 2026-08-24 存在 `mm/zswap: support batch writeback in shrink_memcg()`（6f34b4126b8b），说明 zswap 已有 per-memcg shrinker [记忆：Nhat Pham 于 6.8 引入 zswap shrinker，未验证]。
- kmem accounting 现状：未完成。新事实 [确认]：6.15 合入了新的 `dmem` memory accounting cgroup（kernelnewbies 条目；面向设备内存，非 kmem）。

## 9. Android cached app freezer [确认]

- 官方文档（cached-apps-freezer）：**Android 11 QPR3+** 引入 cached app freezer；基于**内核 cgroup v2 freezer**，将 cached 进程迁入 frozen cgroup 停止执行；开关：开发者选项或 `device_config put activity_manager_native_boot use_freezer true`；隐藏系统 API `setProcessFrozen` / `enableFreezer`；验证路径 `/sys/fs/cgroup/uid_0/cgroup.freeze`（顺带证明 per-UID 的 cgroup v2 层级存在）。
- binder-freezer 文档：向 frozen 进程发同步（非 oneway）binder 事务会直接杀掉对方（防调用方无限挂起）；oneway 事务缓冲至解冻。
- 与回收的交互（Android 17，memory-limiter + mmd 文档确认）：cached → frozen → 尽量回收；对「杀掉会被用户感知」的 cached app 做 **per-process zram writeback**（`ZRAM_ANDROID_IOC_PROCESS_WRITEBACK` ioctl），写回后提升其 oom_score_adj（更难被杀）；解冻重启时 `ZRAM_ANDROID_IOC_PROCESS_PREFETCH` 预取 swap 页缩短启动延迟。
- 上游 cgroup v2 freezer 合入版本 [记忆：6.0] 未验证；已确认 6.15 起为 legacy v1 freezer 打了 deprecation 警告（78f6519ed076，2025-03-11）。

## 10. 6.13+ 主线 mm 新特性 [部分确认]

- 6.13（kernelnewbies 确认条目）：zswap swap-out of large folios；per-order mTHP swpin counters；page->index removals（shrink struct page 方向）；tmpfs large folio 读提速 20%。
- 6.15（kernelnewbies 确认条目）：dmem cgroup；"Mm owner tracking for large folios (!hugetlb) + config_no_page_mapcount"；freelist hygiene；Speed up fallbacks in rmqueue_bulk()；Batched unmap lazyfree large folios during reclamation；Proactive Memory Reclaim Statistics；zsmalloc/zram preemption 系列；zswap 切换 object read/write apis。
- 6.16/6.17/6.18/6.19/7.0 的 kernelnewbies 页面已下载到本地（`/tmp/mmresearch/kn_6.16.html` 等），按指示停止、未解析。
- workingset/LRU lock split（6.13）、MGLRU folio 化（6.16?）、page table copy 优化、lockless 分配器：均为 [记忆/未验证] 或未完成。

## 11. Android 特有 mm 内容 [部分确认；mmd 是重大发现]

- **mmd——Android 17 内存管理守护进程（官方文档确认）**：集中管理 ZRAM 配置与持续维护（取代分散的 init 脚本配置）；recompression 策略默认全开（huge/idle/huge_idle，退避 30min、idle 阈值 2h~4h 动态指数插值、≥1KiB 才重压）；writeback 有每日预算（默认 24GiB/天、单轮 ≤300MiB、单次 ≥5MiB）；per-process writeback / prefetch ioctl（见第 9 项）；system_server 经 JobScheduler（要求 idle + 电量不低）触发 `mmd.doZramMaintenanceAsync()`；依赖 `CONFIG_ZRAM_TRACK_ENTRY_ACTIME`——**GKI 6.18+ 默认启用**（旧内核默认关、有内存开销）。
- vendor hooks：**未能确认**（对应文档页未抓取）。[记忆：CONFIG_ANDROID_VENDOR_HOOKS，Android 12+ GKI 提供，mm 侧有 rss_stat 等 hook——未验证。]
- Pixel swappiness / MGLRU 调优：未能确认（源码不可达）。唯一确认的官方数据：cgroups 文档后台任务示例 `MemSwappiness=150`。
- swap-to-storage 取舍：未找到官方直接论述。间接确认：Android 17 生产在用「zram writeback 到存储 + 每日预算」（即受控的 swap-to-storage）。[记忆：Android 长期仅用 zram、不挂裸 disk swap 的原因是 flash 寿命与性能可预测性——未验证。]

## 主要来源（本次实际核验过的）

- https://www.kernel.org/releases.json （主线版本状态）
- https://source.android.google.cn/docs/core/architecture/kernel ；…/kernel/android-common ；…/kernel/gki-android17-6_18-release-builds （GKI 分支与版本表）
- https://docs.kernel.org/admin-guide/mm/multigen_lru.html ；…/admin-guide/cgroup-v2.html ；…/admin-guide/mm/zswap.html ；…/mm/damon/design.html ；…/accounting/psi.html
- https://source.android.google.cn/docs/core/perf/lmkd ；…/perf/cgroups ；…/perf/memory-limiter ；…/perf/mmd ；…/perf/cached-apps-freezer ；…/architecture/ipc/binder-freezer ；…/architecture/16kb-page-size/16kb
- https://developer.android.google.cn/guide/practices/page-sizes
- https://kernelnewbies.org/Linux_6.2 / Linux_6.8 / Linux_6.13 / Linux_6.15
- GitHub（torvalds/linux 镜像，commit 检索与 compare 验证）：
  - MGLRU groundwork: https://github.com/torvalds/linux/commit/ec1c86b25f46
  - MGLRU working set protection (v6.3): https://github.com/torvalds/linux/commit/7b8144e63d84
  - zram recompress sysfs (v6.2): https://github.com/torvalds/linux/commit/84b33bf78889
  - zram remove chained recompression: https://github.com/torvalds/linux/commit/cedfa028b54e
  - zram compressed data writeback: https://github.com/torvalds/linux/commit/d38fab605c66
  - zram writeback bio batching: https://github.com/torvalds/linux/commit/f405066a1f0d
  - zram modernize writeback interface: https://github.com/torvalds/linux/commit/cf42d4cccf0d
  - large folios swap-in (sync io): https://github.com/torvalds/linux/commit/242d12c98174
  - freezer v1 deprecation: https://github.com/torvalds/linux/commit/78f6519ed076
  - zswap batch writeback in shrink_memcg: https://github.com/torvalds/linux/commit/6f34b4126b8b

## 未竟事项（若继续调研的优先级建议）

1. zram/zswap 压缩页 memcg 记账的补丁/讨论（需 lore.kernel.org 或 patchwork 访问，或换出口网络）
2. GKI android16-6.12 / android17-6.18 的 defconfig（MGLRU、PSI、zram、memcg、vendor hooks 的实际 CONFIG 状态）
3. lmkd 源码近三年的演进（per-UID kill、memcg 集成）
4. DAMON 生产使用的一手引用（SeongJae Park 的 LPC 演讲 / Google/Meta 博客）
5. 本地已下载未解析：kn_6.16 / kn_6.17（及可能已完成的 6.18/6.19/7.0）kernelnewbies 页面、DAMON design 文档、zram/zswap/psi 内核文档
