#include <hostcompat/dbus/gio.h>
#include "dbus-glib-tools.h"
+BPF_ARRAY(count_averages, u64, 2);
+#define INDEX_OF_AVERAGE_VALUE 0
+#define INDEX_OF_NUMBER_OF_SAMPLES 1
+
+static void average_add(u64 val) {
+ int avg = INDEX_OF_AVERAGE_VALUE;
+ u64 *current_avg;
+
+ count_averages.increment(INDEX_OF_NUMBER_OF_SAMPLES);
+ current_avg = count_averages.lookup(&avg);
+ if (current_avg)
+ lock_xadd(current_avg, val);
+}
+
/* This histogram is meant to keep time intervals used for preparing a message to send
* by the sending API, just before such message is passed to 'gdbus' thread. */
BPF_HISTOGRAM(timings);
msg_sending.delete(&key);
timings.increment(bpf_log2l(ns_to_us(timestamp)));
+ average_add(timestamp);
return 0;
}
print(" containers stats:")
print(' msg_sending:', msgs)
+ if b["count_averages"][1].value > 0:
+ print('Average:', (b["count_averages"][0].value // b["count_averages"][1].value) // 1000)
+
if count == loop:
print('Finished')
break
return 0;
}
+BPF_ARRAY(count_averages, u64, 2);
+#define INDEX_OF_AVERAGE_VALUE 0
+#define INDEX_OF_NUMBER_OF_SAMPLES 1
+
+static void average_add(u64 val) {
+ int avg = INDEX_OF_AVERAGE_VALUE;
+ u64 *current_avg;
+
+ count_averages.increment(INDEX_OF_NUMBER_OF_SAMPLES);
+ current_avg = count_averages.lookup(&avg);
+ if (current_avg)
+ lock_xadd(current_avg, val);
+}
+
/********** method calls *************/
struct value_msg_ptr_t {
struct GDBusMessage *msg_ptr;
msg_on_worker_received.delete(&wrk_key);
timings.increment(bpf_log2l(ns_to_us(timestamp)));
+ average_add(timestamp);
return 0;
}
msg_on_worker_received.delete(&wrk_key);
timings.increment(bpf_log2l(ns_to_us(timestamp)));
+ average_add(timestamp);
return 0;
}
msg_on_worker_received.delete(&key);
timings.increment(bpf_log2l(ns_to_us(timestamp)));
+ average_add(timestamp);
return 0;
}
if invocations > 0: print(' invocation_to_message :', invocations)
if tasks > 0: print(' task_to_message :', tasks)
+ if b["count_averages"][1].value > 0:
+ print('Average:', (b["count_averages"][0].value // b["count_averages"][1].value) // 1000)
+
if count == loop:
print('Finished')
break
#include <hostcompat/dbus/gio.h>
#include "dbus-glib-tools.h"
+BPF_ARRAY(count_averages, u64, 2);
+#define INDEX_OF_AVERAGE_VALUE 0
+#define INDEX_OF_NUMBER_OF_SAMPLES 1
+
+static void average_add(u64 val) {
+ int avg = INDEX_OF_AVERAGE_VALUE;
+ u64 *current_avg;
+
+ count_averages.increment(INDEX_OF_NUMBER_OF_SAMPLES);
+ current_avg = count_averages.lookup(&avg);
+ if (current_avg)
+ lock_xadd(current_avg, val);
+}
+
/* This histogram is meant to keep time intervals between detection of sending of a message
* and making its data available in a gdbus thread. */
BPF_HISTOGRAM(timings);
msg_sending.delete(&key);
timings.increment(bpf_log2l(ns_to_us(timestamp)));
+ average_add(timestamp);
return 0;
}
print(" containers stats:")
print(' msg_sending:', msgs)
+ if b["count_averages"][1].value > 0:
+ print('Average:', (b["count_averages"][0].value // b["count_averages"][1].value) // 1000)
+
if count == loop:
print('Finished')
break
BPF_HASH(msg_sent_addr, u32 , struct data_t);
BPF_HASH(msg_latency, struct data_t , struct stats_t);
-BPF_HASH(g_serial_addr, struct data_t, struct GDBusMessage *);
BPF_HISTOGRAM(latency_histo);
static void get_process_data(struct data_t *data) {
return 0;
}
latency_histo.increment(bpf_log2l(delta));
+
receiver_data->pid = s_data.pid;
receiver_data->ts = 0;
bpf_probe_read(&receiver_data->comm, sizeof(receiver_data->comm), s_data.comm);
sleep(interval)
loop = loop + 1
print("\n%d:" % loop)
+ latency = b["msg_latency"]
if mode =="histogram":
b["latency_histo"].print_log2_hist("us")
+ avgcnt = 0
+ avgval = 0
+ for v, p in latency.items():
+ avgcnt += long(p.count)
+ avgval += long(p.count) * long(p.avg)
+ if avgcnt > 0:
+ print 'Average:', avgval // avgcnt
else:
print ("%10s %20s %10s %10s %10s" % ("PID", "COMM", "MIN", "AVG", "MAX"))
- latency = b["msg_latency"]
for v, p in sorted(latency.items(), key=lambda latency: latency[1].avg, reverse=True):
print("%10d %20s %10d %10d %10d" % (v.pid, v.comm.encode('string-escape'), int(p.min), int(p.avg), int(p.max)))