blob: 1ba23292a44847289c9394fafb570e66891ab5a0 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001#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
21nosave float hbstat, obstat;
22nosave mapping lastwarning=([]);
23nosave int *lasttime = utime();
24nosave int lasthbcount = absolute_hb_count();
25float *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)
28float *lag = allocate(6,0.0);
29int *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)
32int *hbs = allocate(6);
33int *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)
36int *callouts = allocate(6);
37
38void 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
56int 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
Arathorn5a409d32024-08-27 20:59:09 +020064private mixed calc_averages(mixed data, mixed results, int index,
65 float scale=1.0) {
MG Mud User88f12472016-06-24 23:31:02 +020066 float tmp;
67 int t;
68
MG Mud User88f12472016-06-24 23:31:02 +020069 // 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
192protected 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
259float *read_lag_data() {
260 return ({lag[2],lag[4],lag[5]});
261}
262float *read_ext_lag_data() {
263 return copy(lag);
264}
265int *read_hb_data() {
266 return copy(hbs);
267}
268int *read_co_data() {
269 return copy(callouts);
270}
271