Skip to content

Commit b2c7680

Browse files
riptlripatel-fd
authored andcommitted
Add VM execution metrics to exec tile
Collect transaction-, VM, and CPI-level setup, execute, and commit timings.
1 parent e2fe66c commit b2c7680

File tree

9 files changed

+174
-4
lines changed

9 files changed

+174
-4
lines changed

book/api/metrics-generated.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,14 @@
11361136
| <span class="metrics-name">exec_&#8203;progcache_&#8203;dup_&#8203;inserts</span> | counter | Number of time two tiles raced to insert the same cache entry |
11371137
| <span class="metrics-name">exec_&#8203;progcache_&#8203;invalidations</span> | counter | Number of program cache invalidations |
11381138
| <span class="metrics-name">exec_&#8203;accdb_&#8203;created</span> | counter | Number of account database records created |
1139+
| <span class="metrics-name">exec_&#8203;txn_&#8203;regime</span><br/>{txn_&#8203;regime="<span class="metrics-enum">setup</span>"} | counter | Mutually exclusive and exhaustive duration of time spent in transaction execution regimes. (Transaction setup) |
1140+
| <span class="metrics-name">exec_&#8203;txn_&#8203;regime</span><br/>{txn_&#8203;regime="<span class="metrics-enum">exec</span>"} | counter | Mutually exclusive and exhaustive duration of time spent in transaction execution regimes. (Transaction execution (includes VM setup/execution)) |
1141+
| <span class="metrics-name">exec_&#8203;txn_&#8203;regime</span><br/>{txn_&#8203;regime="<span class="metrics-enum">commit</span>"} | counter | Mutually exclusive and exhaustive duration of time spent in transaction execution regimes. (Transaction result commit) |
1142+
| <span class="metrics-name">exec_&#8203;vm_&#8203;regime</span><br/>{vm_&#8203;regime="<span class="metrics-enum">setup</span>"} | counter | Mutually exclusive and exhaustive duration of time spent in virtual machine execution regimes. (VM setup) |
1143+
| <span class="metrics-name">exec_&#8203;vm_&#8203;regime</span><br/>{vm_&#8203;regime="<span class="metrics-enum">commit</span>"} | counter | Mutually exclusive and exhaustive duration of time spent in virtual machine execution regimes. (VM commit) |
1144+
| <span class="metrics-name">exec_&#8203;vm_&#8203;regime</span><br/>{vm_&#8203;regime="<span class="metrics-enum">setup_&#8203;cpi</span>"} | counter | Mutually exclusive and exhaustive duration of time spent in virtual machine execution regimes. (VM setup (CPI)) |
1145+
| <span class="metrics-name">exec_&#8203;vm_&#8203;regime</span><br/>{vm_&#8203;regime="<span class="metrics-enum">commit_&#8203;cpi</span>"} | counter | Mutually exclusive and exhaustive duration of time spent in virtual machine execution regimes. (VM commit (CPI)) |
1146+
| <span class="metrics-name">exec_&#8203;vm_&#8203;regime</span><br/>{vm_&#8203;regime="<span class="metrics-enum">interpreter</span>"} | counter | Mutually exclusive and exhaustive duration of time spent in virtual machine execution regimes. (VM interpreter execution) |
11391147

11401148
</div>
11411149

src/disco/metrics/generated/fd_metrics_enums.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,4 +764,26 @@
764764
#define FD_METRICS_ENUM_ROUTE_TABLE_V_MAIN_IDX 1
765765
#define FD_METRICS_ENUM_ROUTE_TABLE_V_MAIN_NAME "main"
766766

