什么是最好的Haskell库来实现程序?

时间:2011-04-27 18:34:11

标签: logging haskell metrics

如果我要将一个程序投入生产,那么我需要该程序做一些事情,以便将其视为“操作化” - 即,由工程师和工程师以可测量和可验证的方式运行和维护运营人员。为了我的目的,一个可操作的程序必须:

  • 能够在多个级别登录(例如:调试,警告等)。
  • 能够收集和分享有关该计划正在进行的工作类型以及该工作需要多长时间的指标/统计数据。理想情况下,收集的指标可以采用与Ganglia等常用监控工具兼容的格式提供,或者可以如此使用。
  • 可配置,最好通过一个系统,允许更新正在运行的程序中的已配置属性,而无需重新启动所述程序。
  • 可以以可重复的方式部署到远程服务器。

在Scala世界中,有很好的库可以处理至少前三个要求。例子:

至于部署,Scala世界采用的一种方法是将字节码和包含一个程序的库捆绑在一起,如assembly-sbt,然后将生成的包(“胖JAR”)推送到远程服务器使用像Capistrano这样的工具,通过SSH并行执行命令。这不是一个需要特定语言工具的问题,但我很好奇Haskell社区中是否存在这样的工具。

可能有Haskell库提供了我上面描述的特征。我想知道哪些库可以被认为是“最好的”;也就是说,它是最成熟,维护良好的,常用于Haskell社区,是Haskell最佳实践的典范。

如果有任何其他库,工具或实践使Haskell代码“生产就绪”,我也很想知道这些。

3 个答案:

答案 0 :(得分:54)

这是一个很好的问题!这是第一次削减。

  

能够记录多个级别(例如:调试,警告等)。

hslogger很容易成为最流行的日志框架。

  

能够收集和分享有关该计划正在进行的工作类型以及该工作需要多长时间的指标/统计数据。理想情况下,收集的指标可以采用与Ganglia等常用监控工具兼容的格式,也可以如此使用。

我不知道任何标准化的报告工具,但是,从+RTS -s流(或通过分析输出标志)提取报告是我过去所做的事情。

$ ./A +RTS -s
64,952 bytes allocated in the heap
1 MB total memory in use
 %GC time       0.0%  (6.1% elapsed)
 Productivity 100.0% of total user, 0.0% of total elapsed

您也可以使用机器可读格式:

$ ./A +RTS -t --machine-readable

 [("bytes allocated", "64952")
 ,("num_GCs", "1")
 ,("average_bytes_used", "43784")
 ,("max_bytes_used", "43784")
 ,("num_byte_usage_samples", "1")
 ,("peak_megabytes_allocated", "1")
 ,("init_cpu_seconds", "0.00")
 ,("init_wall_seconds", "0.00")
 ,("mutator_cpu_seconds", "0.00")
 ,("mutator_wall_seconds", "0.00")
 ,("GC_cpu_seconds", "0.00")
 ,("GC_wall_seconds", "0.00")
 ]

理想情况下,您可以通过套接字附加到正在运行的GHC运行时,并以交互方式查看这些GC统计信息,但目前这不是非常简单(需要与“rts / Stats.h”接口进行FFI绑定)。您可以使用ThreadScope附加到流程并监控GC和线程行为。

类似的标记可用于增量,已记录的timespace分析,可用于监控(例如,这些graphs可以逐步构建)。

hpc通过Tix类型收集大量有关程序执行的统计信息,人们有written tools来按时间片记录正在执行的代码。

  

可配置,理想情况是通过允许更新正在运行的程序中的已配置属性而无需重新启动所述程序的系统。

有几种工具可用,你可以做xmonad式的状态重装;或者通过plugins *个包或hint向上移动代码hotswapping。其中一些比其他更具实验性。

  

可重复部署

Galois最近发布了cabal-dev,这是一个用于进行可重现构建的工具(即依赖关系具有作用域和控制范围)。

答案 1 :(得分:9)

我会回应唐所说的一切,并添加一些一般建议。

例如,您可能需要考虑两个额外的工具和库:

这些都是针对代码质量的。

作为编码实践,请避免使用Lazy IO。如果您需要流式IO,请使用其中一个iteratee库,例如enumerator。如果查看Hackage,您会看到像http-enumerator这样的库,它们使用enumerator样式来处理http请求。

至于在hackage上挑选库,有时可以帮助查看有多少包依赖于某些东西。轻松查看您可以使用此网站的软件包的反向依赖关系,这反映了hackage:

如果您的应用程序最终执行紧密循环,例如处理许多请求的Web服务器,则懒惰可能是空间泄漏形式的问题。通常这是在正确的地方添加严格注释的问题。分析,经验和阅读核心是我所知道的打击这类事情的主要技巧。我所知道的最佳性能分析参考是Chapter 25Real-World Haskell

答案 2 :(得分:9)

  • 关于配置,我发现ConfigFile对我的项目很有用。我将它用于生产中的所有守护进程。它不会自动更新。
  • 我使用cabal-dev在各种环境(本地,开发,同事 - 本地)中创建可重现的构建。真的cabal-dev是必不可少的,特别是因为它能够支持项目目录中的本地修补版本的库。
  • 为了它的价值,我会选择xmonad风格的状态重装。哈斯克尔的纯洁使得这个微不足道;迁移是一个问题,但无论如何。我尝试使用hsplugins并提示我的IRCd,在前一种情况下,存在GHC运行时问题,而后者则存在分段错误。我把分支留在Github上以便以后进行尸检:https://github.com/chrisdone/hulk

ConfigFile示例:

# Default options
[DEFAULT]
hostname: localhost
# Options for the first file
[file1]
location: /usr/local
user: Fred