如果我要将一个程序投入生产,那么我需要该程序做一些事情,以便将其视为“操作化” - 即,由工程师和工程师以可测量和可验证的方式运行和维护运营人员。为了我的目的,一个可操作的程序必须:
在Scala世界中,有很好的库可以处理至少前三个要求。例子:
至于部署,Scala世界采用的一种方法是将字节码和包含一个程序的库捆绑在一起,如assembly-sbt,然后将生成的包(“胖JAR”)推送到远程服务器使用像Capistrano这样的工具,通过SSH并行执行命令。这不是一个需要特定语言工具的问题,但我很好奇Haskell社区中是否存在这样的工具。
可能有Haskell库提供了我上面描述的特征。我想知道哪些库可以被认为是“最好的”;也就是说,它是最成熟,维护良好的,常用于Haskell社区,是Haskell最佳实践的典范。
如果有任何其他库,工具或实践使Haskell代码“生产就绪”,我也很想知道这些。
答案 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和线程行为。
类似的标记可用于增量,已记录的time和space分析,可用于监控(例如,这些graphs可以逐步构建)。
hpc
通过Tix
类型收集大量有关程序执行的统计信息,人们有written tools来按时间片记录正在执行的代码。
可配置,理想情况是通过允许更新正在运行的程序中的已配置属性而无需重新启动所述程序的系统。
有几种工具可用,你可以做xmonad式的状态重装;或者通过plugins
*个包或hint
向上移动代码hotswapping。其中一些比其他更具实验性。
可重复部署
Galois最近发布了cabal-dev
,这是一个用于进行可重现构建的工具(即依赖关系具有作用域和控制范围)。
答案 1 :(得分:9)
我会回应唐所说的一切,并添加一些一般建议。
例如,您可能需要考虑两个额外的工具和库:
-Wall
这些都是针对代码质量的。
作为编码实践,请避免使用Lazy IO。如果您需要流式IO,请使用其中一个iteratee库,例如enumerator。如果查看Hackage,您会看到像http-enumerator这样的库,它们使用enumerator样式来处理http请求。
至于在hackage上挑选库,有时可以帮助查看有多少包依赖于某些东西。轻松查看您可以使用此网站的软件包的反向依赖关系,这反映了hackage:
如果您的应用程序最终执行紧密循环,例如处理许多请求的Web服务器,则懒惰可能是空间泄漏形式的问题。通常这是在正确的地方添加严格注释的问题。分析,经验和阅读核心是我所知道的打击这类事情的主要技巧。我所知道的最佳性能分析参考是Chapter 25的Real-World Haskell。
答案 2 :(得分:9)
ConfigFile示例:
# Default options
[DEFAULT]
hostname: localhost
# Options for the first file
[file1]
location: /usr/local
user: Fred