767+
#define FD_METRICS_ENUM_TXN_REGIME_NAME "txn_regime"
768+
#define FD_METRICS_ENUM_TXN_REGIME_CNT (3UL)
769+
#define FD_METRICS_ENUM_TXN_REGIME_V_SETUP_IDX 0
770+
#define FD_METRICS_ENUM_TXN_REGIME_V_SETUP_NAME "setup"
771+
#define FD_METRICS_ENUM_TXN_REGIME_V_EXEC_IDX 1
772+
#define FD_METRICS_ENUM_TXN_REGIME_V_EXEC_NAME "exec"
773+
#define FD_METRICS_ENUM_TXN_REGIME_V_COMMIT_IDX 2
774+
#define FD_METRICS_ENUM_TXN_REGIME_V_COMMIT_NAME "commit"
775+
776+
#define FD_METRICS_ENUM_VM_REGIME_NAME "vm_regime"
777+
#define FD_METRICS_ENUM_VM_REGIME_CNT (5UL)
778+
#define FD_METRICS_ENUM_VM_REGIME_V_SETUP_IDX 0
779+
#define FD_METRICS_ENUM_VM_REGIME_V_SETUP_NAME "setup"
780+
#define FD_METRICS_ENUM_VM_REGIME_V_COMMIT_IDX 1
781+
#define FD_METRICS_ENUM_VM_REGIME_V_COMMIT_NAME "commit"
782+
#define FD_METRICS_ENUM_VM_REGIME_V_SETUP_CPI_IDX 2
783+
#define FD_METRICS_ENUM_VM_REGIME_V_SETUP_CPI_NAME "setup_cpi"
784+
#define FD_METRICS_ENUM_VM_REGIME_V_COMMIT_CPI_IDX 3
785+
#define FD_METRICS_ENUM_VM_REGIME_V_COMMIT_CPI_NAME "commit_cpi"
786+
#define FD_METRICS_ENUM_VM_REGIME_V_INTERPRETER_IDX 4
787+
#define FD_METRICS_ENUM_VM_REGIME_V_INTERPRETER_NAME "interpreter"
788+
767789
#endif /* HEADER_fd_src_disco_metrics_generated_fd_metrics_enums_h */

src/disco/metrics/generated/fd_metrics_exec.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,12 @@ const fd_metrics_meta_t FD_METRICS_EXEC[FD_METRICS_EXEC_TOTAL] = {
1010
DECLARE_METRIC( EXEC_PROGCACHE_DUP_INSERTS, COUNTER ),
1111
DECLARE_METRIC( EXEC_PROGCACHE_INVALIDATIONS, COUNTER ),
1212
DECLARE_METRIC( EXEC_ACCDB_CREATED, COUNTER ),
13+
DECLARE_METRIC_ENUM( EXEC_TXN_REGIME, COUNTER, TXN_REGIME, SETUP ),
14+
DECLARE_METRIC_ENUM( EXEC_TXN_REGIME, COUNTER, TXN_REGIME, EXEC ),
15+
DECLARE_METRIC_ENUM( EXEC_TXN_REGIME, COUNTER, TXN_REGIME, COMMIT ),
16+
DECLARE_METRIC_ENUM( EXEC_VM_REGIME, COUNTER, VM_REGIME, SETUP ),
17+
DECLARE_METRIC_ENUM( EXEC_VM_REGIME, COUNTER, VM_REGIME, COMMIT ),
18+
DECLARE_METRIC_ENUM( EXEC_VM_REGIME, COUNTER, VM_REGIME, SETUP_CPI ),
19+
DECLARE_METRIC_ENUM( EXEC_VM_REGIME, COUNTER, VM_REGIME, COMMIT_CPI ),
20+
DECLARE_METRIC_ENUM( EXEC_VM_REGIME, COUNTER, VM_REGIME, INTERPRETER ),
1321
};

src/disco/metrics/generated/fd_metrics_exec.h

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,31 @@
5454
#define FD_METRICS_COUNTER_EXEC_ACCDB_CREATED_DESC "Number of account database records created"
5555
#define FD_METRICS_COUNTER_EXEC_ACCDB_CREATED_CVT (FD_METRICS_CONVERTER_NONE)
5656

57-
#define FD_METRICS_EXEC_TOTAL (8UL)
57+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_OFF (24UL)
58+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_NAME "exec_txn_regime"
59+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_TYPE (FD_METRICS_TYPE_COUNTER)
60+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_DESC "Mutually exclusive and exhaustive duration of time spent in transaction execution regimes."
61+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_CVT (FD_METRICS_CONVERTER_NANOSECONDS)
62+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_CNT (3UL)
63+
64+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_SETUP_OFF (24UL)
65+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_EXEC_OFF (25UL)
66+
#define FD_METRICS_COUNTER_EXEC_TXN_REGIME_COMMIT_OFF (26UL)
67+
68+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_OFF (27UL)
69+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_NAME "exec_vm_regime"
70+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_TYPE (FD_METRICS_TYPE_COUNTER)
71+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_DESC "Mutually exclusive and exhaustive duration of time spent in virtual machine execution regimes."
72+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_CVT (FD_METRICS_CONVERTER_NANOSECONDS)
73+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_CNT (5UL)
74+
75+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_SETUP_OFF (27UL)
76+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_COMMIT_OFF (28UL)
77+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_SETUP_CPI_OFF (29UL)
78+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_COMMIT_CPI_OFF (30UL)
79+
#define FD_METRICS_COUNTER_EXEC_VM_REGIME_INTERPRETER_OFF (31UL)
80+
81+
#define FD_METRICS_EXEC_TOTAL (16UL)
5882
extern const fd_metrics_meta_t FD_METRICS_EXEC[FD_METRICS_EXEC_TOTAL];
5983

