2014-04-13 00:04:35

Домашний майнинг с водяным охлаждением

Linux Хобби Моддинг Железо

В сезон активного развития крипто валют решил и я попробовать себя в этом народном развлечении. Основной целью было, правда, не извлечение прибыли, а создание решения для майнинга в домашних условиях с максимальной эффективностью при минимальном шуме.

Как известно, самый популярный способ майнинга валют основанных на scrypt алгоритмах - это использование обычных топовых видео карт для перебора хэшей. Причем эффективность этого процесса пропорциональна естественно мощности карт и их количеству. Таким образом энтузиасты собирали целые фермы, где на одну материнскую плату приходилось 2-5 видюх и вся эта конструкция занималась круглосуточно вычислениями. Естественно охлаждающие системы видео карт не рассчитаны на то, что карта будет постоянно под 100% нагрузкой, а рядом от нее будут такие же грелки. Поэтому для того чтоб не пожечь карты их приходилось разносить подальше друг от друга, а в идеале еще и обеспечивать приток холодного воздуха для системы охлаждения. В результате получались просто монстры, которые еще и гудели как идущий на взлет самолет.

Естественно уподобляться массам, которые собирают фермы которые занимают место и издают много шума у меня не было ни желания ни возможности, банально не было даже помещения где все это расположить. От этого задача становилась еще интереснее: нужно было создать майнер, который был бы компактным, да еще и не шумел при полной нагрузке, ну или шумел так чтоб его можно было держать в квартире и одновременно там жить.

Выбор видео карт

Началось все естественно с выбора видео карт. Нужно было найти карту с наилучшим соотношением производительность (в количестве хэшей) и энергопотребление. Да именно потребление энергии основная проблема тк при майнинге видео карта потребляет весьма много электричества. Ну и цена тоже играла не последнюю роль.

После долгих поисков, чтения профильных форумов, спецификаций и расчетов был выбран Radeon R9 290, который по соотношению количество мегахэшей на ватт электричества оказался более эффективен, чем его старший и более дорогой товарищ Radeon R9 290X. Невероятно но факт.


Далее, оценив свои амбиции и соотнеся их с финансами, стало понятно, что хочется собрать майнер из 4 карт, но позволить себе могу только 3, таким образом, выбор дальнейших компонентов был ориентирован на 3 карты, но с возможностью расширения до 4.

Платформа

Далее выбор строился исходя из позиции получить все что необходимо с минимальными вложениями. Основополагающим стал выбор материнской платы, нужна была такая в которую бы можно было вставить 4 карты с разъемом PCI-E x16, при этом поскольку карты мощные толщиной с 2 слота, то разъемы на плате должны быть расположены соответствующим образом. Это сильно сократило выбор плат и сместило его в сторону дорогих игровых моделей. Не буду тут описывать все муки выбора, но в результате выбралась GIGABYTE GA-Z87X-OC. На ней есть куча всяких наворотов для разгона, множество разъемов для подключения дополнительных вентиляторов, но больше всего порадовало наличие отдельного разъема для подключения помпы водяного охлаждения.

Отдельных слов заслуживает выбор блока питания. Поскольку R9 290 при полной нагрузке потребляет порядка 300 Ватт (в отличие от почти 350 Ватт 290X), то нужен был блок который вытянет на себе 4 таких потребителя плюс все остальное. Также очень важным моментом было то, чтоб БП имел достаточно разъемов для подключения всех видео карт, а ведь каждая это 6 + 8 pin. После некоторых колебаний был выбран Chieftec GPM-1250C 1250W который впритирку должен потянуть 4 карты с минимальным остатком для питания всего остального. Но на этапе 3 карт он справлялся с запасом.

Корпус стал также очень важным элементом системы потому, что тут нужно было впихнуть максимум в минимальные размеры. Основным критерием для выбора корпуса стало 8 слотов для плат расширения сзади (каждый Radeon занимеат по 2, значит нужно минимум 8), а далее по цене. В результате выбрался крайне удачный вариант Antec One Hundred в котором было все что нужно и ничего лишнего, при этом стоимость была крайне демократичной, а размер очень компактным, я бы даже сказал самый компактный который только может быть для размещения такой начинки.

Все остальные компоненты выбирались по принципу чем дешевле - тем лучше. Итак вот что получилось в итоге:

Наименование Модель Цена на март 2014
Плата GIGABYTE GA-Z87X-OC (rev. 1.0) 7247 руб.
Процессор Intel Celeron G1820 Haswell (2700MHz, LGA1150, L3 2048Kb) 1515 руб.
Память 2x Hynix DDR3 1333 DIMM 4Gb 2x 1298 руб.
Видео 3x ASUS Radeon R9 290X 1030Mhz PCI-E 3.0 4096Mb 5000Mhz 512 bit 2xDVI HDMI HDCP 3x 18498 руб.
Кулер TITAN DC-156B925B/RPW1 (1156) 275 руб.
Корпус Antec ONE HUNDRED, ATX, без БП 2361 руб.
SSD SATA2 64Гб Transcend SSD630 ( TS64GSSD630 ) 2000 руб.
БП Chieftec GPM-1250C 1250W 9010 руб.

Цены именно те за которые все покупалось, находилось по маркету с минимальной ценой чтоб было в наличии. Процесс покупки занял весь день тк пришлось изрядно покататься по Москве чтоб все достать за минимальную цену. Отдельно негативное воспоминание оставили продавцы из XPERT.RU что на Савеловском, к которым пришел клиент потратить весьма приличную сумму (там покупались все видео карты, материнская плата и память), а они не то что о скидке разговаривать не стали, но и в целом крайне неприветливо отнеслись к клиенту. В общем остался кусок негатива от них.

Охлаждение

Штатное воздушное охлаждение справляется с полностью нагруженными тремя картами только в условиях открытого корпуса, который стоит на балконе с температурой воздуха +0...+5 градусов, при этом имеет тенденцию к постепенному прогреванию балкона. В помещении с комнатной температурой воздушное охлаждение перестает справляться еще быстрее.

Концепция охлаждения была в целом понятна с самого начала, с такими мощностями по выделению тепла, не занимая много места, да еще и не создавая шума, может справиться только вода. В целом общая компоновка элементов системы жидкостного охлаждения была придумана еще на этапе выбора корпуса: предполагалось уместить все, включая помпу и радиатор, внутри корпуса.

Самой загвоздкой с жидкостным охлаждением было то, что в России (на момент постройки майнера) нет готовых радеонов с предустановленным блоком водяного охлаждения. Они есть за рубежом и есть всего 2 фирмы которые делают водяное охлаждение для AMD Radeon R9 290. После анализа продукции и цен этих производителей выбор пал на EKWB (EK Water Blocks). Тамошние менеджеры помогли подобрать все необходимые компоненты и после оплаты отправили в Россию. Вот то, что было заказано:

Наименование Модель Стоимость на март 2014
Блок жидкостного охлаждения для Radeon R9 290 3x EK-FC R9-290X 3x € 76.19
Пластиковая трубка 3x PrimoChill PrimoFlex™ Advanced LRT™ 12,7 / 9,5mm (PFLEXA-12) 3x € 5.49
Фиттинг 4x EK-CSQ Fitting 10/13mm G1/4 - Nickel 4x € 3.32
Помпа с баком для жидкости EK-DCP 4.0 X-RES (incl. pump) € 73.29
Радиатор EK-CoolStreamPE 360 (Triple)
€ 52.46
Терминал для соединения блоков охлаждения
EK-FC Terminal QUAD Semi-Parallel € 23.29
Заглушка для терминала
EK-FC Terminal BLANK Parallel
€ 3.71
Переходник 2x EK-Extender G1/4 - Nickel
2x € 1.83
Фиттинг Г-образный
2x EK-PSC Adapter 90° G1/4 Black 2x € 4.12

К стоимости майнера прибавилось почти 500 евро, а к интересным задачам - процедура растаможки заветной посылки.

Таможенная очистка

Можно было поручить процедуру таможенной очистки службе доставки груза, но по их условиям получалось что стоить это будет минимум 2000 руб + та сумма которую они сами придумают за груз. По слухам растаможка посылок подобных моей выходила гораздо дороже. На всякий случай решил все сделать сам. Неким чудом ранним утром в собственный день рождения я оказался первым в очереди на растаможку в аэропорту Внуково.

Процедура в общем не сложная: приезжаешь в аэропорт в специальный терминал, бросаешь машину далеко от него вдоль дороги потому что вблизи ставить вообще нельзя, приходишь в офис грузоперевозчика, по треку и паспотру получаешь бумажки, заполняешь их и идешь к таможеннику, там отдаешь бумажки, рассказываешь что к чему, заполняешь еще бумажки и получаешь ту заветную с которой идешь обратно к грузоперевозчику. Самое смешное, что груз тебе никто не отдает, хоть он и находится в шаговой доступности от тебя, а едешь из аэропорта домой и там через несколько дней ждешь когда доставка грузоперевозчика тебе его привезет.

Все было бы действительно смешно, если б не было так печально. Массу времени занимает ожидание на таможне в пустом зале когда обслуживающий тебя сотрудник еще не подошел или отошел с твоими документами. Много нервов отъедает процесс заполнения декларации, где слово в слово надо заполнить все позиции из заказа как в накладной и умудриться чтоб все влезло в маленькие поля таблички. Самый нонсенс, что нужно напротив каждой позиции указать точный вес, которого не знает никто: в накладной от продавца его нет, а везде где фигурирует вес, есть только общий вес посылки. Процедура примерного раскидывания общего веса на позиции также заняла время и нервы тк пришлось все придумывать самому тк никто не знает что делать в этой ситуации.

Самое самое - это было объяснить таможне что же такое ты тут пытаешься растаможить. В моем случае было еще интереснее. Таможенник - женщина, которая вышла недавно после декрета, правда уже не молода (видимо декрет не первый), а над ней стоит, просто нависает, старший товарищ, который к ней приставлен как к с стажеру, контролирует каждый шаг, и раздувается изо всех сил чтоб показать свою важность, и крайне активно участвует в процессе. Объяснить этой паре что же такое блок жидкостного охлаждения для видео карты было задачей совсем не тривиальной. Помпа, фиттинги и прочее не вызывало такого интереса и достаточно быстро было понято на аналогах, но вот блок жидкостного охлаждения для видео карты! И только когда почти отчаявшись я рассказал процесс демонтажа воздушного и установку водяного, удивительное прозрение появилось в глазах работника таможни, идея того что вентилятор с радиатором меняются на это была понята, хоть и вызывала удивление, и стажеру сказано что все нормально.

В довершение картины была еще заморочка с подтверждение платежа тк печатной выписки об операциях со сбербанк онлайна и paypal оказалось не достаточно. Из сбербанк онлайн оказывается требовался принтскрин с моими фио о списком операций или выписка из банка на фирменно бланке с печатью. Благо все решилось ксероксом моей пластиковой карты с которой платил, закрыв среднюю часть номера.

Проект монстра

Получив все компоненты я занялся реализацией задуманного проекта, по задумке получался действительно монстр в компактном исполнении. В общем идея выглядела так: в передней части корпуса планировалось разместить радиатор системы охлаждения (на лицевой стороне большая решетка, можно обеспечить хороший приток воздуха), на нем вентиляторы (Fan Position A), за радиатором сверху разместить помпу (Pump position A), снизу оказалось нереально из-за обилия проводов от БП.

Весь нагнетаемый в корпус воздух с радиатора планировалось вытягивать при помощи 3 корпусных вентиляторов и вентилятора БП. Температура воздуха после радиатора должна быть не так высока и ее будет достаточно для использования этого воздуха для охлаждения процессора, блока питания и обдува остальных компонентов.

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

Реализация

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

Вид спереди, радиатор с установленными вентиляторами:

Вид изнутри, крепеж для помпы на фоне радиатора:

Вид сверху, отверстие для доступа к помпе (в собранном состоянии скрыто пластиковой накладкой корпуса):

Вид изнутри, примерка радиатора, помпы и блока питания:

Вид изнутри, установлена материнская плата, радиатор и помпа со шлангами для жидкости:

А вот так выглядит Radeon R9 290 с установленными блоками водяного охлаждения:

И собранные все вместе в терминал:

Полностью собранная система выглядит вот так:

Охлаждающая жидкость

Производитель и продавцы систем жидкостного охлаждения в один голос кричат что нужно только оригинальную жидкость от производителя за бешеные деньги. Но в результате беседы с менеджером из EKWB выяснилось, что можно использовать и автомобильный антифриз, разведенный дистиллированной водой в соотношении 1:10, и никаких внятных противопоказаний нет.

В довершение картины я накопал целое исследование на предмет разных жидкостей в системах водяного охлаждения http://olgol.narod.ru/pages/hardware_watecool_4.html. Выдержку из выводов которого приведу здесь:

Импортный антифриз - это идеальное средство для заправки системы водяного охлаждения. Варьируя сочетания воды и концентрата антифриза можно подобрать идеальный вариант когда удельная теплоемкость будет высокой, коррозия будет минимизирована, а в воде не будут жить бактерии и микроорганизмы.

Автор рекомендует 30% антифриза, я для себя решил использовать 10% опираясь на рекомендацию производителя.

