|
|
@ -817,6 +817,11 @@ static void stratum_send_diff(stratum_instance_t *client) |
|
|
|
stratum_add_send(json_msg, client->id); |
|
|
|
stratum_add_send(json_msg, client->id); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static double time_bias(double tdiff, double period) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return 1.0 - 1.0 / exp(tdiff / period); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void add_submit(stratum_instance_t *client, int diff, bool valid) |
|
|
|
static void add_submit(stratum_instance_t *client, int diff, bool valid) |
|
|
|
{ |
|
|
|
{ |
|
|
|
double tdiff, bdiff, dsps, drr, network_diff, bias; |
|
|
|
double tdiff, bdiff, dsps, drr, network_diff, bias; |
|
|
@ -829,7 +834,7 @@ static void add_submit(stratum_instance_t *client, int diff, bool valid) |
|
|
|
client->ssdc++; |
|
|
|
client->ssdc++; |
|
|
|
decay_time(&client->dsps5, diff, tdiff, 300); |
|
|
|
decay_time(&client->dsps5, diff, tdiff, 300); |
|
|
|
bdiff = tvdiff(&now_t, &client->first_share); |
|
|
|
bdiff = tvdiff(&now_t, &client->first_share); |
|
|
|
bias = 1.0 - 1.0 / exp(bdiff / 300.0); |
|
|
|
bias = time_bias(bdiff, 300); |
|
|
|
tdiff = tvdiff(&now_t, &client->ldc); |
|
|
|
tdiff = tvdiff(&now_t, &client->ldc); |
|
|
|
|
|
|
|
|
|
|
|
if (valid) { |
|
|
|
if (valid) { |
|
|
@ -857,7 +862,7 @@ static void add_submit(stratum_instance_t *client, int diff, bool valid) |
|
|
|
* stable */ |
|
|
|
* stable */ |
|
|
|
if (!(client->ssdc % 18)) { |
|
|
|
if (!(client->ssdc % 18)) { |
|
|
|
LOGNOTICE("Client %d worker %s hashrate %.1fGH/s", client->id, |
|
|
|
LOGNOTICE("Client %d worker %s hashrate %.1fGH/s", client->id, |
|
|
|
client->workername, client->dsps5 * 4.294967296); |
|
|
|
client->workername, dsps * 4.294967296); |
|
|
|
} |
|
|
|
} |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
@ -1422,12 +1427,47 @@ static void *statsupdate(void *arg) |
|
|
|
while (42) { |
|
|
|
while (42) { |
|
|
|
char suffix1[16], suffix5[16], suffix15[16], suffix60[16]; |
|
|
|
char suffix1[16], suffix5[16], suffix15[16], suffix60[16]; |
|
|
|
char suffix360[16], suffix1440[16]; |
|
|
|
char suffix360[16], suffix1440[16]; |
|
|
|
double ghs; |
|
|
|
const double nonces = 4294967296; |
|
|
|
|
|
|
|
double ghs, tdiff, bias; |
|
|
|
tv_t diff; |
|
|
|
tv_t diff; |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
|
|
tv_time(&diff); |
|
|
|
tv_time(&diff); |
|
|
|
timersub(&diff, &stats.start_time, &diff); |
|
|
|
timersub(&diff, &stats.start_time, &diff); |
|
|
|
|
|
|
|
tdiff = diff.tv_sec + (double)diff.tv_usec / 1000000; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bias = time_bias(tdiff, 60); |
|
|
|
|
|
|
|
ghs = stats.dsps1 * nonces / bias; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix1, 16, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bias = time_bias(tdiff, 300); |
|
|
|
|
|
|
|
ghs = stats.dsps5 * nonces / bias; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix5, 16, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bias = time_bias(tdiff, 900); |
|
|
|
|
|
|
|
ghs = stats.dsps15 * nonces / bias; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix15, 16, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bias = time_bias(tdiff, 3600); |
|
|
|
|
|
|
|
ghs = stats.dsps60 * nonces / bias; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix60, 16, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bias = time_bias(tdiff, 21600); |
|
|
|
|
|
|
|
ghs = stats.dsps360 * nonces / bias; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix360, 16, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bias = time_bias(tdiff, 86400); |
|
|
|
|
|
|
|
ghs = stats.dsps1440 * nonces / bias; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix1440, 16, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LOGNOTICE("Pool runtime: %lus Live clients: %d Dead clients: %d " |
|
|
|
|
|
|
|
"Reusable clients: %d Reused clients: %d", |
|
|
|
|
|
|
|
diff.tv_sec, stats.live_clients, stats.dead_clients, |
|
|
|
|
|
|
|
stats.reusable_clients, stats.reused_clients); |
|
|
|
|
|
|
|
LOGNOTICE("Pool hashrate: (1m):%s (5m):%s (15m):%s (1h):%s " |
|
|
|
|
|
|
|
"(6h):%s (1d):%s", |
|
|
|
|
|
|
|
suffix1, suffix5, suffix15, suffix60, suffix360, suffix1440); |
|
|
|
|
|
|
|
|
|
|
|
/* Update stats 4 times per minute for smooth values, displaying
|
|
|
|
/* Update stats 4 times per minute for smooth values, displaying
|
|
|
|
* status every minute. */ |
|
|
|
* status every minute. */ |
|
|
|
for (i = 0; i < 4; i++) { |
|
|
|
for (i = 0; i < 4; i++) { |
|
|
@ -1453,25 +1493,6 @@ static void *statsupdate(void *arg) |
|
|
|
stats.unaccounted_shares = stats.unaccounted_diff_shares = 0; |
|
|
|
stats.unaccounted_shares = stats.unaccounted_diff_shares = 0; |
|
|
|
mutex_unlock(&stats_lock); |
|
|
|
mutex_unlock(&stats_lock); |
|
|
|
} |
|
|
|
} |
|
|
|
ghs = stats.dsps1 * (double)4294967296; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix1, 16, 0); |
|
|
|
|
|
|
|
ghs = stats.dsps5 * (double)4294967296; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix5, 16, 0); |
|
|
|
|
|
|
|
ghs = stats.dsps15 * (double)4294967296; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix15, 16, 0); |
|
|
|
|
|
|
|
ghs = stats.dsps60 * (double)4294967296; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix60, 16, 0); |
|
|
|
|
|
|
|
ghs = stats.dsps360 * (double)4294967296; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix360, 16, 0); |
|
|
|
|
|
|
|
ghs = stats.dsps1440 * (double)4294967296; |
|
|
|
|
|
|
|
suffix_string(ghs, suffix1440, 16, 0); |
|
|
|
|
|
|
|
LOGNOTICE("Pool runtime: %lus Live clients: %d Dead clients: %d " |
|
|
|
|
|
|
|
"Reusable clients: %d Reused clients: %d", |
|
|
|
|
|
|
|
diff.tv_sec, stats.live_clients, stats.dead_clients, |
|
|
|
|
|
|
|
stats.reusable_clients, stats.reused_clients); |
|
|
|
|
|
|
|
LOGNOTICE("Pool hashrate: (1m):%s (5m):%s (15m):%s (1h):%s " |
|
|
|
|
|
|
|
"(6h):%s (1d):%s", |
|
|
|
|
|
|
|
suffix1, suffix5, suffix15, suffix60, suffix360, suffix1440); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
return NULL; |
|
|
|