6084
#endif /* HEADER_fd_src_disco_metrics_generated_fd_metrics_exec_h */

src/disco/metrics/metrics.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,20 @@ metric introduced.
11191119
<gauge name="StartSlot" summary="The slot at which the backtest started" />
11201120
</tile>
11211121

1122+
<enum name="TxnRegime">
1123+
<int value="0" name="Setup" label="Transaction setup" />
1124+
<int value="1" name="Exec" label="Transaction execution (includes VM setup/execution)" />
1125+
<int value="2" name="Commit" label="Transaction result commit" />
1126+
</enum>
1127+
1128+
<enum name="VmRegime">
1129+
<int value="0" name="Setup" label="VM setup" />
1130+
<int value="1" name="Commit" label="VM commit" />
1131+
<int value="2" name="SetupCpi" label="VM setup (CPI)" />
1132+
<int value="3" name="CommitCpi" label="VM commit (CPI)" />
1133+
<int value="4" name="Interpreter" label="VM interpreter execution" />
1134+
</enum>
1135+
11221136
<tile name="exec">
11231137
<counter name="ProgcacheMisses" summary="Number of program cache misses" />
11241138
<counter name="ProgcacheHits" summary="Number of program cache hits" />
@@ -1128,6 +1142,9 @@ metric introduced.
11281142
<counter name="ProgcacheDupInserts" summary="Number of time two tiles raced to insert the same cache entry" />
11291143
<counter name="ProgcacheInvalidations" summary="Number of program cache invalidations" />
11301144
<counter name="AccdbCreated" summary="Number of account database records created" />
1145+
1146+
<counter name="TxnRegime" converter="nanoseconds" enum="TxnRegime" summary="Mutually exclusive and exhaustive duration of time spent in transaction execution regimes." />
1147+
<counter name="VmRegime" converter="nanoseconds" enum="VmRegime" summary="Mutually exclusive and exhaustive duration of time spent in virtual machine execution regimes." />
11311148
</tile>
11321149

11331150
<tile name="benchs">

src/discof/exec/fd_exec_tile.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,17 @@ typedef struct fd_exec_tile_ctx {
7272

7373
fd_runtime_t runtime[1];
7474

75+
struct {
76+
/* Ticks spent preparing a txn (database reads, account copies) */
77+
ulong txn_setup_cum_ticks;
78+
79+
/* Ticks spent executing a txn (includes any VM time) */
80+
ulong txn_exec_cum_ticks;
81+
82+
/* Ticks spent committing a txn (database writes) */
83+
ulong txn_commit_cum_ticks;
84+
} metrics;
85+
7586
} fd_exec_tile_ctx_t;
7687

