Які найкращі бібліотеки Haskell для функціонування програми? [зачинено]


115

Якщо я збираюся вкласти програму у виробництво, мені потрібно зробити декілька речей, щоб вважати її "функціоналізованою" - тобто працює та ремонтується вимірюваним і перевіреним способом як інженерами, так і оперативним персоналом. Для моїх цілей операціоналізована програма повинна:

  • Вміти входити на кілька рівнів (наприклад: налагодження, попередження тощо).
  • Вміти збирати та обмінюватися показниками / статистичними даними про типи роботи, яку проводить програма і скільки часу ця робота займає. В ідеалі зібрані показники доступні у форматі, сумісному з широко використовуваними засобами моніторингу, такими як Ganglia , або можуть бути настільки розробленими.
  • Будьте налаштовані, в ідеалі через систему, яка дозволяє оновлювати налаштовані властивості запущених програм без перезапуску зазначених програм.
  • Будьте доступними для віддалених серверів повторно.

У світі Scala є хороші бібліотеки для вирішення хоча б перших трьох вимог. Приклади:

Що стосується розгортання, то один із підходів у світі Scala полягає в тому, щоб поєднати байт-код і бібліотеки, що містять свою програму чимось на зразок Assembly-sbt , а потім підштовхнути отриманий пакет ("жирний JAR") до віддалених серверів за допомогою інструменту типу Capistrano що паралельно виконує команди над SSH. Це не проблема, яка потребує конкретних мовних інструментів, але мені цікаво, чи існує такий інструмент у спільноті Haskell.

Напевно, є бібліотеки Haskell, які надають ознаки, які я описав вище. Я хотів би знати, яка з доступних бібліотек вважається «найкращою»; тобто найбільш зрілі, доглянуті, зазвичай використовуються в громаді Haskell, і є зразком найкращих практик Haskell.

Якщо є якісь інші бібліотеки, інструменти чи практики щодо створення коду Haskell "готовим до виробництва", я також хотів би знати про них.


1
Четверта куля може спричинити неприємності, оскільки Haskell складається на рідному. Ви можете спробувати компілювати статично, що може або не працювати, але оптимально у вас буде схоже середовище на виробничому сервері, ніж на сервері розробки. Cabal-dev - це середовище з піском, яке може бути придатним для перенесення на інші машини. Вже тоді знадобиться принаймні базові бібліотеки, щоб встановити на цільовій машині.
Масса

1
Що стосується інших інструментів та методів, це питання ТА має огляд: stackoverflow.com/questions/3077866/…
Дон Стюарт

1
Ще одне - ви можете отримати доступ до * nix систем до величезної кількості статистичних процесів та метаданих безпосередньо через файлову систему / proc. Тож якщо ви вкажете декілька процедур, щоб самоаналізувати це, це допоможе замінити відсутність прямих гаків у процесі виконання.
sclv

1
розгортання двійкового файлу є простим, якщо ви створюєте одне і те ж середовище (у вас повинен бути сервер встановлення, якщо ваш комп'ютер має іншу архітектуру). Тоді ви можете rsync двійкові та будь-які зовнішні файли. Немає ssh-бібліотеки для haskell для автоматичного виконання команд перезавантаження, але ви можете використовувати capistrano.
Грег Вебер

1
@tchrist Він витрачає решту першого пункту та список, одразу після оперування словом, пояснюючи його значення простою англійською мовою.
Вілл Маккутчен

Відповіді:


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 інтерактивно, але наразі це не дуже просто (потрібні прив'язки FFI до інтерфейсу "rts / Stats.h"). Ви можете приєднатися до процесу, використовуючи ThreadScopeта відстежуючи поведінку GC та потоків.

Подібні прапори доступні для інкрементального, зафіксованого часу та простору , який може використовуватися для моніторингу (наприклад, ці графіки можна будувати поступово).

hpcзбирає багато статистичних даних щодо виконання програми за її Tixтипом, і люди мають написані інструменти для реєстрації за часовим відрізком, який код виконується.

Будьте налаштовані, в ідеалі через систему, яка дозволяє оновлювати налаштовані властивості запущених програм без перезапуску зазначених програм.

Для цього доступно кілька інструментів, ви можете виконати перезавантаження стану в стилі xmonad; або перейти до витримки коду за допомогою pluginsпакетів * або hint. Деякі з них більш експериментальні, ніж інші.

Відтворювані розгортання

Нещодавно вийшов Galois cabal-dev, який є інструментом для відтворення збірок (тобто залежність визначається і контролюється).


6
Пакет dyre повинен абстрагувати перезавантаження стану стилю xmonad, тому, зокрема, я мушу згадати. Однак це поєднує разом рекомпіляцію та перерозподіл, тому справді йдеться про зміни на машині з усім ланцюжком інструментів. Для віддалених повторних розробок ви хочете щось на кшталт кислотного стану, хоч це трохи важкий на мій смак. У мене є ця наполеглива абстракція mvar, яка має слабкіші гарантії, але до якої можна просто ставитися як до простого MVar, який магічно заповнюється на кожному запуску двійкового файлу з останніми даними, які він мав.
sclv

2
Крім того, нові EventLogрамки журналу GHC (використовуються +RTS -lпід час виконання) потоки виводяться у файл, який можна візуалізувати будь-яким інструментом, що читає формат eventlog.
Дон Стюарт

2
Програма видаватиме журнали своїх подій, наприклад: galois.com/~dons/tmp/A.event.log - які можуть бути візуалізовані як - i.imgur.com/QAe6r.png . Я міг би уявити, як над цим форматом будувати інші засоби моніторингу.
Дон Стюарт

2
Також зауважте, що багато інструментів для профілювання чудово підходять для тестування, але не стільки для виробничого коду. Залишаючи осторонь накладні витрати, наприклад, -проф можна використовувати лише з одним процесором.
sclv

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

9

Я повторюю все, що сказав Дон, і додав би кілька загальних порад.

Наприклад, два додаткових інструменти та бібліотеки, які ви можете розглянути:

  • QuickCheck для тестування на основі властивостей
  • hlint як розширена версія-Wall

Вони обидва орієнтовані на якість коду.

Як практика кодування уникайте Lazy IO. Якщо вам потрібен потоковий IO, перейдіть до однієї з бібліотек ітерацій, таких як перечислювач . Якщо ви подивитесь на Hackage, ви побачите бібліотеки на зразок http-enumerator, які використовують стиль нумератора для запитів http.

Що стосується вибору бібліотек при злому, то іноді може допомогти подивитися, скільки пакетів залежить від чогось. Легко побачити зворотні залежності пакету, який ви можете використовувати на цьому веб-сайті, який відображає злом:

Якщо у вашій програмі роблять жорсткі петлі, як-от веб-сервер, який обробляє багато запитів, лінь може стати проблемою у вигляді витоку місця. Часто це питання додавання анотацій суворості в потрібних місцях. Профілювання, досвід та основи читання - основні методи, які я знаю, для боротьби з подібними речами. Кращий довідник профілювання я знаю, це глава 25 з Real-World Haskell .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.