프로그램을 운영하는 데 가장 적합한 Haskell 라이브러리는 무엇입니까? [닫은]


115

프로그램을 프로덕션에 적용하려면 프로그램이 "작동"된 것으로 간주하기 위해 수행해야하는 몇 가지 작업이 있습니다. 즉, 엔지니어와 운영 직원 모두가 측정 가능하고 검증 가능한 방식으로 실행하고 유지 관리 할 수 ​​있습니다. 내 목적을 위해 운영 프로그램은 다음을 충족해야합니다.

  • 여러 수준에서 로그 할 수 있어야합니다 (예 : 디버그, 경고 등).
  • 프로그램이 수행하는 작업 유형과 작업에 걸리는 시간에 대한 메트릭 / 통계를 수집하고 공유 할 수 있습니다. 이상적으로는 수집 된 측정 항목이 Ganglia 와 같이 일반적으로 사용되는 모니터링 도구와 호환되는 형식으로 사용 가능 하거나 그렇게 수정 될 수 있습니다.
  • 이상적으로는 실행중인 프로그램에서 구성된 속성을 해당 프로그램을 다시 시작하지 않고도 업데이트 할 수있는 시스템을 통해 구성 할 수 있습니다.
  • 반복 가능한 방식으로 원격 서버에 배포 할 수 있습니다.

Scala 세계에는 적어도 처음 세 가지 요구 사항을 처리 할 수있는 좋은 라이브러리가 있습니다. 예 :

배포와 관련하여 Scala 세계에서 취한 한 가지 접근 방식은 assembly-sbt 와 같은 프로그램을 사용하여 프로그램을 구성하는 바이트 코드와 라이브러리를 함께 묶은 다음 Capistrano 와 같은 도구를 사용하여 결과 번들 ( "fat JAR")을 원격 서버에 푸시하는 것입니다. SSH를 통해 병렬로 명령을 실행합니다. 이것은 언어 별 도구를 필요로하는 문제는 아니지만 그러한 도구가 Haskell 커뮤니티에 존재하는지 궁금합니다.

위에서 설명한 특성을 제공하는 Haskell 라이브러리가있을 것입니다. 사용 가능한 라이브러리 중 "최고"로 간주되는 라이브러리를 알고 싶습니다. 즉, 가장 성숙하고 잘 관리되며 Haskell 커뮤니티에서 일반적으로 사용되며 Haskell 모범 사례의 모범입니다.

Haskell 코드를 "프로덕션 준비"로 만드는 것과 관련된 다른 라이브러리, 도구 또는 관행이 있다면 이것에 대해서도 알고 싶습니다.


1
네 번째 총알은 Haskell이 네이티브로 컴파일 되었기 때문에 문제를 일으킬 수 있습니다. 작동하거나 작동하지 않을 수있는 정적으로 컴파일을 시도 할 수 있지만, 최적의 경우 개발 서버보다 프로덕션 서버에서 유사한 환경을 사용할 수 있습니다. Cabal-dev는 샌드 박스 환경으로 다른 컴퓨터로 전송하는 데 적합 할 수 있습니다. 그래도 대상 컴퓨터에 최소한 기본 라이브러리를 설치해야합니다.
Masse

1
다른 도구 및 기술과 관련하여이 SO 질문에는 개요가 있습니다. stackoverflow.com/questions/3077866/…
Don Stewart

1
다른 한 가지-* nix 시스템에서 / proc 파일 시스템을 통해 엄청난 양의 프로세스 통계 및 메타 데이터에 직접 액세스 할 수 있습니다. 따라서이를 검사하기 위해 몇 가지 루틴을 작성하면 런타임에 대한 직접 후크 부족을 대체하는 데 도움이됩니다.
sclv

1
바이너리 배포는 동일한 환경에서 빌드하는 한 쉽습니다 (컴퓨터가 다른 아키텍처 인 경우 스테이징 서버가 있어야 함). 그런 다음 바이너리와 외부 파일을 재 동기화 할 수 있습니다. 재시작 명령을 자동으로 실행하는 haskell 용 ssh 라이브러리는 없지만 capistrano를 사용할 수 있습니다.
Greg Weber

1
@tchrist 그는 첫 번째 단락의 나머지 부분과 글 머리 기호 목록을 사용하여 단어 의 의미를 평이한 영어로 설명하는 작동 형 단어 바로 뒤에 보냅니다 .
Will McCutchen 2011

답변:


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 바인딩이 필요함). ThreadScopeGC 및 스레딩 동작을 사용하여 프로세스에 연결 하고 모니터링 할 수 있습니다 .

증분, 기록 된 시간에 대해 유사한 플래그를 사용할 수 있습니다.모니터링에 사용할 수있는 및 공간 프로파일 링에 수 있습니다 (예 : 이러한 그래프 는 증분 적으로 빌드 할 수 있음).