7788
FD_FN_CONST static inline ulong
@@ -99,6 +110,20 @@ metrics_write( fd_exec_tile_ctx_t * ctx ) {
99110
FD_MCNT_SET( EXEC, PROGCACHE_INVALIDATIONS, progcache->metrics->invalidate_cnt );
100111
FD_MCNT_SET( EXEC, PROGCACHE_DUP_INSERTS, progcache->metrics->dup_insert_cnt );
101112

113+
FD_MCNT_SET( EXEC, TXN_REGIME_SETUP, ctx->metrics.txn_setup_cum_ticks );
114+
FD_MCNT_SET( EXEC, TXN_REGIME_EXEC, ctx->metrics.txn_exec_cum_ticks );
115+
FD_MCNT_SET( EXEC, TXN_REGIME_COMMIT, ctx->metrics.txn_commit_cum_ticks );
116+
117+
fd_runtime_t const * runtime = ctx->runtime;
118+
ulong cpi_ticks = runtime->metrics.cpi_setup_cum_ticks +
119+
runtime->metrics.cpi_commit_cum_ticks;
120+
ulong exec_ticks = runtime->metrics.vm_exec_cum_ticks - cpi_ticks;
121+
FD_MCNT_SET( EXEC, VM_REGIME_SETUP, runtime->metrics.vm_setup_cum_ticks );
122+
FD_MCNT_SET( EXEC, VM_REGIME_COMMIT, runtime->metrics.vm_commit_cum_ticks );
123+
FD_MCNT_SET( EXEC, VM_REGIME_SETUP_CPI, runtime->metrics.cpi_setup_cum_ticks );
124+
FD_MCNT_SET( EXEC, VM_REGIME_COMMIT_CPI, runtime->metrics.cpi_commit_cum_ticks );
125+
FD_MCNT_SET( EXEC, VM_REGIME_INTERPRETER, exec_ticks );
126+
102127
fd_accdb_user_t * accdb = ctx->accdb;
103128
FD_MCNT_SET( EXEC, ACCDB_CREATED, accdb->base.created_cnt );
104129
}
@@ -181,6 +206,24 @@ returnable_frag( fd_exec_tile_ctx_t * ctx,
181206
ctx->slot = fd_bank_slot_get( ctx->bank );
182207
publish_txn_finalized_msg( ctx, stem );
183208

209+
/* Update metrics */
210+
ulong setup_dt = (ulong)ctx->txn_out.details.exec_start_timestamp - (ulong)ctx->txn_out.details.prep_start_timestamp;
211+
ulong exec_dt = (ulong)ctx->txn_out.details.commit_start_timestamp - (ulong)ctx->txn_out.details.exec_start_timestamp;
212+
ulong commit_dt = (ulong)fd_tickcount() - (ulong)ctx->txn_out.details.commit_start_timestamp;
213+
if( FD_UNLIKELY( ctx->txn_out.details.prep_start_timestamp==LONG_MAX ) ) {
214+
setup_dt = 0UL;
215+
}
216+
if( FD_UNLIKELY( ctx->txn_out.details.exec_start_timestamp==LONG_MAX ) ) {
217+
setup_dt = 0UL;
218+
exec_dt = 0UL;
219+
}
220+
if( FD_UNLIKELY( ctx->txn_out.details.commit_start_timestamp==LONG_MAX ) ) {
221+
commit_dt = 0UL;
222+
}
223+
ctx->metrics.txn_setup_cum_ticks += setup_dt;
224+
ctx->metrics.txn_exec_cum_ticks += exec_dt;
225+
ctx->metrics.txn_commit_cum_ticks += commit_dt;
226+
184227
break;
185228
}
186229
case FD_EXEC_TT_TXN_SIGVERIFY: {
@@ -361,6 +404,9 @@ unprivileged_init( fd_topo_t * topo,
361404
ctx->runtime->log.enable_vm_tracing = 0;
362405
ctx->runtime->log.tracing_mem = &ctx->tracing_mem[0][0];
363406
ctx->runtime->log.capture_ctx = ctx->capture_ctx;
407+
408+
memset( &ctx->metrics, 0, sizeof(ctx->metrics) );
409+
memset( &ctx->runtime->metrics, 0, sizeof(ctx->runtime->metrics) );
364410
}
365411

366412
static ulong

src/flamenco/runtime/fd_runtime.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,26 @@ struct fd_runtime {
136136
ulong starting_dlen[ MAX_TX_ACCOUNT_LOCKS ]; /* Starting data length for each account */
137137
ulong refcnt[ MAX_TX_ACCOUNT_LOCKS ]; /* Reference count for each account */
138138
} accounts;
139+
140+
struct {
141+
142+
/* Ticks spent spent preparing a txn-level VM (zeroing memory,
143+
copying account data, etc) */
144+
ulong vm_setup_cum_ticks;
145+
146+
/* Ticks spent committing txn-level VM results (copying account
147+
data, etc) */
148+
ulong vm_commit_cum_ticks;
149+
150+
/* Ticks spent in top-levl VM interpreter (includes CPI setup/commit
151+
ticks) */
152+
ulong vm_exec_cum_ticks;
153+
154+
/* Ticks spent preparing/committing a cross-program invocation) */
155+
ulong cpi_setup_cum_ticks;
156+
ulong cpi_commit_cum_ticks;
157+
158+
} metrics;
139159
};
140160
typedef struct fd_runtime fd_runtime_t;
141161

