Commit 307ca693 authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

Add some variables to the generic threadpool, that could help to analyze

stalls etc better.

- thread_pool_exact_stats -  uses high precision timestamp for
the time when connection was added to the queue. This timestamp helps
calculating queuing time shown in I_S.THREADPOOL_QUEUES entries.

- If thread_pool_dedicated_listener is on, then each group will have its
own dedicated listener, that does not convert to worker.
With this variable on, the queueing time in I_S.THREADPOOL_QUEUES , and
actual queue size in I_S.THREADPOOOL_GROUPS will be more exact, since
IO request are immediately dequeued from poll, without delay.


Part of MDEV-19313.
parent 2fc13d04
...@@ -1320,6 +1320,11 @@ The following specify which files/extra groups are read (specified before remain ...@@ -1320,6 +1320,11 @@ The following specify which files/extra groups are read (specified before remain
--thread-cache-size=# --thread-cache-size=#
How many threads we should keep in a cache for reuse. How many threads we should keep in a cache for reuse.
These are freed after 5 minutes of idle time These are freed after 5 minutes of idle time
--thread-pool-dedicated-listener
If set to 1,listener thread will not pick up queries
--thread-pool-exact-stats
If set to 1, provides better statistics in
information_schema threadpool tables
--thread-pool-idle-timeout=# --thread-pool-idle-timeout=#
Timeout in seconds for an idle thread in the thread Timeout in seconds for an idle thread in the thread
pool.Worker thread will be shut down after timeout pool.Worker thread will be shut down after timeout
...@@ -1744,6 +1749,8 @@ tcp-keepalive-probes 0 ...@@ -1744,6 +1749,8 @@ tcp-keepalive-probes 0
tcp-keepalive-time 0 tcp-keepalive-time 0
tcp-nodelay TRUE tcp-nodelay TRUE
thread-cache-size 151 thread-cache-size 151
thread-pool-dedicated-listener FALSE
thread-pool-exact-stats FALSE
thread-pool-idle-timeout 60 thread-pool-idle-timeout 60
thread-pool-max-threads 65536 thread-pool-max-threads 65536
thread-pool-oversubscribe 3 thread-pool-oversubscribe 3
......
...@@ -5346,6 +5346,34 @@ NUMERIC_BLOCK_SIZE NULL ...@@ -5346,6 +5346,34 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST one-thread-per-connection,no-threads,pool-of-threads ENUM_VALUE_LIST one-thread-per-connection,no-threads,pool-of-threads
READ_ONLY YES READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME THREAD_POOL_DEDICATED_LISTENER
SESSION_VALUE NULL
GLOBAL_VALUE OFF
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE OFF
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BOOLEAN
VARIABLE_COMMENT If set to 1,listener thread will not pick up queries
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST OFF,ON
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME THREAD_POOL_EXACT_STATS
SESSION_VALUE NULL
GLOBAL_VALUE OFF
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE OFF
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BOOLEAN
VARIABLE_COMMENT If set to 1, provides better statistics in information_schema threadpool tables
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST OFF,ON
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME THREAD_POOL_IDLE_TIMEOUT VARIABLE_NAME THREAD_POOL_IDLE_TIMEOUT
SESSION_VALUE NULL SESSION_VALUE NULL
GLOBAL_VALUE 60 GLOBAL_VALUE 60
......
...@@ -3753,6 +3753,20 @@ static Sys_var_uint Sys_threadpool_threadpool_prio_kickup_timer( ...@@ -3753,6 +3753,20 @@ static Sys_var_uint Sys_threadpool_threadpool_prio_kickup_timer(
GLOBAL_VAR(threadpool_prio_kickup_timer), CMD_LINE(REQUIRED_ARG), GLOBAL_VAR(threadpool_prio_kickup_timer), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, UINT_MAX), DEFAULT(1000), BLOCK_SIZE(1) VALID_RANGE(0, UINT_MAX), DEFAULT(1000), BLOCK_SIZE(1)
); );
static Sys_var_mybool Sys_threadpool_exact_stats(
"thread_pool_exact_stats",
"If set to 1, provides better statistics in information_schema threadpool tables",
GLOBAL_VAR(threadpool_exact_stats), CMD_LINE(OPT_ARG), DEFAULT(FALSE),
NO_MUTEX_GUARD, NOT_IN_BINLOG
);
static Sys_var_mybool Sys_threadpool_dedicated_listener(
"thread_pool_dedicated_listener",
"If set to 1,listener thread will not pick up queries",
GLOBAL_VAR(threadpool_dedicated_listener), CMD_LINE(OPT_ARG), DEFAULT(FALSE),
NO_MUTEX_GUARD, NOT_IN_BINLOG
);
#endif /* HAVE_POOL_OF_THREADS */ #endif /* HAVE_POOL_OF_THREADS */
/** /**
......
...@@ -28,6 +28,8 @@ extern uint threadpool_stall_limit; /* time interval in 10 ms units for stall c ...@@ -28,6 +28,8 @@ extern uint threadpool_stall_limit; /* time interval in 10 ms units for stall c
extern uint threadpool_max_threads; /* Maximum threads in pool */ extern uint threadpool_max_threads; /* Maximum threads in pool */
extern uint threadpool_oversubscribe; /* Maximum active threads in group */ extern uint threadpool_oversubscribe; /* Maximum active threads in group */
extern uint threadpool_prio_kickup_timer; /* Time before low prio item gets prio boost */ extern uint threadpool_prio_kickup_timer; /* Time before low prio item gets prio boost */
extern my_bool threadpool_exact_stats; /* Better queueing time stats for information_schema, at small performance cost */
extern my_bool threadpool_dedicated_listener; /* Listener thread does not pick up work items. */
#ifdef _WIN32 #ifdef _WIN32
extern uint threadpool_mode; /* Thread pool implementation , windows or generic */ extern uint threadpool_mode; /* Thread pool implementation , windows or generic */
#define TP_MODE_WINDOWS 0 #define TP_MODE_WINDOWS 0
......
...@@ -36,6 +36,8 @@ uint threadpool_max_threads; ...@@ -36,6 +36,8 @@ uint threadpool_max_threads;
uint threadpool_oversubscribe; uint threadpool_oversubscribe;
uint threadpool_mode; uint threadpool_mode;
uint threadpool_prio_kickup_timer; uint threadpool_prio_kickup_timer;
my_bool threadpool_exact_stats;
my_bool threadpool_dedicated_listener;
/* Stats */ /* Stats */
TP_STATISTICS tp_stats; TP_STATISTICS tp_stats;
......
...@@ -744,7 +744,7 @@ static TP_connection_generic * listener(worker_thread_t *current_thread, ...@@ -744,7 +744,7 @@ static TP_connection_generic * listener(worker_thread_t *current_thread,
more workers. more workers.
*/ */
bool listener_picks_event=is_queue_empty(thread_group); bool listener_picks_event=is_queue_empty(thread_group) && !threadpool_dedicated_listener;
queue_put(thread_group, ev, cnt); queue_put(thread_group, ev, cnt);
if (listener_picks_event) if (listener_picks_event)
{ {
...@@ -1068,7 +1068,7 @@ static void queue_put(thread_group_t *thread_group, TP_connection_generic *conne ...@@ -1068,7 +1068,7 @@ static void queue_put(thread_group_t *thread_group, TP_connection_generic *conne
{ {
DBUG_ENTER("queue_put"); DBUG_ENTER("queue_put");
connection->dequeue_time= pool_timer.current_microtime; connection->enqueue_time= threadpool_exact_stats?microsecond_interval_timer():pool_timer.current_microtime;
thread_group->queues[connection->priority].push_back(connection); thread_group->queues[connection->priority].push_back(connection);
if (thread_group->active_thread_count == 0) if (thread_group->active_thread_count == 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment