摘要:使用了稱之為的一系列文件和結(jié)構(gòu)來進(jìn)行監(jiān)控。的使用就像一個(gè)全局變量,哪個(gè)線程都可以用,但是實(shí)際上對(duì)應(yīng)了線程內(nèi)部的變量值,可以參見該例。規(guī)定,線程存儲(chǔ)變量必須要先初始化。
MySQL使用了稱之為psi/pfs的一系列文件和結(jié)構(gòu)來進(jìn)行performance監(jiān)控。Psi全稱為performance schema interface,pfs全稱為performance storage。
該機(jī)制使用pthead來進(jìn)行操作,其首先定義了pthread的線程存儲(chǔ)變量(pfs.cc):
thread_local_key_t THR_PFS; thread_local_key_t THR_PFS_VG; // global_variables thread_local_key_t THR_PFS_SV; // session_variables thread_local_key_t THR_PFS_VBT; // variables_by_thread thread_local_key_t THR_PFS_SG; // global_status thread_local_key_t THR_PFS_SS; // session_status thread_local_key_t THR_PFS_SBT; // status_by_thread thread_local_key_t THR_PFS_SBU; // status_by_user thread_local_key_t THR_PFS_SBH; // status_by_host thread_local_key_t THR_PFS_SBA; // status_by_account bool THR_PFS_initialized= false;
這里的thread_local_key_t實(shí)際上是pthread_key_t,即pthread線程存儲(chǔ)變量。pthread_key_t的使用就像一個(gè)全局變量,哪個(gè)線程都可以用,但是實(shí)際上對(duì)應(yīng)了線程內(nèi)部的變量值,可以參見該例:http://www.jianshu.com/p/d52c...。pthread規(guī)定,線程存儲(chǔ)變量thread_local_key_t必須要先初始化。MySQL在pfs_server.cc中對(duì)這些變量統(tǒng)一初始化:
void pre_initialize_performance_schema() { pfs_initialized= false; init_all_builtin_memory_class(); PFS_table_stat::g_reset_template.reset(); global_idle_stat.reset(); global_table_io_stat.reset(); global_table_lock_stat.reset(); if (my_create_thread_local_key(&THR_PFS, destroy_pfs_thread)) return; if (my_create_thread_local_key(&THR_PFS_VG, NULL)) // global_variables return; if (my_create_thread_local_key(&THR_PFS_SV, NULL)) // session_variables return; if (my_create_thread_local_key(&THR_PFS_VBT, NULL)) // variables_by_thread return; if (my_create_thread_local_key(&THR_PFS_SG, NULL)) // global_status return; if (my_create_thread_local_key(&THR_PFS_SS, NULL)) // session_status return; if (my_create_thread_local_key(&THR_PFS_SBT, NULL)) // status_by_thread return; if (my_create_thread_local_key(&THR_PFS_SBU, NULL)) // status_by_user return; if (my_create_thread_local_key(&THR_PFS_SBH, NULL)) // status_by_host return; if (my_create_thread_local_key(&THR_PFS_SBA, NULL)) // status_by_account return; THR_PFS_initialized= true; }
注意,這個(gè)初始化只做一次,以后創(chuàng)建線程時(shí)直接使用即可。上的第一個(gè)變量THR_PFS就是我們要使用的。
如何使用使用上的方式初始化,首先要set相應(yīng)的value:
/** @brief Execute the JOIN generated by parallel @param join [in] JOIN structure */ void execute_join(parallel_execution_thread_arg* parallel_arg) { /* * Get the parameter: * 1. JOIN * 2. pfs */ /// TODO: do we need to handle error? std::cout << "****************I am in worker thread*****************" << std::endl; /// Get join JOIN* join= parallel_arg->join; /// Get and Set pfs PSI_thread* pfs= parallel_arg->pfs; pfs_set_thread_v1(pfs); /// Delete delete parallel_arg; /// Set the new thread context my_thread_set_THR_THD(join->thd); /// Execute join->exec(); }
上面的函數(shù)是我在MySQL中新加入的代碼,其中使用pfs_set_thread_v1進(jìn)行set操作,即把當(dāng)前THR_PFS對(duì)應(yīng)的值設(shè)置為pfs。
get操作。由于我們加入了boost線程庫,所以當(dāng)啟動(dòng)一個(gè)線程時(shí)需要把JOIN結(jié)構(gòu)和pfs結(jié)構(gòu)傳入。思路是首先通過THR_PFS獲得pfs線程句柄,作為參數(shù)傳入到新的線程中。再新線程執(zhí)行函數(shù)中,把pfs線程句柄set進(jìn)去。具體在sql_select.cc中,我們加入了如下代碼:
/** Parallel execution. @details When a JOIN is parallel, its JOINs will execute parallelly. Put all JOINs into thread pool to execute. */ void JOIN::parallel_exec_joins() { for (uint i= 0; i < m_parallel_joins.size(); i ++) { /// Delete it in join->exec parallel_execution_thread_arg* parallel_arg= new parallel_execution_thread_arg(); /// Set join JOIN* join= m_parallel_joins[i]; parallel_arg->join= join; /// Set pfs PSI_thread* pfs= pfs_get_thread_v1(); parallel_arg->pfs= pfs; /// Thread pool generic_thread_pool.SubmitTask(execute_join, (parallel_execution_thread_arg* &&)parallel_arg); } }
可以看到,我們通過MySQL的pfs_get_thread_v1獲得pfs線程句柄傳入到新的線程。
上面的例子是針對(duì)pfs的線程。對(duì)于MySQL普通線程的例子在上面的execute_join也能找到。注意里面有一行code:
/// Set the new thread context my_thread_set_THR_THD(join->thd);
這里就是把當(dāng)前的thd設(shè)置到pthread中。所以我們看到,在MySQL中的很多地方都用到了這個(gè)東西,用法也已經(jīng)明確了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/17619.html
閱讀 2249·2021-11-24 11:15
閱讀 3101·2021-11-24 10:46
閱讀 1401·2021-11-24 09:39
閱讀 3935·2021-08-18 10:21
閱讀 1489·2019-08-30 15:53
閱讀 1402·2019-08-30 11:19
閱讀 3336·2019-08-29 18:42
閱讀 2333·2019-08-29 16:58