如何从 Kubernetes 中运行的 Haskell 服务收集分析信息?
Posted
技术标签:
【中文标题】如何从 Kubernetes 中运行的 Haskell 服务收集分析信息?【英文标题】:How to collect profiling info from Haskell service running in Kubernetes? 【发布时间】:2021-06-09 13:50:29 【问题描述】:我有一个用 Haskell 写的微服务,编译器是 8.8.3。
我使用--profile
选项构建它并使用+RTS -p
运行它。它运行了大约 30 分钟,有 <my-service>.prof
文件,但它是空的(字面意思是 0 字节)。以前我是在本地机器上做的,我用 CTRL-C 停止服务,退出后它产生<my-service>.prof
文件,该文件不为空。
所以,我有两个问题:
-
当 Haskell 微服务在 Kubernetes 下以最正确的方式运行时如何收集 profiling 信息(以便能够读取此 .prof 文件)?
对于 8.8.3,如何将运行时参数传递给 Haskell 运行时保存此 .prof 文件的位置(如果没有这样的选项,可能有一些解决方法) - 因为我觉得文件可能很大,我可以命中磁盘空间问题。此外,我不知道如何在微服务运行时刷新/读取/获取此文件。我想如果我能够传递这个 .prof 文件的完整路径,那么我可以将它保存在某个永久卷上的其他位置,例如用
INT
信号“杀死”服务,并从中获取这个 .prof 文件音量。
当服务在 Kubernetes 中运行时,获取此 .prof 文件的常用/便捷方式是什么?
PS。我在最新版本的文档中看到了一些相关选项,但我使用的是 8.8.3
【问题讨论】:
【参考方案1】:我认为使用 GHC 进行实时分析的唯一方法是使用事件日志。您可以在要测量的函数处将Debug.Trace.traceEvent
插入代码中,然后使用-eventlog
编译并使用+RTS -l -ol <output-file-name> -RTS
运行。您可以使用ghc-events-analyze
来分析和可视化生成的事件日志。
GHC 8.8.3 的官方事件日志文档是 here。
【讨论】:
以上是关于如何从 Kubernetes 中运行的 Haskell 服务收集分析信息?的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 kubernetes 从托管在同一集群/内部的注册表中提取容器映像
如何从 IntelliJ 运行/部署 Spring Boot 微服务到本地 Kubernetes 集群?
Kubernetes 集群中的 Kafka - 如何从 Kubernetes 集群外部发布/使用消息