| 1 | #pragma once | 
|---|
| 2 |  | 
|---|
| 3 | // #define CFA_STATS_ARRAY 10000 | 
|---|
| 4 | // #define __CFA_NO_STATISTICS__ | 
|---|
| 5 |  | 
|---|
| 6 | #include <stdint.h> | 
|---|
| 7 |  | 
|---|
| 8 | enum { | 
|---|
| 9 | CFA_STATS_READY_Q  = 0x01, | 
|---|
| 10 | CFA_STATS_IO = 0x02, | 
|---|
| 11 | }; | 
|---|
| 12 |  | 
|---|
| 13 | #if defined(__CFA_NO_STATISTICS__) | 
|---|
| 14 | struct __stats_t; | 
|---|
| 15 | static inline void __init_stats( struct __stats_t * ) {} | 
|---|
| 16 | static inline void __tally_stats( struct __stats_t *, struct __stats_t * ) {} | 
|---|
| 17 | static inline void __print_stats( struct __stats_t *, int, const char *, const char *, void * ) {} | 
|---|
| 18 | #else | 
|---|
| 19 | struct __stats_readyQ_pop_t { | 
|---|
| 20 | // number of attemps at poping something | 
|---|
| 21 | volatile uint64_t attempt; | 
|---|
| 22 |  | 
|---|
| 23 | // number of successes at poping | 
|---|
| 24 | volatile uint64_t success; | 
|---|
| 25 | }; | 
|---|
| 26 |  | 
|---|
| 27 | struct __attribute__((aligned(64))) __stats_readyQ_t { | 
|---|
| 28 | // Push statistic | 
|---|
| 29 | struct { | 
|---|
| 30 | struct { | 
|---|
| 31 | // number of attemps at pushing something to preferred queues | 
|---|
| 32 | volatile uint64_t attempt; | 
|---|
| 33 |  | 
|---|
| 34 | // number of successes at pushing to preferred queues | 
|---|
| 35 | volatile uint64_t success; | 
|---|
| 36 | } | 
|---|
| 37 | // Stats for local queue within cluster | 
|---|
| 38 | local, | 
|---|
| 39 |  | 
|---|
| 40 | // Stats for non-local queues within cluster | 
|---|
| 41 | share, | 
|---|
| 42 |  | 
|---|
| 43 | // Stats from outside cluster | 
|---|
| 44 | extrn; | 
|---|
| 45 | } push; | 
|---|
| 46 |  | 
|---|
| 47 | // Pop statistic | 
|---|
| 48 | struct { | 
|---|
| 49 | // pop from local queue | 
|---|
| 50 | __stats_readyQ_pop_t local; | 
|---|
| 51 |  | 
|---|
| 52 | // pop before looking at local queue | 
|---|
| 53 | __stats_readyQ_pop_t help; | 
|---|
| 54 |  | 
|---|
| 55 | // pop from some other queue | 
|---|
| 56 | __stats_readyQ_pop_t steal; | 
|---|
| 57 |  | 
|---|
| 58 | // pop when searching queues sequentially | 
|---|
| 59 | __stats_readyQ_pop_t search; | 
|---|
| 60 | } pop; | 
|---|
| 61 |  | 
|---|
| 62 | struct { | 
|---|
| 63 | volatile uint64_t migration; | 
|---|
| 64 | volatile uint64_t extunpark; | 
|---|
| 65 | volatile  int64_t threads;  // number of threads in the system, includes only local change | 
|---|
| 66 | volatile  int64_t cthreads; // number of threads in the system, includes only local change | 
|---|
| 67 | struct { | 
|---|
| 68 | volatile uint64_t yield; | 
|---|
| 69 | volatile uint64_t rllfwd; | 
|---|
| 70 | } preempt; | 
|---|
| 71 | } threads; | 
|---|
| 72 | struct { | 
|---|
| 73 | volatile uint64_t halts; | 
|---|
| 74 | volatile uint64_t cancels; | 
|---|
| 75 | volatile uint64_t early; | 
|---|
| 76 | volatile uint64_t wakes; | 
|---|
| 77 | volatile uint64_t seen; | 
|---|
| 78 | volatile uint64_t exits; | 
|---|
| 79 | } sleep; | 
|---|
| 80 | }; | 
|---|
| 81 |  | 
|---|
| 82 | #if defined(CFA_HAVE_LINUX_IO_URING_H) | 
|---|
| 83 | struct __attribute__((aligned(64))) __stats_io_t{ | 
|---|
| 84 | struct { | 
|---|
| 85 | volatile uint64_t fast; | 
|---|
| 86 | volatile uint64_t slow; | 
|---|
| 87 | volatile uint64_t fail; | 
|---|
| 88 | volatile uint64_t revoke; | 
|---|
| 89 | volatile uint64_t block; | 
|---|
| 90 | } alloc; | 
|---|
| 91 | struct { | 
|---|
| 92 | volatile uint64_t fast; | 
|---|
| 93 | volatile uint64_t slow; | 
|---|
| 94 | volatile uint64_t eagr; | 
|---|
| 95 | volatile uint64_t nblk; | 
|---|
| 96 | volatile uint64_t extr; | 
|---|
| 97 | } submit; | 
|---|
| 98 | struct { | 
|---|
| 99 | volatile uint64_t external; | 
|---|
| 100 | volatile uint64_t signal; | 
|---|
| 101 | volatile uint64_t dirty; | 
|---|
| 102 | volatile uint64_t full; | 
|---|
| 103 | volatile uint64_t idle; | 
|---|
| 104 | volatile uint64_t eager; | 
|---|
| 105 | } flush; | 
|---|
| 106 | struct { | 
|---|
| 107 | volatile uint64_t drain; | 
|---|
| 108 | volatile uint64_t completed; | 
|---|
| 109 | volatile uint64_t locked; | 
|---|
| 110 | volatile uint64_t helped; | 
|---|
| 111 | volatile uint64_t flush; | 
|---|
| 112 | volatile uint64_t submitted; | 
|---|
| 113 | struct { | 
|---|
| 114 | volatile uint64_t busy; | 
|---|
| 115 | } errors; | 
|---|
| 116 | } calls; | 
|---|
| 117 | struct { | 
|---|
| 118 | volatile uint64_t sleeps; | 
|---|
| 119 | } poller; | 
|---|
| 120 | struct { | 
|---|
| 121 | volatile uint64_t sockread; | 
|---|
| 122 | volatile uint64_t epllread; | 
|---|
| 123 | volatile uint64_t sockwrite; | 
|---|
| 124 | volatile uint64_t epllwrite; | 
|---|
| 125 | } ops; | 
|---|
| 126 | }; | 
|---|
| 127 | #endif | 
|---|
| 128 |  | 
|---|
| 129 | #if defined(CFA_STATS_ARRAY) | 
|---|
| 130 | struct __stats_elem_t { | 
|---|
| 131 | long long int ts; | 
|---|
| 132 | int64_t value; | 
|---|
| 133 | }; | 
|---|
| 134 | #endif | 
|---|
| 135 |  | 
|---|
| 136 | struct __attribute__((aligned(64))) __stats_t { | 
|---|
| 137 | __stats_readyQ_t ready; | 
|---|
| 138 | #if defined(CFA_HAVE_LINUX_IO_URING_H) | 
|---|
| 139 | __stats_io_t    io; | 
|---|
| 140 | #endif | 
|---|
| 141 |  | 
|---|
| 142 | #if defined(CFA_STATS_ARRAY) | 
|---|
| 143 | struct { | 
|---|
| 144 | __stats_elem_t * values; | 
|---|
| 145 | volatile size_t cnt; | 
|---|
| 146 | } array; | 
|---|
| 147 | #endif | 
|---|
| 148 |  | 
|---|
| 149 | }; | 
|---|
| 150 |  | 
|---|
| 151 | void __init_stats ( struct __stats_t * ); | 
|---|
| 152 | void __tally_stats( struct __stats_t *, struct __stats_t * ); | 
|---|
| 153 | void __print_stats( struct __stats_t *, int, const char *, const char *, void * ); | 
|---|
| 154 | #if defined(CFA_STATS_ARRAY) | 
|---|
| 155 | void __push_stat ( struct __stats_t *, int64_t value, bool external, const char * name, void * handle); | 
|---|
| 156 | void __flush_stat( struct __stats_t *, const char *, void * ); | 
|---|
| 157 | #else | 
|---|
| 158 | static inline void __push_stat ( struct __stats_t *, int64_t, bool, const char *, void * ) {} | 
|---|
| 159 | static inline void __flush_stat( struct __stats_t *, const char *, void * ) {} | 
|---|
| 160 | #endif | 
|---|
| 161 | #endif | 
|---|
| 162 |  | 
|---|