Как быстро запустить добровольные распределённые вычисления на сотне машин

    Работая в ИТ-подразделении, я постоянно наблюдаю простаивающие по разным организационным причинам компьютеры, которые очень скучают. Золотые времена майнинга биткойнов на CPU прошли, и в поисках нового полезного дела я пришёл к добровольным распределённым вычислениям, в частности, к World Community Grid. Первым делом поиском лекарства от рака были озадачены сервер из холодного резерва и виртуальная машина с низким приоритетом на кластере виртуализации. Сложнее с рабочими станциями, они постоянно приходят и уходят, на каждой устанавливать, настраивать, а потом удалять BOINC долго и нетехнологично.

    Решено было собрать live-дистрибутив с вшитым BOINC'ом и раздавать его по сети. Включил компьютер, нажал F12, выбрал нужный пункт — и уже приносишь пользу человечеству!

    Платформой был выбран Debian, который а) давно знаком и б) обладает замечательным мануалом на нужную тему. Тем не менее, без граблей не обошлось, а в данном случае почти каждые новые грабли обозначают достаточно длительную пересборку образа. Надеюсь, этот пост сэкономит некоторое количество админского времени, а заодно напомнит о существовании такого замечательного проекта, как WCG.

    Заметьте, делалось всё в весьма закрытой среде, и безопасности понадобилось уделить совсем немного внимания. Возможно, в вашем случае над безопасностью нужно будет дополнительно поработать.

    Подготовка


    Система состоит вот из чего:
    1. Сервер сетевой загрузки.
    2. NFS-сервер
    3. Сборочная станция
    У меня 2 и 3 — одна машина.

    1. Сервер сетевой загрузки. У меня всё уже было готово, настроенные TFTP и DHCP у меня остались от проекта по тонким клиентам. Если у вас нет, то поднять новый несложно. В двух словах, устанавливаем и запускаем tftpd-hpa, а в DHCP указываем параметры 66 и 67. Только не давайте загружаться по сети кому попало (в моём случае это курсанты), это может быть опасно. Кроме BIOS, запаролить можно часть загрузочного меню TFTP-сервера.

    2. NFS-сервер. Во-первых, BOINC должен иметь возможность в процессе работы сохранять свои данные. Предполагается, что локальный жёсткий диск трогать нельзя, поэтому по NFS разрешим писать в директорию, например, /srv/boinc-nfs. Здесь каждый компьютер будет создавать поддиректорию с именем, совпадающим с его MAC-адресом. Во-вторых, в директории /srv/debian-live будет лежать корневая ФС для сетевой загрузки. Итак:
    mkdir /srv/debian-live
    mkdir /srv/boinc-nfs
    chown nobody:nogroup /srv/boinc-nfs
    chmod 755 /srv/boinc-nfs

    В /etc/exports дописываем:
    /srv/boinc-nfs *(rw,sync,no_root_squash,no_subtree_check)
    /srv/debian-live *(ro,async,no_root_squash,no_subtree_check)

    после чего перезапускаем сервис (почему-то рекомендуемый exportfs -rv мне результата не дал):
    /etc/init.d/nfs-kernel-server restart

    3. Сборочная станция. Это просто виртуальная машина с обычным Debian Wheezy. Установлен пакет live-build, который и будет делать основную работу. Здесь должен быть интернет.

    Процесс сборки


    Отправляемся на сборочную станцию.
    mkdir /srv/live-default && cd /srv/live-default

    Создаём базовый конфиг для нашего дистрибутива, указав адрес NFS-сервера:
    lb config -b netboot --net-root-path "/srv/debian-live" --net-root-server "192.168.15.20"

    Формируется некоторое дерево директорий, располагая в них разный контент можно кастомизировать свою сборку. Мы добавим следующее:
    1. config/package-lists/boinc.list — список пакетов, которые понадобятся в нашей сборке. Пишем в него:
    boinc-client
    nfs-common

    2. config/includes.chroot/etc/init.d/boinc-preps — init-скрипт, который будет монтировать NFS, настраивать BOINC и менять hostname (возможно, одинаковые хостнеймы мешают WCG идентифицировать компьютер, с ними у меня многие задания переходили в состояние detached). В этот скрипт нужно вставить адрес своего NFS и адреса хостов, с которых будет разрешено беспарольное управление. Содержимое скрипта:
    #!/bin/bash
    
    ### BEGIN INIT INFO
    # Provides:          boinc-preps
    # Required-Start:    nfs-common
    # Required-Stop:
    # Should-Start:
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Various stuff for BOINC
    # Description:       Various stuff for BOINC
    ### END INIT INFO
    
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    . /lib/init/vars.sh
    
    do_start () {
      MYMAC=`ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' | sed s/://g`
      ancien=`hostname`
      nouveau=DYNWCG-$MYMAC
      mkdir -p /mnt/boinc-nfs
      mount 192.168.15.20:/srv/boinc-nfs /mnt/boinc-nfs && mkdir -p /mnt/boinc-nfs/$MYMAC
      service boinc stop
      sed -i "s/^BOINC_DIR=.*/BOINC_DIR=\/mnt\/boinc-nfs\/$MYMAC/;s/^BOINC_USER=.*/BOINC_USER=\"root\"/" /etc/default/boinc-client
      echo "192.168.10.60" > /mnt/boinc-nfs/$MYMAC/remote_hosts.cfg
      echo "192.168.10.61" >> /mnt/boinc-nfs/$MYMAC/remote_hosts.cfg
      echo "" >> /mnt/boinc-nfs/$MYMAC/gui_rpc_auth.cfg
      for file in \
        /etc/hostname \
        /etc/hosts
        # сюда можно добавить
        #/etc/ssh/ssh_host_rsa_key.pub \
        #/etc/ssh/ssh_host_dsa_key.pub \
        # если нужен SSH
      do
        [ -f $file ] && sed -i.old -e "s:$ancien:$nouveau:g" $file
      done
      invoke-rc.d hostname.sh start
      invoke-rc.d networking force-reload
      service boinc start
    }
    
    case "$1" in
      start|"")
            do_start
            ;;
      restart|reload|force-reload|status)
            echo "Error: argument '$1' not supported" >&2
            exit 3
            ;;
      stop)
            # NOP
            exit 3
            ;;
      *)
            echo "Usage: ... [start|stop]" >&2
            exit 3
            ;;
    esac
    
    :

    3. config/hooks/boinc-preps-init.chroot — скрипт из одной команды, который выполнится при сборке и добавит boinc-preps из предыдущего пункта в автозагрузку:
    #!/bin/sh
    update-rc.d boinc-preps defaults

    После добавления нужных настроек запускаем собственно сборку:
    lb build

    Ценность для нас представляет получившийся файл binary.netboot.tar. Распакуем его в /srv:
    cd /srv && tar -xvf live-default/binary.netboot.tar

    Он распакуется в /srv/debian-live (корневая ФС для сетевой загрузки) и /srv/tftpboot (файлы для TFTP-сервера). В моём случае сборочная станция и NFS-сервер — это один компьютер, поэтому /srv/debian-live уже находится на своём месте.
    Содержимое tftpboot — готовое загрузочное меню, его нужно разместить на TFTP-сервере. Его работу я не проверял, так как у меня есть работающий TFTP-сервер со своим меню, и отсюда мне понадобилась лишь часть данных. Во-первых, я скопировал все файлы из tftpboot/live/ на TFTP-сервер в images/debian-live/ (относительно корневой директории TFTP-сервера). Во-вторых, из tftpboot/live.cfg я позаимствовал текст, добавляющий новый пункт меню, при этом изменив его до такого состояния (здесь тоже нужно указать адрес своего NFS-сервера):
    label live-686-pae
            menu label BOINC-live (686-pae)
            linux images/debian-live/vmlinuz1
            initrd images/debian-live/initrd1.img
            append boot=live config nosplash root=/dev/nfs nfsroot=192.168.15.20:/srv/debian-live

    Теперь всё лежит на своих местах.

    Если после сборки хочется проверить содержимое корневой ФС, то не обязательно загружаться с нею, её можно просто смонтировать как loop-устройство:
    mount -o loop,ro /srv/debian-live/live/filesystem.squashfs /mnt/squash/

    Если нужно пересобрать дистрибутив с новыми параметрами, то перед этим можно сделать либо lb clean --binary, либо lb clean.

    Использование


    1. Включаем компьютер и выбираем загрузку по сети (обычно для этого достаточно нажать F12).
    2. В зависимости от загрузочного меню либо выбираем пункт «BOINC-live», либо просто ждём, пока загрузится по таймауту.
    3. В появившуюся (если всё пошло как надо) командную строку пишем sudo ifconfig (пароль вводить не потребуется) и записываем IP-адрес.
    4. На компьютере управления (одном из тех, что мы указали в config/includes.chroot/etc/init.d/boinc-preps) запускаем boinc-manager, нажимаем «Дополнительно — Сменить компьютер» (эта кнопка есть только в «Полном виде»). При этом BOINC не должен запрашивать никаких паролей у пользователя.
    5. После подключения появится мастер, в котором нужно будет выбрать проект (в моём случае это World Community Grid) и ввести логин/пароль.

    Всё, через несколько минут появятся новые задачи в состоянии «Готово к запуску» и «Работает».
    Эту процедуру нужно выполнить только один раз для каждого компьютера (точнее, для каждого MAC-адреса). Даже вернувшись к вам после длительной эксплуатации в другом месте, компьютер по MAC-адресу найдёт свои данные на NFS-сервере и продолжит работу сразу после включения (только некоторые задания будут уже просрочены, но это мелочь, получит новые).

    Итоги


    Что осталось нерешённым:
    • Автологин в WCG. Наверное, можно вшить в образ конфиг проекта, чтобы вообще ничего не вводить руками, но за приемлемое время решение не нагуглилось.
    • Почтовые уведомления. Чтобы не вводить «sudo ifconfig», можно автоматом отсылать админу адрес запустившегося компьютера. Однако, я этого не сделал, потому что костыли, и лучше вместо этого реализовать предыдущий пункт.
    • Два раза указан IP NFS-сервера, возможно, один из них можно убрать.
    • Для создания директории компьютера всегда используется MAC-адрес интерфейса eth0. Хорошо это или нет — я не могу с уверенностью сказать.

    • Не давайте компьютерам скучать! И пишите комментарии, с радостью отвечу или дополню статью.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 10

      0
      Почему бы на поставить клиент BOINC вообще всем? В большинстве своем процессоры сейчас многоядерные, а ПК используются в качестве печатной машинки, так что одно ядро можно легко пожертвовать. Я такой проект запускал на своей кафедре в университете еще лет 7 назад, почти никто не жаловался.
        0
        Слишком много разношёрстных компьютеров. Чтобы ультимативно ставить всем, надо быть уверенным, что на всём железе, с любыми комбинациями софта, при любых кейсах использования BOINC не создаст проблем пользователю и людям, сопровождающим рабочие станции. При этом где-то от него не будет толку — слишком слабые машины или отсутствие интернета / извращённый интернет.

        Можно рассмотреть установку на отдельные группы компьютеров (например, в учебных классах), но сейчас на это нет административного ресурса.
          0
          Не так давно в одной организации админ так и сделал. Во первых часто создавало проблемы пользователям, во вторых счета за электричество выросли в несколько раз, в третьих было очень жарко в помещениях особенно летом. Поэтому полностью поддерживаю автора статьи — что вычисления должны быть добровольными и осознанными — тогда все будут довольны и процесс пойдет. А в той организации админу запретили все вычисления после многочисленных жалоб.
            0
            Бездумно сделал, скорее всего. На 2\4-ядерном процессоре один поток с минимальным приоритетом совершенно не влияет на производительность и почти не повышает суммарного энергопотребления. Только надо выбирать проекты с минимальным потреблением ОЗУ, диска и трафика, обычно это что-то из теории чисел. Когда машин в одном помещении десятки, то да, повысит температуру. Но в таких случаях надо без фанатизма, а если зимой, то пусть лучше процессоры с пользой науке греют, чем тупые батареи и кондиционеры.
              0
              Я думаю, что подход описанный в статье оптимальный — пользователь сам по своей инициативе делает полезное дело (и себя благороднее чувствует). И производительность выше — используют все ядра — если на ночь, то около 15 часов выходит + выходные.
                +1
                Но тогда реально эти вычисления влетают в копеечку, только не работнику, а работодателю. Я сомневаюсь, что если пользователю предложат оплатить амортизацию ПК и электричество, он будет ради благородства помогать миру. На мой взгляд, «простаивающие мощности» — это как раз низкая загрузка ПК во время рабочего дня, когда большая часть энергии и так тратится с минимальным выхлопом, а не полный простой ночью.
                  0
                  Как ни крути, соотношение электричество/вычисления будет сопоставимым. В вашем предложении просто и электричества меньше и вычислений меньше, причем вся ответственность на админе. При чем если у пользователей что-то заглючит, то обязательно «виноваты вычисления» и админ. Ваш вариант тоже вливается в копеечку работадателю, только меньше, при чем есть риск разных казусов (windows любит на одно ядро и вычисления и рабочую задачу вешать и т.п.), из-за которых бывают простои в работе- что может конкретно вливаться в копеечку работодателю.
                    0
                    Конечному пользователю вообще не обязательно об этом знать. Меньше знаешь — крепче спишь. И бизнес-процессы бывают разные, частенько работнику нужно сделать пару накладных за день, тут уж ничего не пострадает.
          +1
          > Включил компьютер, нажал F12, выбрал нужный пункт — и уже приносишь пользу человечеству!

          Философский вопрос: можно ли с формальной точки зрения определить что есть «польза человечеству», а что таковой не является?
          Например, «Час Земли», когда все выключают по-возможности электрические приборы, тоже позиционируется как «благо для человечества», ибо позволяет сэкономить энергию. Хоть капельку.
            0
            Вспомним пусковые токи и забудем «Час Земли» с ужасом и нафиг

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое