ekg-core/GHC RTS:运行 在 Google Cloud 运行 上时的虚假 GC 统计

ekg-core/GHC RTS : bogus GC stats when running on Google Cloud Run

我在 Google 云基础设施上部署了两项服务;服务 1 在计算引擎上运行,服务 2 在云 运行 上运行,我想通过 ekg-core 库 (https://hackage.haskell.org/package/ekg-core-0.1.1.7/docs/System-Metrics.html).

记录它们的内存使用情况

记录括号与此类似:

mems <- newStore
registerGcMetrics mems
void $ concurrently io (loop mems)
where
  loop ms = do
    m <- sampleAll ms
    ... (lookup the gauges from m and log their values)
    threadDelay dt
    loop ms

我对此感到非常困惑:rts.gc.current_bytes_usedrts.gc.max_bytes_used 都测量 return 服务 2 中的常量 0(云 运行 一个),即使我为这两种服务使用相同的 sampling/logging 功能和构建选项。我应该补充一点,concurrently 中的并发进程是一个 Web 服务器,我预计基本内存负载约为 200 KB,而不是 0B。

我的知识到此为止;此行为可能是由于 Google Cloud 运行 管理程序(“gVisor”)以非标准方式实施某些系统调用(gVisor 系统调用指南:https://gvisor.dev/docs/user_guide/compatibility/linux/amd64/)?

感谢您对 guides/manuals/computer 智慧的任何指点。

详情:

两者都是使用这些选项构建的:

-optl-pthread -optc-Os -threaded -rtsopts -with-rtsopts=-N -with-rtsopts=-T

唯一的区别是服务 2 有一个额外的标志 -with-rtsopts=-M2G,因为云 运行 服务必须最多使用 2 GB 内存。 两种情况下的容器 OS 都是 Debian 10.4(“Buster”)。

再想一想,这种行为在“无服务器”模型中是完全合理的;当服务不处理请求 [1] 时,资源(CPU 和内存)被限制为 0,这正是 ekg 所选择的。

为什么即使在请求之外也打印出日志仍然有点神秘,但是..

[1] https://cloud.google.com/run/docs/reference/container-contract#lifecycle