tools/pylcc/pytool/cpudist.py (26 lines of code) (raw):

# -*- coding: utf-8 -*- """ ------------------------------------------------- File Name: cpudist.py Description : Author : liaozhaoyan date: 2022/5/12 ------------------------------------------------- Change Activity: 2022/5/12: ------------------------------------------------- """ __author__ = 'liaozhaoyan' import time from pylcc.lbcBase import ClbcBase DIST_ARRAYS = 8 bpfProg = r""" #include "lbc.h" LBC_ARRAY(cpudist, int, u64, 8); /* unit us; 0-1: 1-10: 10-100: 100-1k: 1k-10k: 10k-100k: 100k-1M: >1M */ LBC_HASH(start, u32, u64, 256 * 1024); //record ns static inline void addDist(int k) { u64 *pv = bpf_map_lookup_elem(&cpudist, &k); if (pv) { __sync_fetch_and_add(pv, 1); } } static inline void checkUs(u64 delta) { if (delta < 1) { addDist(0); } else if (delta < 10) { addDist(1); } else if (delta < 100) { addDist(2); } else if (delta < 1000) { addDist(3); } else if (delta < 10000) { addDist(4); } else if (delta < 100000) { addDist(5); } else if (delta < 1000000) { addDist(6); } else { addDist(7); } } struct sched_switch_args { u16 type; u8 flag; u8 preeempt; u32 c_pid; char prev_comm[16]; u32 prev_pid; u32 prev_prio; u64 prev_state; char next_comm[16]; u32 next_pid; u32 next_prio; }; SEC("tracepoint/sched/sched_switch") int sched_switch_hook(struct sched_switch_args *args){ u64 ts = bpf_ktime_get_ns(); u64 *pv; u32 prev = args->prev_pid; u32 next = args->next_pid; bpf_map_update_elem(&start, &next, &ts, BPF_ANY); pv = bpf_map_lookup_elem(&start, &prev); if (pv && ts > *pv) { checkUs((ts - *pv) / 1000); } } char _license[] SEC("license") = "GPL"; """ class Ccpudist(ClbcBase): def __init__(self): super(Ccpudist, self).__init__("cpudist", bpf_str=bpfProg) self._rec = [0] * DIST_ARRAYS def _get(self): a = [] for i in range(DIST_ARRAYS): a.append(self.maps['cpudist'].getKeyValue(i)) return a def proc(self): g = self._get() res = [] for i in range(DIST_ARRAYS): res.append(g[i] - self._rec[i]) self._rec = g return res if __name__ == "__main__": dist = Ccpudist() while True: time.sleep(5) print(dist.proc())