boinc/tools/calculate_credit_multiplier

108 lines
3.9 KiB
Plaintext
Raw Normal View History

#! /bin/sh
DECAY_TIME=30*86400
RUN_INCREMENT=86400
MAX_NRESULTS=10000
FILE_DELETE_READY=1
FILE_DELETE_DONE=2
FILE_DELETE_ERROR=3
dbhost=`grep db_host ../config.xml | tr '[\<\>]' '[ ]' | head -1 | awk '{print $2}'`
replica_dbhost=`grep replica_db_host ../config.xml | tr '[\<\>]' '[ ]' | head -1 | awk '{print $2}'`
dbuser=`grep db_user ../config.xml | tr '[\<\>]' '[ ]' | head -1 | awk '{print $2}'`
dbname=`grep db_name ../config.xml | tr '[\<\>]' '[ ]' | head -1 | awk '{print $2}'`
if test ! -z "${replica_dbhost}" ; then
slave_gap=`mysql -E -h ${replica_dbhost} --execute="show slave status" | grep Seconds_Behind_Master | awk '{print $2}'`
fi
if test -z "${replica_dbhost}" || test "$slave_gap" = "NULL" || test $slave_gap -gt $RUN_INCREMENT ; then
replica_dbhost=${dbhost}
fi
MYSQL="mysql -D $dbname -h $dbhost -u $dbuser -N -B"
MYSQL_R="mysql -D $dbname -h $replica_dbhost -u $dbuser -N -B"
function median_host_query() {
$MYSQL --execute="
create temporary table medians (id int auto_increment primary key)
select $1 from host
where rpc_time>unix_timestamp(now())-($DECAY_TIME)
and credit_per_cpu_sec>0
order by $1;
create temporary table ids
select round(avg(id)-0.5) as id from medians;
insert into ids select round(avg(id)+0.5) from medians;
select avg($1) from medians where id in (
select id from ids
);
drop table medians;
drop table ids;"
}
function get_recent_credited_results() {
$MYSQL_R --execute="
set session transaction isolation level read uncommitted;
create temporary table recent_results
select
granted_credit,
cpu_time,
hostid,
p_fpops,
p_iops
from host,result where
file_delete_state in ($FILE_DELETE_READY,$FILE_DELETE_DONE) and
granted_credit>0 and
received_time>unix_timestamp(now())-$DECAY_TIME and
unix_timestamp(result.mod_time)>unix_timestamp(now())-$RUN_INCREMENT and
host.rpc_time>unix_timestamp(now())-$DECAY_TIME and
appid=$1 and
result.hostid=host.id
limit $MAX_NRESULTS;
create temporary table merged_results
select sum(granted_credit)/sum(cpu_time) as granted_rate,
hostid,
(p_fpops+p_iops)*5.787037037037e-13 as bench_rate
from recent_results
group by hostid;
create temporary table medians (id int auto_increment primary key)
select (bench_rate+1e-10)/(granted_rate+1e-10) as mult
from merged_results
order by mult;
create temporary table ids
select round(avg(id)-0.5) as id from medians;
insert into ids select round(avg(id)+0.5) from medians;
select avg(mult) from medians where id in (
select id from ids
);
drop table ids;
drop table medians;
drop table merged_results;
drop table recent_results;"
}
appids=`$MYSQL --execute="select id from app where deprecated=0 and beta=0"`
for appid in $appids ; do
ratio=`get_recent_credited_results $appid`
nrows=`$MYSQL --execute="select count(id) from credit_multiplier where appid=$appid"`
if [ $nrows = 0 ] ; then
$MYSQL --execute="insert into credit_multiplier values (0,$appid,unix_timestamp(now())-86400,1.0)"
fi
last_value=`$MYSQL --execute="select multiplier from credit_multiplier where appid=$appid and (unix_timestamp(now())-time)=(select min(unix_timestamp(now())-time) from credit_multiplier where appid=$appid)"`
echo -n "appid=${appid} last_value=${last_value}"
last_time=`$MYSQL --execute="select unix_timestamp(now())-time from credit_multiplier where appid=$appid and (unix_timestamp(now())-time)=(select min(unix_timestamp(now())-time) from credit_multiplier where appid=$appid)"`
echo -n " desired_value=${ratio}"
value=`$MYSQL --execute="select ($last_value*(($DECAY_TIME)-$last_time)+$ratio*$last_time)/($DECAY_TIME)"`
echo -n " new_value=${value}"
echo
$MYSQL --execute="insert into credit_multiplier values (0,$appid,unix_timestamp(now()),$value);"
done
exit 0