Я уже рассказывал про распределённые вычисления в статьях Folding@home и folding@home с помощью nvidia gpu на debian linux.
Сегодня я считаю уже на трёх машинах, что в сумме даёт 6 процессов расчёта.
В связи с этим захотелось мониторить их состояние где-нибудь в одном месте.
Например у себя на сайте.
В этом и следующем посте я изложу как это можно сделать.
Собственно процесс можно разделить на две части:
- Отправка состояния на сервер – это на считающих машинах
- Приём данных и вывод состояния систем – это на сайте
Начнём с первого.
Можно было бы воспользоваться встроенным в клиенты 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. Это в следующей статье.