Мониторинг заданий Folding@home часть 1

10.02.2010 22:18:20

Я уже рассказывал про распределённые вычисления в статьях Folding@home и folding@home с помощью nvidia gpu на debian linux.

Сегодня я считаю уже на трёх машинах, что в сумме даёт 6 процессов расчёта.
В связи с этим захотелось мониторить их состояние где-нибудь в одном месте.
Например у себя на сайте.

В этом и следующем посте я изложу как это можно сделать.

Собственно процесс можно разделить на две части:

  1. Отправка состояния на сервер – это на считающих машинах
  2. Приём данных и вывод состояния систем – это на сайте

Начнём с первого.
Можно было бы воспользоваться встроенным в клиенты Folding@Home веб-сервером (я полагаю, что он там есть, раз есть соответствующая настройка в client.cfg). Но в этом случае пришлось бы писать опросчик, который с заданным интервалом заходил бы на клиенты и считывал данные. Получится что 90% времени мы будем получать данные, которые у нас уже есть, потому как с прошлого опроса они не изменились. Правильно подобранный интервал опроса лишь снизит паразитный трафик.

Было бы здорово получать данные только если они изменились и сразу как только они изменились. Необходимо чтобы клиентские машины при изменении состояния оповещали об этом событии сервер. Так и не будет впустую гоняться трафик по сети и результаты буду доступны немедленно.

Как это реализовать технически?
Клиенты Folding@Home сохраняют своё состояние в файле unitinfo.txt.
А раз мы в линуксе и состояние это файл, то мы можем воспользоваться замечательным способом подписки на события файла – inotify.

Первое что нам понадобится это пакет incron:

sudo apt-get install incron

incron – это cron-подобный сервис мониторинга файлов, запускает заданный скрипт при возникновении заданного события у файла.

После инсталляции incron, необходимо добавить пользователя, от имени которого будем запускать скрипт в файл /etc/incron.allow
Просто вписываем туда имя пользователя.

Затем добавляем задания для отслеживания:

incrontab -e

Туда вписываем строчки:

/путь/к/файлу/unitinfo.txt IN_CLOSE_WRITE /путь/к/обработчику/события $@

Здесь IN_CLOSE_WRITE – событие, на которое мы подписались
$@ – это имя файла, с которым произошло событие. Передаётся параметром запускаемому скрипту.

Полдела сделано. Теперь пора написать, собственно, обработчик события. Вернее, я то его уже написал на python. Просто приведу код:

#!/usr/bin/python
import os,sys
import urllib
filename = sys.argv[1]
stats = open(filename).read()
dir = os.path.dirname(filename)
config = open(dir+'/client.cfg')
for line in config:
    if line[:9] == 'machineid':
        mid = line[-2]
data = [('mid', mid), ('stats', stats)]
urllib.urlopen( 'http://мой.сайт/принимающий/данные/', urllib.urlencode( data ) )

Скрипт посылает на сервер целиком файл unitinfo.txt и machineid, взятый из файла client.cfg

Осталось реализовать принимающую часть. Её буду делать в виде приложения для django. Это в следующей статье.