Скрипт-обвязка для stratum-прокси Dwarfpool

Материал из Linux Wiki
Версия от 19:40, 13 марта 2016; Rain (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигацииПерейти к поиску

Обвязка вокруг stratum-прокси, изначально созданная для перезапуска прокси в случае обрывов соединения с интернетом. У прокси (тестировалось на v 0.0.4) был баг - при обрыве внешнего канала прокси об этом не знал и продолжал принимать шары от ригов и пытаться отправлять их на пул. Пул про это соединение ничего не знал и вся работа reject'илась. На основе этого и было решено сделать перезапуск. Первая версия скрипта имеет такую структуру. По факту накопления сообщений с reject'ами убивался процесс прокси, а внешний скрипт (бесконечный цикл со sleep'ом) делал новый запуск.

В дальнейшем функционал скрипта был расширен. Теперь, помимо основной функции, он строит статистику по принятой и отброшенной работе в целом, а также по воркерам в отдельности. Статистика по работе дополняет поток сообщений прокси колонкой слева. Статистика по воркерам выводится в потоке раз в 100 секунд.

Было также добавлено цветовое выделение шар. Сообщения с принятыми шарами выделяются зеленым, с отброшенными шарами - красным. При запуске прокси, для исключения ложных срабатываний (когда, например, одна из первых полученных шар отбрасывается, что дает высокий процент reject'ов по отношению к общей работе), сделано окно в 14 сообщений, в течение которого будет игнорироваться высокий процент reject'ов. Такие сообщения выделяются желтым.

Как и раньше, скрипт необходимо запускать в бесконечном цикле для перезапуска прокси.

while sleep 3 ; do /path/to/script /path/to/eth-proxy.py ; done

#!/bin/bash

[ -z "${1}" ] && exit 1

fpath="$(readlink -f "${1}")"
dpath="$(dirname "${fpath}")"
efile="$(basename "${fpath}")"

cd "${dpath}"

python "${efile}" 2>&1 | awk '

        BEGIN {
                sum=0
                w=0
                rej=0
                oldtime=0
        }

        {
                col="\033[0;0m"
        }

        /eth_submitWork/&&/protocol/{
                nl+=1
                w+=1
                sum=0
                wname=$9
                gsub(/'\''/, "", wname)
                if (nl>15) nl=0
                if ($0 ~ /REJECT/) {
                        rstat[wname]+=1
                        arr[nl]=1
                        rej+=1
                        col="\033[31m"
                } else {
                        astat[wname]+=1
                        arr[nl]=0
                        col="\033[32m"
                }

                for (i in arr) sum+=arr[i]
                if (arr[13]=="") col="\033[33m"
                        else if (sum*100/length(arr)>'30') system("pkill -f '$efile'")
        }

        {
                CONVFMT="%.2f"
                if (w=="0") st="na"
                        else {
                        st=rej*100/w
                        if (systime()-oldtime > 100) {
                                oldtime=systime()
                                print " ** Workers statistic ** "
                                for (s in astat)
                                        printf "%-24s %-15s %-8s %-8s %-6s\n", " ", "| "s":", "A:"astat[s], "R:"rstat[s]*100/(astat[s]+rstat[s])"%", "P:"(astat[s]+rstat[s])*100/w"%"
                        }
                }
                printf "%-8s %-8s %-6s | %s\033[0;0m\n", "A:"w, "R:" st "%", "WD:" sum, col $0

        }'