hpc 프로그램 실행에 대한 많은 통계를 수집합니다. Tix 유형을 하며 사람들은 어떤 코드가 실행되고 있는지 타임 슬라이스별로 기록하는 도구작성했습니다 .

이상적으로는 실행중인 프로그램에서 구성된 속성을 해당 프로그램을 다시 시작하지 않고도 업데이트 할 수있는 시스템을 통해 구성 할 수 있습니다.

이를 위해 여러 도구를 사용할 수 있습니다. xmonad 스타일 상태 다시로드를 수행 할 수 있습니다. 또는 다음을 통해 코드 핫스왑으로 이동plugins * 패키지 하거나 hint. 이들 중 일부는 다른 것보다 더 실험적입니다.

재현 가능한 배포

Galois는 최근에 cabal-dev재현 가능한 빌드를 수행하기위한 도구 인을 출시했습니다 (즉, 종속성은 범위가 지정되고 제어 됨).


6
dyre 패키지는 xmonad 스타일의 상태 리로딩을 추상화해야하므로 특히 언급해야한다고 생각합니다. 그러나 재 컴파일과 재배포를 함께 연결하므로 전체 툴체인을 사용하는 머신의 변경 사항에 대한 것입니다. 원격 재배치의 경우 내 취향에는 약간 무겁지만 산성 상태와 같은 것을 원합니다. 보증이 약한이 영구적 인 mvar 추상화가 있지만 바이너리가 실행될 때마다 마지막으로 보유한 데이터로 채워지는 일반 MVar처럼 처리 할 수 ​​있습니다.
sclv

2
또한 GHC의 새로운 EventLog로깅 프레임 워크 ( +RTS -l런타임에 사용)는 출력을 파일로 스트리밍하므로 이벤트 로그 형식을 읽는 모든 도구로 시각화 할 수 있습니다.
Don Stewart

2
프로그램은 다음과 같이 해당 이벤트의 로그를 방출합니다 galois.com/~dons/tmp/A.event.log -로 시각화 할 수있다 - i.imgur.com/QAe6r.png을 . 이 형식 위에 다른 모니터링 도구를 만드는 것을 상상할 수 있습니다.
Don Stewart

2
또한 많은 프로파일 링 도구가 테스트에는 좋지만 프로덕션 코드에는 적합하지 않습니다. 오버 헤드를 제외하고, 예를 들어 -prof는 단일 프로세서에서만 사용할 수 있습니다.
sclv

9
  • 구성과 관련하여 ConfigFile이 내 프로젝트에 유용하다는 것을 알았습니다. 프로덕션의 모든 데몬에 사용합니다. 자동으로 업데이트되지 않습니다.
  • 저는 cabal-dev를 사용하여 환경 (로컬, 개발, 동료 로컬)에서 재현 가능한 빌드를 만듭니다. 실제로 cabal-dev는 특히 프로젝트 디렉토리 내에서 패치 된 로컬 라이브러리 버전을 지원하는 기능을 위해 반드시 필요합니다.
  • 그만한 가치가있는 것은 xmonad 스타일의 상태 리로딩을 사용하는 것입니다. Haskell의 순수성은 이것을 사소하게 만듭니다. 마이그레이션은 문제이지만 어쨌든 문제입니다. 나는 내 IRCd에 대한 hsplugins와 힌트로 실험했고 전자의 경우 GHC 런타임 문제가 있었고 후자의 경우 세그멘테이션 오류가있었습니다. 나중에 사후 분석을 위해 Github에 지점을 남겼습니다 : https://github.com/chrisdone/hulk

ConfigFile의 예 :

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

9

나는 Don이 말한 모든 것을 반영하고 몇 가지 일반적인 조언을 추가합니다.

예를 들어 다음 두 가지 추가 도구 및 라이브러리를 고려할 수 있습니다.

둘 다 코드 품질을 목표로합니다.

코딩 방법으로 Lazy IO를 피하십시오. 스트리밍 IO가 필요한 경우 enumerator 와 같은 iteratee 라이브러리 중 하나를 사용하십시오 . Hackage 를 보면 http 요청에 열거 자 스타일을 사용하는 http-enumerator와 같은 라이브러리를 볼 수 있습니다.

해킹에서 라이브러리를 고르는 것은 때때로 어떤 것에 의존하는 패키지 수를 보는 데 도움이 될 수 있습니다. 해킹을 미러링하는이 웹 사이트를 사용할 수있는 패키지의 역 종속성을 쉽게 볼 수 있습니다.

애플리케이션이 많은 요청을 처리하는 웹 서버와 같이 타이트한 루프를 수행하는 경우, 게으름은 공간 누수의 형태로 문제가 될 수 있습니다. 종종 이것은 올바른 위치에 엄격 성 주석을 추가하는 문제입니다. 프로파일 링, 경험 및 읽기 핵심은 이러한 종류의 문제를 해결하기 위해 내가 아는 주요 기술입니다. 내가 아는 최고의 프로파일 링 참조 는 Real-World Haskell의 25 장 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.