众所周知 Satori GC 是 .NET 上兼具高吞吐、低延时和低占用的 GC。为了更方便地在项目里使用 Satori GC,我把 Satori GC 封装成了 MSBuild SDK 并传到了 nuget 上,这样就能通过仅仅一行代码在发布时启用 Satori GC 了。
对于 .NET 10,给你的项目文件里添加:
xml
<Sdk Name="PublishWithSatoriGC" Version="10.0.13-satori.37965325580.1" />
而如果是 .NET 11,则添加:
xml
<Sdk Name="PublishWithSatoriGC" Version="11.0.0-satori.37965325036.1" />
即可。
版本会跟随上游开发不断更新,因此请务必定期检查是否有新的版本。
加入之后就可以通过 dotnet publish 使用了。注意,只有自包含 的发布才会生效,因此发布的时候需要带上 --self-contained,另外还支持 NativeAOT,ReadyToRun,裁剪和单文件。
例如:
bash
dotnet publish -c Release -r win-x64 --self-contained /p:PublishSingleFile=true /p:PublishTrimmed=true
dotnet publish -c Release -r win-x64 /p:PublishAot=true
都是可以的。
支持 Windows、Linux 和 macOS,如果是 .NET 11 的话还支持 Android。
发布之后可以通过打印 GC.GetConfigurationVariables().ContainsKey("SatoriGC") 来判断 Satori GC 是否已经启用。
Satori GC 支持两个模式:Interactive 和 LowLatency,虽然两个模式下的延时都非常低,但相对而言前者更重视资源占用和吞吐量一些,而后者则更重视低延时的保证。默认模式是 Interactive,可以通过设置 GCSettings.LatencyMode 来在运行时动态切换。
最后上一个二叉树压力测试结果。
| 指标 | Satori (Interactive) | Satori (LowLatency) | Workstation | Server (DATAS) |
|---|---|---|---|---|
| 总耗时 (ms) | 12,611.39 | 15,383.19 | 35,289.56 | 16,112.36 |
| 最大暂停 (ms) | 8.360 | 1.998 | 30.062 | 159.651 |
| 平均暂停 (ms) | 0.381 | 0.233 | 3.366 | 2.850 |
| P99.9 暂停 (ms) | 8.224 | 1.867 | 26.852 | 150.798 |
| P99 暂停 (ms) | 1.759 | 1.126 | 24.465 | 41.442 |
| P95 暂停 (ms) | 0.789 | 0.570 | 14.992 | 4.046 |
| P90 暂停 (ms) | 0.664 | 0.440 | 13.575 | 2.139 |
| P80 暂停 (ms) | 0.477 | 0.331 | 4.711 | 1.782 |
| 峰值内存 (MB) | 1,258.16 | 1,460.84 | 1,420.30 | 2,582.51 |
| GC 后内存 (MB) | 27.31 | 51.21 | 230.81 | 373.70 |
可以看到 Satori GC 无论是 Interactive 模式还是 LowLatency 模式,在这个测试中都全方位薄纱已有的 Workstation GC 和 Server GC:吞吐量最高的同时,延时和资源占用还是最低的。LowLatency 模式下更是把最大暂停时间压到了 2ms 以内。