[Haskell-cafe] ekg-core/RTS : bogus GC stats when running on Google Cloud Run

Marco Zocca zocca.marco at gmail.com
Sat Jul 4 15:29:31 UTC 2020

Hi all,

I have two services deployed on Google cloud infrastructure; Service 1
runs on Compute Engine and Service 2 on Cloud Run and I'd like to log
their memory usage via the `ekg-core` library
(which is just a thin wrapper around GHC.Stats ).

The logging bracket is basically this :

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

I'm very puzzled by this: both rts.gc.current_bytes_used and
rts.gc.max_bytes_used gauges return constant 0 in the case of Service
2 (the Cloud Run one), even though I'm using the same sampling/logging
functionality and build options for both services.
This is about where my knowledge ends; could this behaviour be due to
the Google Cloud Run hypervisor ("gRun") implementing certain syscalls
in a non-standard way (gRun syscall guide :
https://gvisor.dev/docs/user_guide/compatibility/linux/amd64/) ?

Thank you for any pointers to guides/manuals/computer wisdom.

Details :

Both are built with these options :

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

the only difference is that Service 2 has an additional flag
-with-rtsopts=-M2G since Cloud Run services must work with 2 GB of
memory at most.
The container OS in both cases is Debian 10.4 ("Buster").

More information about the Haskell-Cafe mailing list