MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | #pragma strong_types,save_types,rtt_checks |
| 2 | #pragma no_clone |
| 3 | #pragma no_shadow |
| 4 | #pragma no_inherit |
| 5 | #pragma pedantic |
| 6 | |
| 7 | #include <driver_info.h> |
| 8 | |
| 9 | #ifndef DEBUG |
| 10 | #define DEBUG(x) if (find_player("zesstra"))\ |
| 11 | tell_object(find_player("zesstra"),"LAG: "+x+"\n") |
| 12 | #endif |
| 13 | |
| 14 | #define SAVEFILE __DIR__+"save/lag-o-daemon" |
| 15 | #define LOG(x) log_file("LAG",x,200000); |
| 16 | #define LOGMAX(x) log_file("LAGMAX",x,300000); |
| 17 | |
| 18 | // Anzahl an zu merkenden Werten (1800==3600s) |
| 19 | #define MESSWERTE 1800 |
| 20 | |
| 21 | nosave float hbstat, obstat; |
| 22 | nosave mapping lastwarning=([]); |
| 23 | nosave int *lasttime = utime(); |
| 24 | nosave int lasthbcount = absolute_hb_count(); |
| 25 | float *lagdata = allocate(MESSWERTE,0.0); |
| 26 | // Lags fuer die letzten 2s (1 HB), 20s (10 HB), 60s (30 HB), |
| 27 | // 300s (150 HB), 900s (450 HB), 3600s (1800 HB) |
| 28 | float *lag = allocate(6,0.0); |
| 29 | int *hbdata = allocate(MESSWERTE); |
| 30 | // Lags fuer die letzten 2s (1 HB), 20s (10 HB), 60s (30 HB), |
| 31 | // 300s (150 HB), 900s (450 HB), 3600s (1800 HB) |
| 32 | int *hbs = allocate(6); |
| 33 | int *codata = allocate(MESSWERTE); |
| 34 | // Lags fuer die letzten 2s (1 HB), 20s (10 HB), 60s (30 HB), |
| 35 | // 300s (150 HB), 900s (450 HB), 3600s (1800 HB) |
| 36 | int *callouts = allocate(6); |
| 37 | |
| 38 | void create() { |
| 39 | seteuid(getuid()); |
| 40 | // Bei nicht einlesbaren Savefile und nach Reboot Werte neu initialisieren. |
| 41 | // Denn dann ist die Differenz der HBs bedeutungslos. Erkennung ploetzlich |
| 42 | // kleinere HB-Zahl. |
| 43 | if (!restore_object(SAVEFILE) |
| 44 | || efun::driver_info(DI_NUM_HEARTBEAT_TOTAL_CYCLES) < lasthbcount) |
| 45 | { |
| 46 | lagdata = allocate(MESSWERTE,0.0); |
| 47 | lag = allocate(6,0.0); |
| 48 | hbdata = allocate(MESSWERTE); |
| 49 | hbs = allocate(6); |
| 50 | codata = allocate(MESSWERTE); |
| 51 | callouts = allocate(6); |
| 52 | } |
| 53 | set_heart_beat(1); |
| 54 | } |
| 55 | |
| 56 | int remove(int silent) { |
| 57 | save_object(SAVEFILE); |
| 58 | destruct(this_object()); |
| 59 | return 1; |
| 60 | } |
| 61 | |
| 62 | // liefert Mittelwertarray zurueck |
| 63 | //TODO: <int|string>* results |
Arathorn | 5a409d3 | 2024-08-27 20:59:09 +0200 | [diff] [blame] | 64 | private mixed calc_averages(mixed data, mixed results, int index, |
| 65 | float scale=1.0) { |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 66 | float tmp; |
| 67 | int t; |
| 68 | |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 69 | // 2s |
| 70 | results[0] = to_float(data[index]) * scale; |
| 71 | |
| 72 | // alle 10s / 5 HBs den 20s-Wert neu berechnen |
| 73 | if ( index%5 == 1) { |
| 74 | if (index<9) { |
| 75 | foreach(int i: index-4+MESSWERTE .. MESSWERTE-1) { |
| 76 | tmp+=data[i]; |
| 77 | t++; |
| 78 | } |
| 79 | foreach(int i: 0 .. index) { |
| 80 | tmp+=data[i]; |
| 81 | t++; |
| 82 | } |
| 83 | } |
| 84 | else { |
| 85 | foreach(int i: index-9 .. index) { |
| 86 | tmp+=data[i]; |
| 87 | t++; |
| 88 | } |
| 89 | } |
| 90 | results[1]=tmp/to_float(t) * scale; |
| 91 | } |
| 92 | |
| 93 | // alle 10s / 5 HBs den 60s-Wert neu berechnen, aber in anderem HB als den |
| 94 | // 10s-Wert |
| 95 | if ( index%5 == 3) { |
| 96 | tmp=0.0; |
| 97 | t=0; |
| 98 | if (index<29) { |
| 99 | foreach(int i: index-14+MESSWERTE .. MESSWERTE-1) { |
| 100 | tmp+=data[i]; |
| 101 | t++; |
| 102 | } |
| 103 | foreach(int i: 0 .. index) { |
| 104 | tmp+=data[i]; |
| 105 | t++; |
| 106 | } |
| 107 | } |
| 108 | else { |
| 109 | foreach(int i: index-29 .. index) { |
| 110 | tmp+=data[i]; |
| 111 | t++; |
| 112 | } |
| 113 | } |
| 114 | results[2]=tmp/to_float(t) * scale; |
| 115 | } |
| 116 | |
| 117 | // 300s |
| 118 | // alle 40s / 20 HBs den 300s-Wert neu berechnen. |
| 119 | if ( index%20 == 12) { |
| 120 | tmp=0.0; |
| 121 | t=0; |
| 122 | if (index<149) { |
| 123 | foreach(int i: index-74+MESSWERTE .. MESSWERTE-1) { |
| 124 | tmp+=data[i]; |
| 125 | t++; |
| 126 | } |
| 127 | foreach(int i: 0 .. index) { |
| 128 | tmp+=data[i]; |
| 129 | t++; |
| 130 | } |
| 131 | } |
| 132 | else { |
| 133 | foreach(int i: index-149 .. index) { |
| 134 | tmp+=data[i]; |
| 135 | t++; |
| 136 | } |
| 137 | } |
| 138 | results[3]=tmp/to_float(t) * scale; |
| 139 | } |
| 140 | |
| 141 | |
| 142 | // 900s |
| 143 | // alle 80s / 40 HBs den 900s-Wert neu berechnen. |
| 144 | if ( index%40 == 31) { |
| 145 | tmp=0.0; |
| 146 | t=0; |
| 147 | if (index<449) { |
| 148 | foreach(int i: index-224+MESSWERTE .. MESSWERTE-1) { |
| 149 | tmp+=data[i]; |
| 150 | t++; |
| 151 | } |
| 152 | foreach(int i: 0 .. index) { |
| 153 | tmp+=data[i]; |
| 154 | t++; |
| 155 | } |
| 156 | } |
| 157 | else { |
| 158 | foreach(int i: index-449 .. index) { |
| 159 | tmp+=data[i]; |
| 160 | t++; |
| 161 | } |
| 162 | } |
| 163 | results[4]=tmp/to_float(t) * scale; |
| 164 | } |
| 165 | |
| 166 | // 3600s |
| 167 | // alle 300s / 150 HBs den 3600s-Wert neu berechnen. |
| 168 | if ( index%150 == 128) { |
| 169 | tmp=0.0; |
| 170 | t=0; |
| 171 | if (index<1799) { |
| 172 | foreach(int i: index-899+MESSWERTE .. MESSWERTE-1) { |
| 173 | tmp+=data[i]; |
| 174 | t++; |
| 175 | } |
| 176 | foreach(int i: 0 .. index) { |
| 177 | tmp+=data[i]; |
| 178 | t++; |
| 179 | } |
| 180 | } |
| 181 | else { |
| 182 | foreach(int i: index-1799 .. index) { |
| 183 | tmp+=data[i]; |
| 184 | t++; |
| 185 | } |
| 186 | } |
| 187 | results[5]=tmp/to_float(t) * scale; |
| 188 | } |
| 189 | return results; |
| 190 | } |
| 191 | |
| 192 | protected void heart_beat() { |
| 193 | int hbcount=efun::driver_info(DI_NUM_HEARTBEAT_TOTAL_CYCLES); |
| 194 | // per Modulo Index auf 0 - 449 begrenzen |
| 195 | int index=hbcount%MESSWERTE; |
| 196 | |
| 197 | // mass fuer das lag ist das Verhaeltnis von vergangener Sollzeit (Differenz |
| 198 | // HB-Counts * 2) und vergangener Istzeit (Differenz von time()). Und das |
| 199 | // ganze wird dann als Abweichung von 1 gespeichert (0, wenn kein Lag) |
| 200 | int *nowtime = utime(); |
| 201 | float timediff = to_float((nowtime[0]-lasttime[0])) |
| 202 | + to_float(nowtime[1]-lasttime[1])/1000000.0; |
| 203 | |
| 204 | // lagdata[index] = 1.0 - |
| 205 | // (to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__) |
| 206 | // / timediff); |
| 207 | // lagdata[index] = (timediff - |
| 208 | // to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__)) / |
| 209 | // to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__); |
| 210 | lagdata[index] = abs(to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__) |
| 211 | - timediff) / |
| 212 | to_float((hbcount - lasthbcount) * __HEART_BEAT_INTERVAL__); |
| 213 | |
| 214 | |
| 215 | hbdata[index] = efun::driver_info(DI_NUM_HEARTBEATS_LAST_PROCESSED); |
| 216 | codata[index] = efun::driver_info(DI_NUM_CALLOUTS); |
| 217 | |
| 218 | /* |
| 219 | DEBUG(sprintf("Index: %d: %d/%.6f => %:6f /1\n",index, |
| 220 | (hbcount - lasthbcount)*2, |
| 221 | timediff, lagdata[index])); |
| 222 | */ |
| 223 | lasthbcount=hbcount; |
| 224 | lasttime=nowtime; |
| 225 | |
| 226 | lag = calc_averages(lagdata, lag, index, 100.0); |
| 227 | // Multiplizieren mit 100 |
| 228 | //DEBUG(sprintf("%O\n",lag)); |
| 229 | //lag = map(lag, function float (float f) {return f*100.0;} ); |
| 230 | //DEBUG(sprintf("%O\n",lag)); |
| 231 | hbs = map(calc_averages(hbdata, hbs, index,1.0),#'to_int); |
| 232 | callouts = map(calc_averages(codata, callouts, index,1.0),#'to_int); |
| 233 | |
| 234 | // und ausserdem mal etwas loggen fuer den Moment |
| 235 | if (lag[0] > 1000 || callouts[0] > 1000) |
| 236 | { |
| 237 | LOGMAX(sprintf("%s, %d, %d, %:6f, %:6f, %:6f, %:6f, %:6f, %:6f, " |
| 238 | "%d, %d, %d, %d, %d, %d, " |
| 239 | "%d, %d, %d, %d, %d, %d, \n", |
| 240 | strftime("%y%m%d-%H%M%S"),time(),hbcount, |
| 241 | lag[0],lag[1],lag[2],lag[3],lag[4],lag[5], |
| 242 | hbs[0],hbs[1],hbs[2],hbs[3],hbs[4],hbs[5], |
| 243 | callouts[0],callouts[1],callouts[2],callouts[3],callouts[4], |
| 244 | callouts[5])); |
| 245 | } |
| 246 | else if (hbcount%80 == 0 || lag[0] > 10) |
| 247 | { |
| 248 | LOG(sprintf("%s, %d, %d, %:6f, %:6f, %:6f, %:6f, %:6f, %:6f, " |
| 249 | "%d, %d, %d, %d, %d, %d, " |
| 250 | "%d, %d, %d, %d, %d, %d, \n", |
| 251 | strftime("%y%m%d-%H%M%S"),time(),hbcount, |
| 252 | lag[0],lag[1],lag[2],lag[3],lag[4],lag[5], |
| 253 | hbs[0],hbs[1],hbs[2],hbs[3],hbs[4],hbs[5], |
| 254 | callouts[0],callouts[1],callouts[2],callouts[3],callouts[4], |
| 255 | callouts[5])); |
| 256 | } |
| 257 | } |
| 258 | |
| 259 | float *read_lag_data() { |
| 260 | return ({lag[2],lag[4],lag[5]}); |
| 261 | } |
| 262 | float *read_ext_lag_data() { |
| 263 | return copy(lag); |
| 264 | } |
| 265 | int *read_hb_data() { |
| 266 | return copy(hbs); |
| 267 | } |
| 268 | int *read_co_data() { |
| 269 | return copy(callouts); |
| 270 | } |
| 271 | |