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

Ale*_*yne 115 logging metrics haskell

如果我要将一个程序投入生产,我需要该程序做几件事,以便将其视为"操作化" - 即,工程师和操作人员以可测量和可验证的方式运行和维护.就我的目的而言,一个可操作的计划必须:

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

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

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

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

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

Don*_*art 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
Run Code Online (Sandbox Code Playgroud)

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

$ ./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")
 ]
Run Code Online (Sandbox Code Playgroud)

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

类似的标志可用于增量,记录的时间空间分析,可用于监视(例如,可以逐步构建这些图形).

hpc通过Tix类型收集大量关于程序执行的统计信息,人们已经编写了工具来按时间片记录正在执行的代码.

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

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

可重复的部署

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

  • dyre包应该抽象出xmonad风格的状态重载,所以应该特别提到,我想.但是,它将重新编译和重新部署联系在一起,因此实际上是关于具有整个工具链的机器上的更改.对于远程重新配置,你想要更像酸态的东西,虽然它有点重量级我的口味.我有这种持久的mvar抽象,它具有较弱的保证,但你可以像对待一个普通的MVar那样神奇地在每次启动二进制文件时填充它所持有的最后一个数据. (6认同)
  • 此外,GHC的新[`EventLog`](http://hackage.haskell.org/trac/ghc/wiki/EventLog)日志框架(在运行时使用`+ RTS -l`)将输出流式传输到文件,该文件可以是使用任何读取事件日志格式的工具可视化. (2认同)
  • 程序将发出其事件的日志,如下所示:http://www.galois.com/~dons/tmp/A.event.log - 可视化为 - http://i.imgur.com /QAe6r.png.我可以想象在这种格式之上构建其他监控工具. (2认同)
  • 另请注意,许多分析工具非常适合测试,但对于生产代码而言并非如此.撇开开销,例如-prof只能用于单个处理器. (2认同)

Jas*_*git 9

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

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

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

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

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

如果您的应用程序最终执行紧密循环,例如处理许多请求的Web服务器,则懒惰可能是空间泄漏形式的问题.通常这是在正确的地方添加严格注释的问题.分析,经验和阅读核心是我所知道的打击这类事情的主要技巧.最好的剖析参考我所知道的是第25章真实世界哈斯克尔.


Chr*_*one 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
Run Code Online (Sandbox Code Playgroud)