diff --git a/include/proxysql_glovars.hpp b/include/proxysql_glovars.hpp index 8dc1b2428..2e132a512 100644 --- a/include/proxysql_glovars.hpp +++ b/include/proxysql_glovars.hpp @@ -54,6 +54,11 @@ class ProxySQL_GlobalVariables { char *server_version; int poll_timeout; }; + struct { + unsigned long stack_memory_mysql_threads; + unsigned long stack_memory_admin_threads; + unsigned long stack_memory_cluster_threads; + } statuses; ProxySQL_GlobalVariables(); ~ProxySQL_GlobalVariables(); void process_opts_pre(); diff --git a/lib/ProxySQL_Admin.cpp b/lib/ProxySQL_Admin.cpp index eadb315cf..98a776b66 100644 --- a/lib/ProxySQL_Admin.cpp +++ b/lib/ProxySQL_Admin.cpp @@ -2446,6 +2446,14 @@ __run_query: void *child_mysql(void *arg) { + pthread_attr_t thread_attr; + size_t tmp_stack_size=0; + if (!pthread_attr_init(&thread_attr)) { + if (!pthread_attr_getstacksize(&thread_attr , &tmp_stack_size )) { + __sync_fetch_and_add(&GloVars.statuses.stack_memory_admin_threads,tmp_stack_size); + } + } + int client = *(int *)arg; GloMTH->wrlock(); @@ -2502,6 +2510,9 @@ void *child_mysql(void *arg) { __exit_child_mysql: delete mysql_thr; + + __sync_fetch_and_sub(&GloVars.statuses.stack_memory_admin_threads,tmp_stack_size); + return NULL; } @@ -3652,6 +3663,30 @@ void ProxySQL_Admin::stats___memory_metrics() { free(query); } } + { + unsigned long mu; + mu = __sync_fetch_and_add(&GloVars.statuses.stack_memory_mysql_threads,0); + vn=(char *)"stack_memory_mysql_threads"; + sprintf(bu,"%lu",mu); + query=(char *)malloc(strlen(a)+strlen(vn)+strlen(bu)+16); + sprintf(query,a,vn,bu); + statsdb->execute(query); + free(query); + mu = __sync_fetch_and_add(&GloVars.statuses.stack_memory_admin_threads,0); + vn=(char *)"stack_memory_admin_threads"; + sprintf(bu,"%lu",mu); + query=(char *)malloc(strlen(a)+strlen(vn)+strlen(bu)+16); + sprintf(query,a,vn,bu); + statsdb->execute(query); + free(query); + mu = __sync_fetch_and_add(&GloVars.statuses.stack_memory_cluster_threads,0); + vn=(char *)"stack_memory_cluster_threads"; + sprintf(bu,"%lu",mu); + query=(char *)malloc(strlen(a)+strlen(vn)+strlen(bu)+16); + sprintf(query,a,vn,bu); + statsdb->execute(query); + free(query); + } statsdb->execute("COMMIT"); } diff --git a/lib/ProxySQL_Cluster.cpp b/lib/ProxySQL_Cluster.cpp index 7a6371577..c14fad7a7 100644 --- a/lib/ProxySQL_Cluster.cpp +++ b/lib/ProxySQL_Cluster.cpp @@ -22,6 +22,15 @@ typedef struct _proxy_node_address_t { void * ProxySQL_Cluster_Monitor_thread(void *args) { + + pthread_attr_t thread_attr; + size_t tmp_stack_size=0; + if (!pthread_attr_init(&thread_attr)) { + if (!pthread_attr_getstacksize(&thread_attr , &tmp_stack_size )) { + __sync_fetch_and_add(&GloVars.statuses.stack_memory_cluster_threads,tmp_stack_size); + } + } + proxy_node_address_t * node = (proxy_node_address_t *)args; mysql_thread_init(); pthread_detach(pthread_self()); @@ -95,6 +104,9 @@ __exit_monitor_thread: //pthread_exit(0); mysql_thread_end(); //GloProxyCluster->thread_ending(node->thrid); + + __sync_fetch_and_sub(&GloVars.statuses.stack_memory_cluster_threads,tmp_stack_size); + return NULL; } diff --git a/lib/ProxySQL_GloVars.cpp b/lib/ProxySQL_GloVars.cpp index 151b672fe..b7eefca96 100644 --- a/lib/ProxySQL_GloVars.cpp +++ b/lib/ProxySQL_GloVars.cpp @@ -48,6 +48,11 @@ ProxySQL_GlobalVariables::ProxySQL_GlobalVariables() { __cmd_proxysql_initial=false; __cmd_proxysql_reload=false; + statuses.stack_memory_mysql_threads = 0; + statuses.stack_memory_admin_threads = 0; + statuses.stack_memory_cluster_threads = 0; + + global.gdbg=false; global.nostart=false; global.foreground=false; diff --git a/src/main.cpp b/src/main.cpp index acdb52d18..d48aef8c3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -195,6 +195,15 @@ ProxySQL_Cluster *GloProxyCluster = NULL; void * mysql_worker_thread_func(void *arg) { // __thr_sfp=l_mem_init(); + + pthread_attr_t thread_attr; + size_t tmp_stack_size=0; + if (!pthread_attr_init(&thread_attr)) { + if (!pthread_attr_getstacksize(&thread_attr , &tmp_stack_size )) { + __sync_fetch_and_add(&GloVars.statuses.stack_memory_mysql_threads,tmp_stack_size); + } + } + proxysql_mysql_thread_t *mysql_thread=(proxysql_mysql_thread_t *)arg; MySQL_Thread *worker = new MySQL_Thread(); mysql_thread->worker=worker; @@ -208,12 +217,21 @@ void * mysql_worker_thread_func(void *arg) { //delete worker; delete worker; // l_mem_destroy(__thr_sfp); + __sync_fetch_and_sub(&GloVars.statuses.stack_memory_mysql_threads,tmp_stack_size); return NULL; } #ifdef IDLE_THREADS void * mysql_worker_thread_func_idles(void *arg) { + pthread_attr_t thread_attr; + size_t tmp_stack_size=0; + if (!pthread_attr_init(&thread_attr)) { + if (!pthread_attr_getstacksize(&thread_attr , &tmp_stack_size )) { + __sync_fetch_and_add(&GloVars.statuses.stack_memory_mysql_threads,tmp_stack_size); + } + } + // __thr_sfp=l_mem_init(); proxysql_mysql_thread_t *mysql_thread=(proxysql_mysql_thread_t *)arg; MySQL_Thread *worker = new MySQL_Thread(); @@ -229,6 +247,9 @@ void * mysql_worker_thread_func_idles(void *arg) { //delete worker; delete worker; // l_mem_destroy(__thr_sfp); + + __sync_fetch_and_sub(&GloVars.statuses.stack_memory_mysql_threads,tmp_stack_size); + return NULL; } #endif // IDLE_THREADS