src/flamenco/runtime/program/fd_bpf_loader_program.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ int
376376
fd_bpf_execute( fd_exec_instr_ctx_t * instr_ctx,
377377
fd_progcache_rec_t const * cache_entry,
378378
uchar is_deprecated ) {
379+
long const regime0 = fd_tickcount();
379380

380381
int err = FD_EXECUTOR_INSTR_SUCCESS;
381382

@@ -479,9 +480,20 @@ fd_bpf_execute( fd_exec_instr_ctx_t * instr_ctx,
479480
if( FD_UNLIKELY( !vm->trace ) ) FD_LOG_ERR(( "unable to create trace; make sure you've compiled with sufficient spad size " ));
480481
}
481482

483+
long const regime1 = fd_tickcount();
484+
482485
int exec_err = fd_vm_exec( vm );
483486
instr_ctx->txn_out->details.compute_budget.compute_meter = vm->cu;
484487

488+
long const regime2 = fd_tickcount();
489+
490+
if( instr_ctx->instr->stack_height==1 ) {
491+
instr_ctx->runtime->metrics.vm_setup_cum_ticks += (ulong)( regime1-regime0 );
492+
instr_ctx->runtime->metrics.vm_exec_cum_ticks += (ulong)( regime2-regime1 );
493+
} else {
494+
instr_ctx->runtime->metrics.cpi_setup_cum_ticks += (ulong)( regime1-regime0 );
495+
}
496+
485497
if( FD_UNLIKELY( vm->trace ) ) {
486498
err = fd_vm_trace_printf( vm->trace, vm->syscalls );
487499
if( FD_UNLIKELY( err ) ) {
@@ -625,11 +637,15 @@ fd_bpf_execute( fd_exec_instr_ctx_t * instr_ctx,
625637

626638
err = fd_bpf_loader_input_deserialize_parameters(
627639
instr_ctx, pre_lens, input, input_sz, stricter_abi_and_runtime_constraints, direct_mapping, is_deprecated );
628-
if( FD_UNLIKELY( err ) ) {
629-
return err;
640+
641+
long const regime3 = fd_tickcount();
642+
if( instr_ctx->instr->stack_height==1 ) {
643+
instr_ctx->runtime->metrics.cpi_commit_cum_ticks += (ulong)( regime3-regime2 );
644+
} else {
645+
instr_ctx->runtime->metrics.vm_commit_cum_ticks += (ulong)( regime3-regime2 );
630646
}
631647

632-
return FD_EXECUTOR_INSTR_SUCCESS;
648+
return err;
633649
}
634650

635651
/* https://github.com/anza-xyz/agave/blob/v2.3.1/programs/bpf_loader/src/lib.rs#L1358-L1539 */

src/flamenco/vm/syscall/fd_vm_syscall_cpi_common.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,7 @@ VM_SYSCALL_CPI_ENTRYPOINT( void * _vm,
675675
ulong signers_seeds_va,
676676
ulong signers_seeds_cnt,
677677
ulong * _ret ) {
678+
long const regime0 = fd_tickcount();
678679

679680
fd_vm_t * vm = (fd_vm_t *)_vm;
680681

@@ -907,10 +908,15 @@ VM_SYSCALL_CPI_ENTRYPOINT( void * _vm,
907908
so that the callee cannot use compute units that the caller has already used. */
908909
vm->instr_ctx->txn_out->details.compute_budget.compute_meter = vm->cu;
909910

911+
long const regime1 = fd_tickcount();
912+
910913
/* Execute the CPI instruction in the runtime */
911914
int err_exec = fd_execute_instr( vm->instr_ctx->runtime, vm->instr_ctx->bank, vm->instr_ctx->txn_in, vm->instr_ctx->txn_out, instruction_to_execute );
912915
ulong instr_exec_res = (ulong)err_exec;
913916

917+
long const regime2 = fd_tickcount();
918+
vm->instr_ctx->runtime->metrics.cpi_setup_cum_ticks += (ulong)( regime1-regime0 );
919+
914920
/* Set the CU meter to the instruction context's transaction context's compute meter,
915921
so that the caller can't use compute units that the callee has already used. */
916922
vm->cu = vm->instr_ctx->txn_out->details.compute_budget.compute_meter;
@@ -958,6 +964,9 @@ VM_SYSCALL_CPI_ENTRYPOINT( void * _vm,
958964
}
959965
}
960966

967+
long const regime3 = fd_tickcount();
968+
vm->instr_ctx->runtime->metrics.cpi_commit_cum_ticks += (ulong)( regime3-regime2 );
969+
961970
return FD_VM_SUCCESS;
962971
}
963972

0 commit comments

Comments
 (0)