如何从 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 中运行的 Pod 限制?

Kubernetes 集群中的 Kafka - 如何从 Kubernetes 集群外部发布/使用消息

如何从我在 Google Cloud Platform 上的部署中删除 Kubernetes 仪表板资源?

如何将应用程序的日志从一个容器转移到kubernetes中的另一个容器中