ru_minflt 增量与页数在全部 行严格相等(自校验)。vm_pageout_scan 的年龄队列语义一致。vm.lz4_threshold=12288 与源码 arm64/16K 分支设定一致;wk/lz4_compressions 计数器恒 0 由 RELEASE 内核 VMCSTATS 编译屏蔽解释(非未使用)。memperf/appsamp/decomp_probe*)均以 iOS SDK 交叉编译、ldid 注入 platform-application 签名后在设备上原生执行;采样通过 task_for_pid + task_info 与 host_statistics64/sysctl vm.compressor_* 完成,不依赖任何模拟。方法:每次重新 mmap(MAP_ANON|MAP_PRIVATE) 后逐页写入 1 字节触发零填充次要缺页(16KB/页),mach_absolute_time() 计时、getrusage 计数,5 次重复取中位数;随机模式用 Fisher–Yates 打乱页序。
我们将 XNU 源码树中的 WKdmCompress_16k.s / WKdmDecompress_16k.s / WKdmData.s(即内核压缩器在 arm64 16K 页上执行的同一段汇编)直接汇编链接进测试二进制,在真机上测量内核真实路径的性能上限:
c_segment_sv_hash 单字存储路径(源码 vm_compressor.c L3952-3960),解压近似 memset。RANDOM 页被识别为不可压后原样存储(ratio=1.0,"压缩"吞吐 13857 MiB/s 实为检测+memcpy 成本)。方法:fork N 个独立地址空间(绕过 iOS 单进程驻留上限),各自 mmap 并填充高压缩性 text 数据,父进程 2s 步进采样全局压缩器字节/页计数器。
vm.compressor_input_bytes 增量为 0 —— iOS 14.8 在空闲页充裕时完全不压缩,宁可把冷页留在 inactive 队列;② aggressive(8×384MB):2 秒内 free 2.96GB→42MB 触发安全停机,压缩器同期仅消化 (≈46MB/s 的突发处理速率),远追不上 ~1.5GB/s 的子进程缺页填充速度 —— 压缩器是滞后、限速的兜底,不是并发回收通道;③ 实测聚合比率 落在 WKdm TYPICAL 区间(§3.1 ratio ),佐证 bulk 路径主体走 WKdm 系编码。方法 v1:6 个子进程各映射 320MB text 数据并触碰一次(成为冷脏页),等待压缩器稳定后令其逐页重读(每 16KB 页读 1 字节 = 恰好一次潜在解压缺页),全程读 vm.compressor_decompressions 与 ru_minflt。
vm.compressor_swapouts_under_300s=0),全部就地压缩。compressor_decompressions / reactivations 增长加速 —— 被压缩的挂起应用在其(少量)被再次触碰的页上付出解压成本,而前台应用受 vm_pageout 保护。表:挂起应用在 6×384MB 压力(free 下探 348-518MB)期间完全冻结 —— faults Δ=0、压缩字节不变:它们早已被压缩过(稳态即完成),且未被唤醒。metacompressor() 先 WKdm,失败或产出 ≥ 阈值再试 LZ4 择优(vm_compressor_algorithms.c L296-405);设备 vm.lz4_threshold 实测 12288 = 源码 arm64 16K 页的编译期设定(L453),配置与二进制一致。② wk/lz4_compressions 恒 0 的"反常":RELEASE 内核 VMCSTATS=(DEVELOPMENT||DEBUG) 把计数语句编译为空(L122-140)—— 计数器不可用 ≠ 算法未使用,不能据此判断 WKdm/LZ4 占比(此前多份分析踩过此坑)。③ 解压缺页路径:vm_compressor.c c_decompress_page L4077 → metadecompressor L4311 分派;每次线程解压计数 vm_fault.c L163(正是本报告 appsamp/decomp_probe 采样的那组计数器)。以下恒等式在原始数据上程序化复核(site/audit.py),任何一条失败即整体判废:
iPhone 12 Pro(D53pAP)· iOS 14.8 (18H17) · Darwin 20.6.0 · A14 6 核 · 6GB · Taurine 越狱 · 16KB 页。
macOS 侧:xcrun -sdk iphoneos clang 交叉编译 + ldid 签名;USB 经 iproxy 2222→22,paramiko 执行。
设备侧工具:/var/mobile/ios_perf/{memperf,appsamp,decomp_probe2}(本仓库 ios-perf-bench/bench/)。
memperf pagefault:4/16/64/256MB × seq/rand × 5 reps,mmap 冷启动。
memperf compression:LZ4/LZ4_RAW/LZFSE/LZMA/ZLIB × zero/text/mixed/random × 64KB/256KB/1MB/4MB × 5 reps,往返 memcmp 校验。
memperf wkdm:XNU WKdm 16K 汇编(ALL_ZEROS/MOSTLY_ZEROS/TYPICAL/RANDOM)。
memperf mproc:N 进程 × per_mb × hold,2s 步进全局采样;free<96MB 安全停机。
appsamp:task_info(VM/EVENTS) + host_statistics64 + vm.compressor_* @250-500ms。
decomp_probe v1/v2:冷页老化 + 逐页重读,解压缺页计数。