資源描述:
《MySQL源碼修改入門途牛網(wǎng)王強(qiáng)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、ZHDBA.COM?中華數(shù)據(jù)庫(kù)行業(yè)協(xié)會(huì)2015中華數(shù)據(jù)庫(kù)與運(yùn)維大會(huì)?2015.06.06MySQL源碼修改入門途牛網(wǎng)-王強(qiáng)緣由?近期開始學(xué)習(xí)和研究MySQL數(shù)據(jù)庫(kù),總體感覺(jué)開源的產(chǎn)品還是不如商業(yè)數(shù)據(jù)庫(kù)來(lái)的成熟,很多Oracle現(xiàn)成的東西,在MySQL下都沒(méi)有,好在有源碼可以看,自己也算寫過(guò)2年C程序的人,那就試著看看源碼吧。?首先還是要有合適的看源碼的工具,在此推薦sourceinsight。sourceinsightMySQL主要函數(shù)查看MySQL各個(gè)線程cpu使用情況?以前在Oracle下,我們通常會(huì)用top看哪個(gè)Oracle會(huì)話特別耗費(fèi)cpu,這個(gè)方法我也想在MySQL下用用
2、,知道MySQL是基于多線程的,查了一下如何查看線程耗費(fèi)cpu的情況,用的是下面的命令:?psH-eouser,pid,ppid,tid,time,%cpu
3、head-1&&psH-eouser,pid,ppid,tid,time,%cpu--sort=%cpu
4、grep20033
5、tail-n20?其中20033表示的是MySQLd的進(jìn)程pid查看MySQL各個(gè)線程cpu使用情況?輸出結(jié)果?圖中我們看到的TID應(yīng)該就是線程idMySQL系統(tǒng)的線程ID?然后我們?cè)贛ySQL用showengineinnodbstatusG查看線程的ID?我們這里看到線程ID是0x7fdb6a0f8
6、700,和ps看到的不一樣,ps看到的最多是5位的一個(gè)數(shù)字,如46530linux線程Google了很多次,終于知道了ps看到的其實(shí)是輕量級(jí)進(jìn)程id,下圖是我找到的關(guān)于linux線程的一篇文章的截圖,原作者名字沒(méi)有記錄,在此也備注一下吧。linux線程?Linux中,每個(gè)進(jìn)程有一個(gè)pid,類型pid_t,由getpid()取得。?Linux下的POSIX線程也有一個(gè)id,類型pthread_t,由pthread_self()取得,該id由線程維護(hù),其id空間是各個(gè)進(jìn)程獨(dú)立的(即不同進(jìn)程中的線程可能有相同的id)。?Linux中的POSIX線程庫(kù)實(shí)現(xiàn)的線程其實(shí)也是一個(gè)進(jìn)程(LWP),
7、只是該進(jìn)程與主進(jìn)程(啟動(dòng)線程的進(jìn)程)共享一些資源而已,比如代碼段,數(shù)據(jù)段等。?有時(shí)候我們可能需要知道線程的真實(shí)pid。比如進(jìn)程P1要向另外一個(gè)進(jìn)程P2中的某個(gè)線程發(fā)送信號(hào)時(shí),既不能使用P2的pid,更不能使用線程的pthreadid,而只能使用該線程的真實(shí)pid,稱為tid。?有一個(gè)函數(shù)gettid()可以得到tid,但glibc并沒(méi)有實(shí)現(xiàn)該函數(shù),只能通過(guò)Linux的系統(tǒng)調(diào)用syscall來(lái)獲取。使用syscall得到tid只需一行代碼,但為了加深各位看官的印象,簡(jiǎn)單提供下面場(chǎng)景。?首先,在線程函數(shù)中顯示線程ID?#include?#include8、ys/types.h>?void*thread_func(void*args)?{?intli_tid=syscall(SYS_gettid);//~gettid()?printf("%s",li_tid);?sleep(20);?}?intmain(){pthread_tid;pthread_create(&id,NULL,thread_func,NULL);}在程序執(zhí)行以后,我們同時(shí)用ps去看進(jìn)程包含的線程id,判斷程序輸出和ps進(jìn)程顯示的是否一致。?從上面測(cè)試的demo可以看到ps看到的就是用syscall(SYS_gettid)得到的線程ID,和用pthread_self(
9、)得到的值是不一樣的,那么下面我們要做的就是在mysql線程中獲取并保存syscall(SYS_gettid)。?首先修改THD類,在real_id的附近,我們添加一個(gè)tid的成員變量。添加成員變量修改線程建立函數(shù)?然后我們根據(jù)前面的MySQL源碼主要函數(shù)圖,找到實(shí)際建立線程的函數(shù)handle_one_connection,在這個(gè)函數(shù)中獲取syscall(SYS_getid)的值。添加輸出顯示?獲取到了TID,我們還需要在適當(dāng)?shù)牡胤斤@示這個(gè)ID,我們選擇在showengineinnodbstatus的地方,把新添加的tid輸出。實(shí)際輸出結(jié)果總結(jié)通過(guò)這個(gè)小小的改動(dòng)的例子,我有了以下幾
10、個(gè)方面的收獲:?首先加深了我對(duì)MySQL源碼結(jié)構(gòu)層次的了解。?帶著問(wèn)題去看源碼,也給了自己目標(biāo)和動(dòng)力。?嘗試從小的改動(dòng)開始,給自己樹立了信心,是的看源碼這個(gè)事情,能夠堅(jiān)持下去。開源數(shù)據(jù)庫(kù)之所以現(xiàn)在這么火熱,就是因?yàn)榘炎约和耆┞冻鰜?lái),提供給廣大技術(shù)人員一個(gè)路徑,去了解數(shù)據(jù)庫(kù)的細(xì)節(jié),同時(shí)能夠定制自己的軟件。PostgreSQL入門、PG與MySQL的對(duì)比途牛網(wǎng)-王強(qiáng)PostgreSQL介紹世界上用錢能買到的最好的數(shù)據(jù)庫(kù)世界上不花錢使用最廣泛的數(shù)據(jù)庫(kù)世界上不花錢能用到最好