MINOR: activity: report context switch counts instead of rates
It's not logical to report context switch rates per thread in show activity because everything else is a counter and it's not even possible to compare values. Let's only report counts. Further, this simplifies the scheduler's code.
This commit is contained in:
parent
9634e86dc7
commit
bc13bec548
|
@ -50,12 +50,12 @@ struct activity {
|
||||||
/* one cache line */
|
/* one cache line */
|
||||||
struct freq_ctr cpust_1s; // avg amount of half-ms stolen over last second
|
struct freq_ctr cpust_1s; // avg amount of half-ms stolen over last second
|
||||||
struct freq_ctr_period cpust_15s; // avg amount of half-ms stolen over last 15s
|
struct freq_ctr_period cpust_15s; // avg amount of half-ms stolen over last 15s
|
||||||
struct freq_ctr ctxsw_rate;// context switching rate over last second
|
|
||||||
struct freq_ctr tasks_rate;// task wakeup rate over last second
|
|
||||||
unsigned int avg_loop_us; // average run time per loop over last 1024 runs
|
unsigned int avg_loop_us; // average run time per loop over last 1024 runs
|
||||||
unsigned int accepted; // accepted incoming connections
|
unsigned int accepted; // accepted incoming connections
|
||||||
unsigned int accq_pushed; // accept queue connections pushed
|
unsigned int accq_pushed; // accept queue connections pushed
|
||||||
unsigned int accq_full; // accept queue connection not pushed because full
|
unsigned int accq_full; // accept queue connection not pushed because full
|
||||||
|
unsigned int ctxsw; // total number of context switches
|
||||||
|
unsigned int tasksw; // total number of task switches
|
||||||
char __pad[0]; // unused except to check remaining room
|
char __pad[0]; // unused except to check remaining room
|
||||||
char __end[0] __attribute__((aligned(64))); // align size to 64.
|
char __end[0] __attribute__((aligned(64))); // align size to 64.
|
||||||
};
|
};
|
||||||
|
|
|
@ -1087,8 +1087,8 @@ static int cli_io_handler_show_activity(struct appctx *appctx)
|
||||||
chunk_appendf(&trash, "\nstream:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].stream);
|
chunk_appendf(&trash, "\nstream:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].stream);
|
||||||
chunk_appendf(&trash, "\nempty_rq:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].empty_rq);
|
chunk_appendf(&trash, "\nempty_rq:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].empty_rq);
|
||||||
chunk_appendf(&trash, "\nlong_rq:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].long_rq);
|
chunk_appendf(&trash, "\nlong_rq:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].long_rq);
|
||||||
chunk_appendf(&trash, "\nctxsw_rate:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", read_freq_ctr(&activity[thr].ctxsw_rate));
|
chunk_appendf(&trash, "\nctxsw:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].ctxsw);
|
||||||
chunk_appendf(&trash, "\ntasks_rate:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", read_freq_ctr(&activity[thr].tasks_rate));
|
chunk_appendf(&trash, "\ntasksw:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].tasksw);
|
||||||
chunk_appendf(&trash, "\ncpust_ms_tot:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].cpust_total/2);
|
chunk_appendf(&trash, "\ncpust_ms_tot:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", activity[thr].cpust_total/2);
|
||||||
chunk_appendf(&trash, "\ncpust_ms_1s:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", read_freq_ctr(&activity[thr].cpust_1s)/2);
|
chunk_appendf(&trash, "\ncpust_ms_1s:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", read_freq_ctr(&activity[thr].cpust_1s)/2);
|
||||||
chunk_appendf(&trash, "\ncpust_ms_15s:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", read_freq_ctr_period(&activity[thr].cpust_15s, 15000)/2);
|
chunk_appendf(&trash, "\ncpust_ms_15s:"); for (thr = 0; thr < global.nbthread; thr++) chunk_appendf(&trash, " %u", read_freq_ctr_period(&activity[thr].cpust_15s, 15000)/2);
|
||||||
|
|
13
src/task.c
13
src/task.c
|
@ -279,8 +279,6 @@ void process_runnable_tasks()
|
||||||
struct eb32sc_node *lrq = NULL; // next local run queue entry
|
struct eb32sc_node *lrq = NULL; // next local run queue entry
|
||||||
struct eb32sc_node *grq = NULL; // next global run queue entry
|
struct eb32sc_node *grq = NULL; // next global run queue entry
|
||||||
struct task *t;
|
struct task *t;
|
||||||
int to_process;
|
|
||||||
int wakeups;
|
|
||||||
int max_processed;
|
int max_processed;
|
||||||
|
|
||||||
if (!(active_tasks_mask & tid_bit)) {
|
if (!(active_tasks_mask & tid_bit)) {
|
||||||
|
@ -295,9 +293,6 @@ void process_runnable_tasks()
|
||||||
if (likely(niced_tasks))
|
if (likely(niced_tasks))
|
||||||
max_processed = (max_processed + 3) / 4;
|
max_processed = (max_processed + 3) / 4;
|
||||||
|
|
||||||
to_process = max_processed;
|
|
||||||
wakeups = 0;
|
|
||||||
|
|
||||||
/* Note: the grq lock is always held when grq is not null */
|
/* Note: the grq lock is always held when grq is not null */
|
||||||
|
|
||||||
while (task_per_thread[tid].task_list_size < max_processed) {
|
while (task_per_thread[tid].task_list_size < max_processed) {
|
||||||
|
@ -350,7 +345,7 @@ void process_runnable_tasks()
|
||||||
|
|
||||||
/* And add it to the local task list */
|
/* And add it to the local task list */
|
||||||
task_insert_into_tasklet_list(t);
|
task_insert_into_tasklet_list(t);
|
||||||
wakeups++;
|
activity[tid].tasksw++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* release the rqueue lock */
|
/* release the rqueue lock */
|
||||||
|
@ -377,6 +372,7 @@ void process_runnable_tasks()
|
||||||
__ha_barrier_atomic_store();
|
__ha_barrier_atomic_store();
|
||||||
__task_remove_from_tasklet_list(t);
|
__task_remove_from_tasklet_list(t);
|
||||||
|
|
||||||
|
activity[tid].ctxsw++;
|
||||||
ctx = t->context;
|
ctx = t->context;
|
||||||
process = t->process;
|
process = t->process;
|
||||||
t->calls++;
|
t->calls++;
|
||||||
|
@ -426,11 +422,6 @@ void process_runnable_tasks()
|
||||||
_HA_ATOMIC_OR(&active_tasks_mask, tid_bit);
|
_HA_ATOMIC_OR(&active_tasks_mask, tid_bit);
|
||||||
activity[tid].long_rq++;
|
activity[tid].long_rq++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wakeups)
|
|
||||||
update_freq_ctr(&activity[tid].tasks_rate, wakeups);
|
|
||||||
if (to_process - max_processed)
|
|
||||||
update_freq_ctr(&activity[tid].ctxsw_rate, to_process - max_processed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue