summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2019-05-26 13:35:07 +0200
committerVladislav Vaintroub <wlad@mariadb.com>2019-05-26 19:20:35 +0200
commit307ca6935669ae9621aa36239ff3803b60640622 (patch)
tree2a56e34497d2f95f6319c463588ad142aeb1690f /sql
parent2fc13d04d16f878ed693ad8ba56045b79ccb9650 (diff)
downloadmariadb-git-307ca6935669ae9621aa36239ff3803b60640622.tar.gz
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.
Diffstat (limited to 'sql')
-rw-r--r--sql/sys_vars.cc14
-rw-r--r--sql/threadpool.h2
-rw-r--r--sql/threadpool_common.cc2
-rw-r--r--sql/threadpool_generic.cc4
4 files changed, 20 insertions, 2 deletions
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 1160e936a2b..a42a870d68f 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -3753,6 +3753,20 @@ static Sys_var_uint Sys_threadpool_threadpool_prio_kickup_timer(
GLOBAL_VAR(threadpool_prio_kickup_timer), CMD_LINE(REQUIRED_ARG),
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 */
/**
diff --git a/sql/threadpool.h b/sql/threadpool.h
index 7d2c34e0363..53ddc2d282d 100644
--- a/sql/threadpool.h
+++ b/sql/threadpool.h
@@ -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_oversubscribe; /* Maximum active threads in group */
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
extern uint threadpool_mode; /* Thread pool implementation , windows or generic */
#define TP_MODE_WINDOWS 0
diff --git a/sql/threadpool_common.cc b/sql/threadpool_common.cc
index 0cbd076016d..13e3886fb97 100644
--- a/sql/threadpool_common.cc
+++ b/sql/threadpool_common.cc
@@ -36,6 +36,8 @@ uint threadpool_max_threads;
uint threadpool_oversubscribe;
uint threadpool_mode;
uint threadpool_prio_kickup_timer;
+my_bool threadpool_exact_stats;
+my_bool threadpool_dedicated_listener;
/* Stats */
TP_STATISTICS tp_stats;
diff --git a/sql/threadpool_generic.cc b/sql/threadpool_generic.cc
index 3cb7be26eb7..162dad2e866 100644
--- a/sql/threadpool_generic.cc
+++ b/sql/threadpool_generic.cc
@@ -744,7 +744,7 @@ static TP_connection_generic * listener(worker_thread_t *current_thread,
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);
if (listener_picks_event)
{
@@ -1068,7 +1068,7 @@ static void queue_put(thread_group_t *thread_group, TP_connection_generic *conne
{
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);
if (thread_group->active_thread_count == 0)