В результате температура видео карт под полной нагрузкой не поднимается выше 65 градусов, железка не гудит, слышно только тихий шум насоса и иногда звук воды если прислушаться. При длительном использовании майнер вполне справляется с задачей обогрева помещения в котором работает и становится более шумным за счет того что разгоняются вентиляторы на радиаторе и становится слышен шум воздуха. В целом жить (спать) с такой штукой в одной комнате конечно не реально, но размещая его в нежилой комнате, где можно иногда открывать окно вполне приемлемо.

Программная часть

Изначально было решено отказаться от винды, как от не подходящей для серьезных задач и пожирающей ресурсы впустую, выбор был сделан в пользу Linux. конкретно Ubuntu Server.

Был собран cgminer с использованием исходников драйверов AMD и получен вот такой результат: 2.5 мегахеша в секунду при температуре 65 градусов. Потребляемая мощность: 1030W под полной нагрузкой.

2.5+ Mh/s

На этом пока все, надеюсь когда-нибудь осилю дописать подробности про тонкости сборки и настройки софта.

PS об автоматическом охлаждении

Для того чтоб упростить себе использование системы был сделан инструмент Radeon Control, который позволяет удобно смотреть что происходит с картами и управлять охлаждением, вот его код, размещенный в /usr/local/comcom/radeonctl:

#!/bin/bash
export DISPLAY=:0
echo "Radeon Control 0.1 by Rebel [ www.aleksandr.ru ]"
IFS='
'
ADAPTERS=($(DISPLAY=:0 aticonfig --list-adapters | grep Radeon | sed 's/*//' | awk '{print $3,$4,$5,$6,$7}'))
unset IFS
NADAPTERS=${#ADAPTERS[@]}
if [ $NADAPTERS == 0 ]
then
 echo "No adapters found! Try aticonfig --list-adapters"
 exit 1
fi
ARGS=("$@")
NARGS=${#ARGS[@]}
#for arg in "${ARGS[@]}"
for ((i=0; i<$NARGS; i++))
do
 arg=${ARGS[$i]}
 n=i+1
 arg2=${ARGS[$n]}
 case $arg in
  --help)
   echo "`basename ${0}` usage: [-a num] [-f percent]"
   echo " -a adapter : use adapter number num"
   echo " -f percent : set fan to percent speed"
   echo " --auto-cool : set fan speed to cool current temperature"
   echo " --get-max-temp : get maximum tempearure of adapters"
   echo " --help : this message :)"
   exit 1
   ;;
  --auto-cool)
   AUTOCOOL=1
   echo "Setting fan speed to cool for current temperature"
   ;;
  --get-max-temp)
   MAXTEMP=1
   #echo "Current maximum temperature is "
   ;;
  -a)
   ADAPTERNUM=$arg2
   if [ "$ADAPTERNUM" == "" ]
   then
    echo "No adapter defined! Please input adaper number!";
    exit 1
   elif [ $ADAPTERNUM -ge $NADAPTERS ]
   then
    echo "No such adapter num!";
                                exit 1
   fi
   echo "Using adapter $ADAPTERNUM"
   ;;
  -f)
   SETFANSPD=$arg2
   if [ "$SETFANSPD" == "" ]
                        then
                                echo "No fan speed defined! Please input fan speed percent!";
                                exit 1
                        fi
                        echo "Setting fan speed to $SETFANSPD %"
                        ;;
  *)
         #nothing to do)
   ;;
 esac
done
#exit 0
if [[ -n "$SETFANSPD" ]]
then
 for ((i=0; i<$NADAPTERS; i++))
 do
         if [[ -n "$ADAPTERNUM" ]] && [ $ADAPTERNUM != $i ]
         then
                 continue
         fi
  DISPLAY=:0.$i aticonfig --pplib-cmd "set fanspeed 0 $SETFANSPD"
  if [ "$?" -ne "0" ]
  then
   echo "Error $?"
  fi
 done
 #exit $?
elif [[ -n "$AUTOCOOL" ]]
then
 for ((i=0; i<$NADAPTERS; i++))
        do
                if [[ -n "$ADAPTERNUM" ]] && [ $ADAPTERNUM != $i ]
                then
                        continue
                fi
  TEMP=`aticonfig --adapter=$i --odgt | grep 'Temperature' | awk '{print $5}' | sed 's/.00$//'`
  if [ $TEMP -ge 90 ]
  then
   SETFANSPD=100
  elif [ $TEMP -ge 80 ]
  then
   SETFANSPD=80
  elif [ $TEMP -ge 70 ]
  then
   SETFANSPD=60
  elif [ $TEMP -ge 60 ]
  then
   SETFANSPD=40
  else
   SETFANSPD=20
  fi
  DISPLAY=:0.$i aticonfig --pplib-cmd "set fanspeed 0 $SETFANSPD"
                if [ "$?" -ne "0" ]
                then
                        echo "Error $?"
                fi
        done
        #exit $?
elif [[ -n "$MAXTEMP" ]]
then
 for ((i=0; i<$NADAPTERS; i++))
        do
  TEMP=`aticonfig --adapter=$i --odgt | grep 'Temperature' | awk '{print $5}' | sed 's/.00$//'`
  if [ $TEMP -gt $MAXTEMP ]
  then
   MAXTEMP=$TEMP
  fi
 done
 echo "Current maximum temperature is $MAXTEMP C"
 exit 0
fi
MAXLEN=0
for ((i=0; i<$NADAPTERS; i++))
do
 if [ ${#ADAPTERS[$i]} -gt $MAXLEN ]
 then
  MAXLEN=${#ADAPTERS[$i]}
 fi
done
#echo $MAXLEN
printf "\n№ %-${MAXLEN}s GPU load Core clock Memory clock Temperature Fan speed\n" 'Adapter'
#echo -e "\n№ Adapter\t\t\tGPU load\tCore clock\tMemory clock\tTemperature\tFan speed"
for ((i=0; i<$NADAPTERS; i++))
do
 if [[ -n "$ADAPTERNUM" ]] && [ $ADAPTERNUM != $i ]
 then
  continue
 fi
 GPULOAD=`aticonfig --adapter=$i --od-getclocks | grep 'GPU load :' | awk '{print $4}'`
 GPUMHZ=`aticonfig --adapter=$i --od-getclocks | grep 'Current Clocks :' | awk '{print $4}'`
 MEMMHZ=`aticonfig --adapter=$i --od-getclocks | grep 'Current Clocks :' | awk '{print $5}'`
 TEMP=`aticonfig --adapter=$i --odgt | grep 'Temperature' | awk '{print $5}'`
 FANSPD=`DISPLAY=:0.$i aticonfig --pplib-cmd "get fanspeed 0" | grep 'Result: Fan Speed:' | awk '{print $4}'`
 #echo -e "$i ${ADAPTERS[$i]}\t$GPULOAD\t\t$GPUMHZ MHz\t\t$MEMMHZ MHz\t\t$TEMP\t\t$FANSPD"
 printf "$i ${ADAPTERS[$i]} %8s %6s MHz %8s Mhz %9s C %11s\n" $GPULOAD $GPUMHZ $MEMMHZ $TEMP $FANSPD
done

Так же был изменен конфиг /etc/fancontrol, но его нужно поправлять каждый раз после выполнения pwmconfig:

# Configuration file generated by pwmconfig, changes will be lost
INTERVAL=10
DEVPATH=hwmon1=devices/platform/coretemp.0 hwmon2=devices/platform/it87.2608
DEVNAME=hwmon1=coretemp hwmon2=it8728
#FCTEMPS=hwmon2/device/pwm3=hwmon1/device/temp1_input hwmon2/device/pwm2=hwmon1/device/temp1_input hwmon2/device/pwm1=hwmon1/device/temp1_input
FCTEMPS=hwmon2/device/pwm3=/var/run/gputemp hwmon2/device/pwm2=/var/run/gputemp hwmon2/device/pwm1=/var/run/gputemp
FCFANS=hwmon2/device/pwm3=hwmon2/device/fan3_input hwmon2/device/pwm2=hwmon2/device/fan2_input hwmon2/device/pwm1=hwmon2/device/fan1_input
MINTEMP=hwmon2/device/pwm3=40 hwmon2/device/pwm2=40 hwmon2/device/pwm1=40
MAXTEMP=hwmon2/device/pwm3=70 hwmon2/device/pwm2=70 hwmon2/device/pwm1=70
MINSTART=hwmon2/device/pwm3=60 hwmon2/device/pwm2=60 hwmon2/device/pwm1=60
MINSTOP=hwmon2/device/pwm3=45 hwmon2/device/pwm2=45 hwmon2/device/pwm1=45

И для того чтоб обеспечить его данными в cron:

#gpu max temperature
* * * * * /usr/local/comcom/radeonctl --get-max-temp | grep temperature | awk '{print $5*1000}' > /var/run/gputemp

Благодаря этому fancontrol ежеминутно получает данные о температуре видео карт и управляет скоростью вентиляторов, охлаждающих воду.