Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/stats.cfa

    rbbbd2c4 r1e208ea  
    55#include <inttypes.h>
    66#include "bits/debug.hfa"
    7 #include "bits/locks.hfa"
    87#include "stats.hfa"
    9 #include "strstream.hfa"
    108
    119#if !defined(__CFA_NO_STATISTICS__)
    1210        void __init_stats( struct __stats_t * stats ) {
    13                 stats->ready.push.local.attempt = 0;
    14                 stats->ready.push.local.success = 0;
    15                 stats->ready.push.share.attempt = 0;
    16                 stats->ready.push.share.success = 0;
    17                 stats->ready.push.extrn.attempt = 0;
    18                 stats->ready.push.extrn.success = 0;
    19                 stats->ready.pop.local .attempt = 0;
    20                 stats->ready.pop.local .success = 0;
    21                 stats->ready.pop.local .elock   = 0;
    22                 stats->ready.pop.local .eempty  = 0;
    23                 stats->ready.pop.local .espec   = 0;
    24                 stats->ready.pop.help  .attempt = 0;
    25                 stats->ready.pop.help  .success = 0;
    26                 stats->ready.pop.help  .elock   = 0;
    27                 stats->ready.pop.help  .eempty  = 0;
    28                 stats->ready.pop.help  .espec   = 0;
    29                 stats->ready.pop.steal .attempt = 0;
    30                 stats->ready.pop.steal .success = 0;
    31                 stats->ready.pop.steal .elock   = 0;
    32                 stats->ready.pop.steal .eempty  = 0;
    33                 stats->ready.pop.steal .espec   = 0;
    34                 stats->ready.pop.search.attempt = 0;
    35                 stats->ready.pop.search.success = 0;
    36                 stats->ready.pop.search.elock   = 0;
    37                 stats->ready.pop.search.eempty  = 0;
    38                 stats->ready.pop.search.espec   = 0;
     11                stats->ready.pick.push.attempt  = 0;
     12                stats->ready.pick.push.success  = 0;
     13                stats->ready.pick.push.local    = 0;
     14                stats->ready.pick.push.lsuccess = 0;
     15                stats->ready.pick.pop .probe    = 0;
     16                stats->ready.pick.pop .attempt  = 0;
     17                stats->ready.pick.pop .success  = 0;
     18                stats->ready.pick.pop .local    = 0;
     19                stats->ready.pick.pop .lsuccess = 0;
    3920                stats->ready.threads.migration = 0;
    40                 stats->ready.threads.threads   = 0;
    4121                stats->ready.sleep.halts   = 0;
    4222                stats->ready.sleep.cancels = 0;
     
    4525
    4626                #if defined(CFA_HAVE_LINUX_IO_URING_H)
    47                         stats->io.alloc.fast        = 0;
    48                         stats->io.alloc.slow        = 0;
    49                         stats->io.alloc.fail        = 0;
    50                         stats->io.alloc.revoke      = 0;
    51                         stats->io.alloc.block       = 0;
    52                         stats->io.submit.fast       = 0;
    53                         stats->io.submit.slow       = 0;
    54                         stats->io.flush.external    = 0;
    55                         stats->io.calls.flush       = 0;
    56                         stats->io.calls.submitted   = 0;
    57                         stats->io.calls.drain       = 0;
    58                         stats->io.calls.completed   = 0;
    59                         stats->io.calls.errors.busy = 0;
    60                         stats->io.poller.sleeps     = 0;
    61                 #endif
    62 
    63                 #if defined(CFA_STATS_ARRAY)
    64                         stats->array.values = alloc(CFA_STATS_ARRAY);
    65                         stats->array.cnt = 0;
     27                        stats->io.submit_q.submit_avg.rdy = 0;
     28                        stats->io.submit_q.submit_avg.csm = 0;
     29                        stats->io.submit_q.submit_avg.cnt = 0;
     30                        stats->io.submit_q.look_avg.val   = 0;
     31                        stats->io.submit_q.look_avg.cnt   = 0;
     32                        stats->io.submit_q.look_avg.block = 0;
     33                        stats->io.submit_q.alloc_avg.val   = 0;
     34                        stats->io.submit_q.alloc_avg.cnt   = 0;
     35                        stats->io.submit_q.alloc_avg.block = 0;
     36                        stats->io.submit_q.helped = 0;
     37                        stats->io.submit_q.leader = 0;
     38                        stats->io.submit_q.busy   = 0;
     39                        stats->io.complete_q.completed_avg.val = 0;
     40                        stats->io.complete_q.completed_avg.cnt = 0;
     41                        stats->io.complete_q.blocks = 0;
    6642                #endif
    6743        }
    6844
    6945        void __tally_stats( struct __stats_t * cltr, struct __stats_t * proc ) {
    70                 __atomic_fetch_add( &cltr->ready.push.local.attempt, proc->ready.push.local.attempt, __ATOMIC_SEQ_CST ); proc->ready.push.local.attempt = 0;
    71                 __atomic_fetch_add( &cltr->ready.push.local.success, proc->ready.push.local.success, __ATOMIC_SEQ_CST ); proc->ready.push.local.success = 0;
    72                 __atomic_fetch_add( &cltr->ready.push.share.attempt, proc->ready.push.share.attempt, __ATOMIC_SEQ_CST ); proc->ready.push.share.attempt = 0;
    73                 __atomic_fetch_add( &cltr->ready.push.share.success, proc->ready.push.share.success, __ATOMIC_SEQ_CST ); proc->ready.push.share.success = 0;
    74                 __atomic_fetch_add( &cltr->ready.push.extrn.attempt, proc->ready.push.extrn.attempt, __ATOMIC_SEQ_CST ); proc->ready.push.extrn.attempt = 0;
    75                 __atomic_fetch_add( &cltr->ready.push.extrn.success, proc->ready.push.extrn.success, __ATOMIC_SEQ_CST ); proc->ready.push.extrn.success = 0;
    76                 __atomic_fetch_add( &cltr->ready.pop.local .attempt, proc->ready.pop.local .attempt, __ATOMIC_SEQ_CST ); proc->ready.pop.local .attempt = 0;
    77                 __atomic_fetch_add( &cltr->ready.pop.local .success, proc->ready.pop.local .success, __ATOMIC_SEQ_CST ); proc->ready.pop.local .success = 0;
    78                 __atomic_fetch_add( &cltr->ready.pop.local .elock  , proc->ready.pop.local .elock  , __ATOMIC_SEQ_CST ); proc->ready.pop.local .elock   = 0;
    79                 __atomic_fetch_add( &cltr->ready.pop.local .eempty , proc->ready.pop.local .eempty , __ATOMIC_SEQ_CST ); proc->ready.pop.local .eempty  = 0;
    80                 __atomic_fetch_add( &cltr->ready.pop.local .espec  , proc->ready.pop.local .espec  , __ATOMIC_SEQ_CST ); proc->ready.pop.local .espec   = 0;
    81                 __atomic_fetch_add( &cltr->ready.pop.help  .attempt, proc->ready.pop.help  .attempt, __ATOMIC_SEQ_CST ); proc->ready.pop.help  .attempt = 0;
    82                 __atomic_fetch_add( &cltr->ready.pop.help  .success, proc->ready.pop.help  .success, __ATOMIC_SEQ_CST ); proc->ready.pop.help  .success = 0;
    83                 __atomic_fetch_add( &cltr->ready.pop.help  .elock  , proc->ready.pop.help  .elock  , __ATOMIC_SEQ_CST ); proc->ready.pop.help  .elock   = 0;
    84                 __atomic_fetch_add( &cltr->ready.pop.help  .eempty , proc->ready.pop.help  .eempty , __ATOMIC_SEQ_CST ); proc->ready.pop.help  .eempty  = 0;
    85                 __atomic_fetch_add( &cltr->ready.pop.help  .espec  , proc->ready.pop.help  .espec  , __ATOMIC_SEQ_CST ); proc->ready.pop.help  .espec   = 0;
    86                 __atomic_fetch_add( &cltr->ready.pop.steal .attempt, proc->ready.pop.steal .attempt, __ATOMIC_SEQ_CST ); proc->ready.pop.steal .attempt = 0;
    87                 __atomic_fetch_add( &cltr->ready.pop.steal .success, proc->ready.pop.steal .success, __ATOMIC_SEQ_CST ); proc->ready.pop.steal .success = 0;
    88                 __atomic_fetch_add( &cltr->ready.pop.steal .elock  , proc->ready.pop.steal .elock  , __ATOMIC_SEQ_CST ); proc->ready.pop.steal .elock   = 0;
    89                 __atomic_fetch_add( &cltr->ready.pop.steal .eempty , proc->ready.pop.steal .eempty , __ATOMIC_SEQ_CST ); proc->ready.pop.steal .eempty  = 0;
    90                 __atomic_fetch_add( &cltr->ready.pop.steal .espec  , proc->ready.pop.steal .espec  , __ATOMIC_SEQ_CST ); proc->ready.pop.steal .espec   = 0;
    91                 __atomic_fetch_add( &cltr->ready.pop.search.attempt, proc->ready.pop.search.attempt, __ATOMIC_SEQ_CST ); proc->ready.pop.search.attempt = 0;
    92                 __atomic_fetch_add( &cltr->ready.pop.search.success, proc->ready.pop.search.success, __ATOMIC_SEQ_CST ); proc->ready.pop.search.success = 0;
    93                 __atomic_fetch_add( &cltr->ready.pop.search.elock  , proc->ready.pop.search.elock  , __ATOMIC_SEQ_CST ); proc->ready.pop.search.elock   = 0;
    94                 __atomic_fetch_add( &cltr->ready.pop.search.eempty , proc->ready.pop.search.eempty , __ATOMIC_SEQ_CST ); proc->ready.pop.search.eempty  = 0;
    95                 __atomic_fetch_add( &cltr->ready.pop.search.espec  , proc->ready.pop.search.espec  , __ATOMIC_SEQ_CST ); proc->ready.pop.search.espec   = 0;
     46                __atomic_fetch_add( &cltr->ready.pick.push.attempt , proc->ready.pick.push.attempt , __ATOMIC_SEQ_CST ); proc->ready.pick.push.attempt  = 0;
     47                __atomic_fetch_add( &cltr->ready.pick.push.success , proc->ready.pick.push.success , __ATOMIC_SEQ_CST ); proc->ready.pick.push.success  = 0;
     48                __atomic_fetch_add( &cltr->ready.pick.push.local   , proc->ready.pick.push.local   , __ATOMIC_SEQ_CST ); proc->ready.pick.push.local    = 0;
     49                __atomic_fetch_add( &cltr->ready.pick.push.lsuccess, proc->ready.pick.push.lsuccess, __ATOMIC_SEQ_CST ); proc->ready.pick.push.lsuccess = 0;
     50                __atomic_fetch_add( &cltr->ready.pick.pop .probe   , proc->ready.pick.pop .probe   , __ATOMIC_SEQ_CST ); proc->ready.pick.pop .probe    = 0;
     51                __atomic_fetch_add( &cltr->ready.pick.pop .attempt , proc->ready.pick.pop .attempt , __ATOMIC_SEQ_CST ); proc->ready.pick.pop .attempt  = 0;
     52                __atomic_fetch_add( &cltr->ready.pick.pop .success , proc->ready.pick.pop .success , __ATOMIC_SEQ_CST ); proc->ready.pick.pop .success  = 0;
     53                __atomic_fetch_add( &cltr->ready.pick.pop .local   , proc->ready.pick.pop .local   , __ATOMIC_SEQ_CST ); proc->ready.pick.pop .local    = 0;
     54                __atomic_fetch_add( &cltr->ready.pick.pop .lsuccess, proc->ready.pick.pop .lsuccess, __ATOMIC_SEQ_CST ); proc->ready.pick.pop .lsuccess = 0;
    9655                __atomic_fetch_add( &cltr->ready.threads.migration , proc->ready.threads.migration , __ATOMIC_SEQ_CST ); proc->ready.threads.migration  = 0;
    97                 __atomic_fetch_add( &cltr->ready.threads.threads   , proc->ready.threads.threads   , __ATOMIC_SEQ_CST ); proc->ready.threads.threads    = 0;
    9856                __atomic_fetch_add( &cltr->ready.sleep.halts       , proc->ready.sleep.halts       , __ATOMIC_SEQ_CST ); proc->ready.sleep.halts        = 0;
    9957                __atomic_fetch_add( &cltr->ready.sleep.cancels     , proc->ready.sleep.cancels     , __ATOMIC_SEQ_CST ); proc->ready.sleep.cancels      = 0;
     
    10260
    10361                #if defined(CFA_HAVE_LINUX_IO_URING_H)
    104                         __atomic_fetch_add( &cltr->io.alloc.fast       , proc->io.alloc.fast       , __ATOMIC_SEQ_CST ); proc->io.alloc.fast        = 0;
    105                         __atomic_fetch_add( &cltr->io.alloc.slow       , proc->io.alloc.slow       , __ATOMIC_SEQ_CST ); proc->io.alloc.slow        = 0;
    106                         __atomic_fetch_add( &cltr->io.alloc.fail       , proc->io.alloc.fail       , __ATOMIC_SEQ_CST ); proc->io.alloc.fail        = 0;
    107                         __atomic_fetch_add( &cltr->io.alloc.revoke     , proc->io.alloc.revoke     , __ATOMIC_SEQ_CST ); proc->io.alloc.revoke      = 0;
    108                         __atomic_fetch_add( &cltr->io.alloc.block      , proc->io.alloc.block      , __ATOMIC_SEQ_CST ); proc->io.alloc.block       = 0;
    109                         __atomic_fetch_add( &cltr->io.submit.fast      , proc->io.submit.fast      , __ATOMIC_SEQ_CST ); proc->io.submit.fast       = 0;
    110                         __atomic_fetch_add( &cltr->io.submit.slow      , proc->io.submit.slow      , __ATOMIC_SEQ_CST ); proc->io.submit.slow       = 0;
    111                         __atomic_fetch_add( &cltr->io.flush.external   , proc->io.flush.external   , __ATOMIC_SEQ_CST ); proc->io.flush.external    = 0;
    112                         __atomic_fetch_add( &cltr->io.calls.flush      , proc->io.calls.flush      , __ATOMIC_SEQ_CST ); proc->io.calls.flush       = 0;
    113                         __atomic_fetch_add( &cltr->io.calls.submitted  , proc->io.calls.submitted  , __ATOMIC_SEQ_CST ); proc->io.calls.submitted   = 0;
    114                         __atomic_fetch_add( &cltr->io.calls.drain      , proc->io.calls.drain      , __ATOMIC_SEQ_CST ); proc->io.calls.drain       = 0;
    115                         __atomic_fetch_add( &cltr->io.calls.completed  , proc->io.calls.completed  , __ATOMIC_SEQ_CST ); proc->io.calls.completed   = 0;
    116                         __atomic_fetch_add( &cltr->io.calls.errors.busy, proc->io.calls.errors.busy, __ATOMIC_SEQ_CST ); proc->io.calls.errors.busy = 0;
    117                         __atomic_fetch_add( &cltr->io.poller.sleeps    , proc->io.poller.sleeps    , __ATOMIC_SEQ_CST ); proc->io.poller.sleeps     = 0;
     62                        __atomic_fetch_add( &cltr->io.submit_q.submit_avg.rdy     , proc->io.submit_q.submit_avg.rdy     , __ATOMIC_SEQ_CST ); proc->io.submit_q.submit_avg.rdy      = 0;
     63                        __atomic_fetch_add( &cltr->io.submit_q.submit_avg.csm     , proc->io.submit_q.submit_avg.csm     , __ATOMIC_SEQ_CST ); proc->io.submit_q.submit_avg.csm      = 0;
     64                        __atomic_fetch_add( &cltr->io.submit_q.submit_avg.avl     , proc->io.submit_q.submit_avg.avl     , __ATOMIC_SEQ_CST ); proc->io.submit_q.submit_avg.avl      = 0;
     65                        __atomic_fetch_add( &cltr->io.submit_q.submit_avg.cnt     , proc->io.submit_q.submit_avg.cnt     , __ATOMIC_SEQ_CST ); proc->io.submit_q.submit_avg.cnt      = 0;
     66                        __atomic_fetch_add( &cltr->io.submit_q.look_avg.val       , proc->io.submit_q.look_avg.val       , __ATOMIC_SEQ_CST ); proc->io.submit_q.look_avg.val        = 0;
     67                        __atomic_fetch_add( &cltr->io.submit_q.look_avg.cnt       , proc->io.submit_q.look_avg.cnt       , __ATOMIC_SEQ_CST ); proc->io.submit_q.look_avg.cnt        = 0;
     68                        __atomic_fetch_add( &cltr->io.submit_q.look_avg.block     , proc->io.submit_q.look_avg.block     , __ATOMIC_SEQ_CST ); proc->io.submit_q.look_avg.block      = 0;
     69                        __atomic_fetch_add( &cltr->io.submit_q.alloc_avg.val      , proc->io.submit_q.alloc_avg.val      , __ATOMIC_SEQ_CST ); proc->io.submit_q.alloc_avg.val       = 0;
     70                        __atomic_fetch_add( &cltr->io.submit_q.alloc_avg.cnt      , proc->io.submit_q.alloc_avg.cnt      , __ATOMIC_SEQ_CST ); proc->io.submit_q.alloc_avg.cnt       = 0;
     71                        __atomic_fetch_add( &cltr->io.submit_q.alloc_avg.block    , proc->io.submit_q.alloc_avg.block    , __ATOMIC_SEQ_CST ); proc->io.submit_q.alloc_avg.block     = 0;
     72                        __atomic_fetch_add( &cltr->io.submit_q.helped             , proc->io.submit_q.helped             , __ATOMIC_SEQ_CST ); proc->io.submit_q.helped              = 0;
     73                        __atomic_fetch_add( &cltr->io.submit_q.leader             , proc->io.submit_q.leader             , __ATOMIC_SEQ_CST ); proc->io.submit_q.leader              = 0;
     74                        __atomic_fetch_add( &cltr->io.submit_q.busy               , proc->io.submit_q.busy               , __ATOMIC_SEQ_CST ); proc->io.submit_q.busy                = 0;
     75                        __atomic_fetch_add( &cltr->io.complete_q.completed_avg.val, proc->io.complete_q.completed_avg.val, __ATOMIC_SEQ_CST ); proc->io.complete_q.completed_avg.val = 0;
     76                        __atomic_fetch_add( &cltr->io.complete_q.completed_avg.cnt, proc->io.complete_q.completed_avg.cnt, __ATOMIC_SEQ_CST ); proc->io.complete_q.completed_avg.cnt = 0;
     77                        __atomic_fetch_add( &cltr->io.complete_q.blocks           , proc->io.complete_q.blocks           , __ATOMIC_SEQ_CST ); proc->io.complete_q.blocks            = 0;
    11878                #endif
    11979        }
    12080
    121         #define eng3(X) (ws(3, 3, unit(eng( X ))))
    122 
    12381        void __print_stats( struct __stats_t * stats, int flags, const char * type, const char * name, void * id ) with( *stats ) {
    12482
    125                 char buf[1024];
    126                 ostrstream sstr = { buf, 1024 };
     83                if( flags & CFA_STATS_READY_Q ) {
     84                        double push_sur = (100.0 * ((double)ready.pick.push.success) / ready.pick.push.attempt);
     85                        double pop_sur  = (100.0 * ((double)ready.pick.pop .success) / ready.pick.pop .attempt);
    12786
    128                 if( flags & CFA_STATS_READY_Q ) {
     87                        double push_len = ((double)ready.pick.push.attempt) / ready.pick.push.success;
     88                        double pop_len  = ((double)ready.pick.pop .attempt) / ready.pick.pop .success;
    12989
    130                         sstr | "----- " | type | "\"" | name | "\" (" | "" | id | "" | ") - Ready Q Stats -----";
     90                        double lpush_sur = (100.0 * ((double)ready.pick.push.lsuccess) / ready.pick.push.local);
     91                        double lpop_sur  = (100.0 * ((double)ready.pick.pop .lsuccess) / ready.pick.pop .local);
    13192
    132                         uint64_t totalR = ready.pop.local.success + ready.pop.help.success + ready.pop.steal.success + ready.pop.search.success;
    133                         uint64_t totalS = ready.push.local.success + ready.push.share.success + ready.push.extrn.success;
    134                         sstr | "- totals   : " | eng3(totalR) | "run," | eng3(totalS) | "schd (" | eng3(ready.push.extrn.success) | "ext," | eng3(ready.threads.migration) | "mig)";
     93                        double lpush_len = ((double)ready.pick.push.local) / ready.pick.push.lsuccess;
     94                        double lpop_len  = ((double)ready.pick.pop .local) / ready.pick.pop .lsuccess;
    13595
    136                         double push_len = ((double)ready.push.local.attempt + ready.push.share.attempt + ready.push.extrn.attempt) / totalS;
    137                         double sLcl_len = ready.push.local.success ? ((double)ready.push.local.attempt) / ready.push.local.success : 0;
    138                         double sOth_len = ready.push.share.success ? ((double)ready.push.share.attempt) / ready.push.share.success : 0;
    139                         double sExt_len = ready.push.extrn.success ? ((double)ready.push.extrn.attempt) / ready.push.extrn.success : 0;
    140                         sstr | "- push avg : " | ws(3, 3, push_len)
    141                              | "- l: " | eng3(ready.push.local.attempt) | " (" | ws(3, 3, sLcl_len) | ")"
    142                              | ", s: " | eng3(ready.push.share.attempt) | " (" | ws(3, 3, sOth_len) | ")"
    143                              | ", e: " | eng3(ready.push.extrn.attempt) | " (" | ws(3, 3, sExt_len) | ")";
    144 
    145                         double rLcl_pc = (100.0 * (double)ready.pop.local .success) / totalR;
    146                         sstr | "- local    : " | eng3(ready.pop.local .success) | "-"| ws(3, 3, rLcl_pc) | '%'
    147                              | " (" | eng3(ready.pop.local .attempt) | " try," | eng3(ready.pop.local .espec) | " spc," | eng3(ready.pop.local .elock) | " lck," | eng3(ready.pop.local .eempty) | " ept)";
    148                         double rHlp_pc = (100.0 * (double)ready.pop.help  .success) / totalR;
    149                         sstr | "- help     : " | eng3(ready.pop.help  .success) | "-"| ws(3, 3, rHlp_pc) | '%'
    150                              | " (" | eng3(ready.pop.help  .attempt) | " try," | eng3(ready.pop.help  .espec) | " spc," | eng3(ready.pop.help  .elock) | " lck," | eng3(ready.pop.help  .eempty) | " ept)";
    151                         double rStl_pc = (100.0 * (double)ready.pop.steal .success) / totalR;
    152                         sstr | "- steal    : " | eng3(ready.pop.steal .success) | "-"| ws(3, 3, rStl_pc) | '%'
    153                              | " (" | eng3(ready.pop.steal .attempt) | " try," | eng3(ready.pop.steal .espec) | " spc," | eng3(ready.pop.steal .elock) | " lck," | eng3(ready.pop.steal .eempty) | " ept)";
    154                         double rSch_pc = (100.0 * (double)ready.pop.search.success) / totalR;
    155                         sstr | "- search   : " | eng3(ready.pop.search.success) | "-"| ws(3, 3, rSch_pc) | '%'
    156                              | " (" | eng3(ready.pop.search.attempt) | " try," | eng3(ready.pop.search.espec) | " spc," | eng3(ready.pop.search.elock) | " lck," | eng3(ready.pop.search.eempty) | " ept)";
    157 
    158                         sstr | "- Idle Slp : " | eng3(ready.sleep.halts) | "halt," | eng3(ready.sleep.cancels) | "cancel," | eng3(ready.sleep.wakes) | "wake," | eng3(ready.sleep.exits) | "exit";
    159                         sstr | nl;
     96                        __cfaabi_bits_print_safe( STDOUT_FILENO,
     97                                "----- %s \"%s\" (%p) - Ready Q Stats -----\n"
     98                                "- total threads run      : %'15" PRIu64 "\n"
     99                                "- total threads scheduled: %'15" PRIu64 "\n"
     100                                "- push average probe len : %'18.2lf, %'18.2lf%% (%'15" PRIu64 " attempts)\n"
     101                                "- pop  average probe len : %'18.2lf, %'18.2lf%% (%'15" PRIu64 " attempts)\n"
     102                                "- local push avg prb len : %'18.2lf, %'18.2lf%% (%'15" PRIu64 " attempts)\n"
     103                                "- local pop  avg prb len : %'18.2lf, %'18.2lf%% (%'15" PRIu64 " attempts)\n"
     104                                "- thread migrations      : %'15" PRIu64 "\n"
     105                                "- Idle Sleep -\n"
     106                                "-- halts                 : %'15" PRIu64 "\n"
     107                                "-- cancelled halts       : %'15" PRIu64 "\n"
     108                                "-- schedule wake         : %'15" PRIu64 "\n"
     109                                "-- wake on exit          : %'15" PRIu64 "\n"
     110                                "\n"
     111                                , type, name, id
     112                                , ready.pick.pop.success
     113                                , ready.pick.push.success
     114                                , push_len, push_sur, ready.pick.push.attempt
     115                                , pop_len , pop_sur , ready.pick.pop .attempt
     116                                , lpush_len, lpush_sur, ready.pick.push.local
     117                                , lpop_len , lpop_sur , ready.pick.pop .local
     118                                , ready.threads.migration
     119                                , ready.sleep.halts, ready.sleep.cancels, ready.sleep.wakes, ready.sleep.exits
     120                        );
    160121                }
    161122
    162123                #if defined(CFA_HAVE_LINUX_IO_URING_H)
    163124                        if( flags & CFA_STATS_IO ) {
    164                                 sstr | "----- " | type | "\"" | name | "\" (" | "" | id | "" | ") - I/O Stats -----";
     125                                double avgrdy = ((double)io.submit_q.submit_avg.rdy) / io.submit_q.submit_avg.cnt;
     126                                double avgcsm = ((double)io.submit_q.submit_avg.csm) / io.submit_q.submit_avg.cnt;
    165127
    166                                 uint64_t total_allocs = io.alloc.fast + io.alloc.slow;
    167                                 double avgfasta = (100.0 * (double)io.alloc.fast) / total_allocs;
    168                                 sstr | "- total allocations : " | eng3(io.alloc.fast) | "fast," | eng3(io.alloc.slow) | "slow (" | ws(3, 3, avgfasta) | "%)";
    169                                 sstr | "-     failures      : " | eng3(io.alloc.fail) | "oom, " | eng3(io.alloc.revoke) | "rvk, " | eng3(io.alloc.block) | "blk";
     128                                double lavgv = 0;
     129                                double lavgb = 0;
     130                                if(io.submit_q.look_avg.cnt != 0) {
     131                                        lavgv = ((double)io.submit_q.look_avg.val  ) / io.submit_q.look_avg.cnt;
     132                                        lavgb = ((double)io.submit_q.look_avg.block) / io.submit_q.look_avg.cnt;
     133                                }
    170134
    171                                 uint64_t total_submits = io.submit.fast + io.submit.slow;
    172                                 double avgfasts = (100.0 * (double)io.submit.fast) / total_submits;
    173                                 sstr | "- total submits     : " | eng3(io.submit.fast) | "fast," | eng3(io.submit.slow) | "slow (" | ws(3, 3, avgfasts) | "%)";
    174                                 sstr | "- flush external    : " | eng3(io.flush.external);
     135                                double aavgv = 0;
     136                                double aavgb = 0;
     137                                if(io.submit_q.alloc_avg.cnt != 0) {
     138                                        aavgv = ((double)io.submit_q.alloc_avg.val  ) / io.submit_q.alloc_avg.cnt;
     139                                        aavgb = ((double)io.submit_q.alloc_avg.block) / io.submit_q.alloc_avg.cnt;
     140                                }
    175141
    176                                 sstr | "- io_uring_enter    : " | eng3(io.calls.flush) | " (" | eng3(io.calls.drain) | ", " | eng3(io.calls.errors.busy) | " EBUSY)";
    177 
    178                                 double avgsubs = ((double)io.calls.submitted) / io.calls.flush;
    179                                 double avgcomp = ((double)io.calls.completed) / io.calls.drain;
    180                                 sstr | "-     submits       : " | eng3(io.calls.submitted) | "(" | ws(3, 3, avgsubs) | "/flush)";
    181                                 sstr | "-     completes     : " | eng3(io.calls.completed) | "(" | ws(3, 3, avgcomp) | "/drain)";
    182 
    183                                 sstr | "- poller sleeping   : " | eng3(io.poller.sleeps);
    184                                 sstr | nl;
     142                                __cfaabi_bits_print_safe( STDOUT_FILENO,
     143                                        "----- %s \"%s\" (%p) - I/O Stats -----\n"
     144                                        "- total submit calls     : %'15" PRIu64 "\n"
     145                                        "- avg ready entries      : %'18.2lf\n"
     146                                        "- avg submitted entries  : %'18.2lf\n"
     147                                        "- total helped entries   : %'15" PRIu64 "\n"
     148                                        "- total leader entries   : %'15" PRIu64 "\n"
     149                                        "- total busy submit      : %'15" PRIu64 "\n"
     150                                        "- total ready search     : %'15" PRIu64 "\n"
     151                                        "- avg ready search len   : %'18.2lf\n"
     152                                        "- avg ready search block : %'18.2lf\n"
     153                                        "- total alloc search     : %'15" PRIu64 "\n"
     154                                        "- avg alloc search len   : %'18.2lf\n"
     155                                        "- avg alloc search block : %'18.2lf\n"
     156                                        "- total wait calls       : %'15" PRIu64 "\n"
     157                                        "- avg completion/wait    : %'18.2lf\n"
     158                                        "- total completion blocks: %'15" PRIu64 "\n"
     159                                        "\n"
     160                                        , type,  name, id
     161                                        , io.submit_q.submit_avg.cnt
     162                                        , avgrdy, avgcsm
     163                                        , io.submit_q.helped, io.submit_q.leader, io.submit_q.busy
     164                                        , io.submit_q.look_avg.cnt
     165                                        , lavgv, lavgb
     166                                        , io.submit_q.alloc_avg.cnt
     167                                        , aavgv, aavgb
     168                                        , io.complete_q.completed_avg.cnt
     169                                        , ((double)io.complete_q.completed_avg.val) / io.complete_q.completed_avg.cnt
     170                                        , io.complete_q.blocks
     171                                );
    185172                        }
    186173                #endif
    187 
    188                 if(flags) write( sstr, stdout );
    189174        }
    190 
    191         #if defined(CFA_STATS_ARRAY)
    192                 extern "C" {
    193                         #include <stdio.h>
    194                         #include <errno.h>
    195                         #include <sys/stat.h>
    196                         #include <fcntl.h>
    197                 }
    198 
    199                 void __flush_stat( struct __stats_t * this, const char * name, void * handle) {
    200                         int ret = mkdir(".cfadata", 0755);
    201                         if(ret < 0 && errno != EEXIST) abort("Failed to create directory .cfadata: %d\n", errno);
    202 
    203                         char filename[100];
    204                         snprintf(filename, 100, ".cfadata/%s%p.data", name, handle);
    205 
    206                         int fd = open(filename, O_WRONLY | O_APPEND | O_CREAT, 0644);
    207                         if(fd < 0) abort("Failed to create file %s: %d\n", filename, errno);
    208 
    209                         for(i; this->array.cnt) {
    210                                 char line[100];
    211                                 size_t n = snprintf(line, 100, "%llu, %lld\n", this->array.values[i].ts, this->array.values[i].value);
    212                                 write(fd, line, n);
    213                         }
    214 
    215                         this->array.cnt = 0;
    216                         close(fd);
    217                 }
    218 
    219                 static __spinlock_t stats_lock;
    220 
    221                 void __push_stat( struct __stats_t * this, int64_t value, bool external, const char * name, void * handle ) {
    222                         if(external) lock(stats_lock __cfaabi_dbg_ctx2);
    223 
    224                         if( this->array.cnt >= CFA_STATS_ARRAY ) __flush_stat( this, name, handle );
    225 
    226                         size_t idx = this->array.cnt;
    227                         this->array.cnt++;
    228 
    229                         if(external) unlock(stats_lock);
    230 
    231                         this->array.values[idx].ts = rdtscl();
    232                         this->array.values[idx].value = value;
    233                 }
    234         #endif
    235175#endif
Note: See TracChangeset for help on using the changeset viewer.