openGauss 3.1.0 版本gs_stack功能解密
不管是測(cè)試還是研發(fā),工作中總有遇到各種各樣的問題。比如,你有沒有遇到過在數(shù)據(jù)庫中執(zhí)行某個(gè)SQL,卻一直不返回結(jié)果,這時(shí)候的你是不是非常想看一下代碼執(zhí)行到了哪個(gè)函數(shù)?或者是數(shù)據(jù)庫不響應(yīng)連接,需要查看數(shù)據(jù)庫當(dāng)前線程的執(zhí)行情況呢?而在實(shí)際生產(chǎn)中,獲取生產(chǎn)系統(tǒng)進(jìn)程堆棧比較麻煩,需要在服務(wù)端后臺(tái)執(zhí)行g(shù)stack命令。本期為大家介紹的openGauss 3.1.0版本中內(nèi)置gs_stack工具,則可以通過函數(shù)調(diào)用的方式輸出指定線程的堆棧,用于解決現(xiàn)網(wǎng)環(huán)境缺少gs_stack工具無法獲取調(diào)用棧的問題。
內(nèi)置gs_stack工具介紹
在openGauss的很多客戶場(chǎng)景中,會(huì)出現(xiàn)gdb、gstack等工具無法使用或當(dāng)系統(tǒng)出現(xiàn)hang、慢等問題時(shí),無法通過調(diào)用棧進(jìn)行進(jìn)一步的定位;還有一種情況是登錄客戶數(shù)據(jù)庫的流程非常繁雜,需要經(jīng)過層層審批,這時(shí)通過gsql等工具連接數(shù)據(jù)庫就相對(duì)容易一些。針對(duì)以上痛點(diǎn),通過復(fù)用openGauss未使用操作系統(tǒng)信號(hào),并在信號(hào)處理函數(shù)中獲取調(diào)用棧的方式開發(fā)了調(diào)用棧工具,以獲得服務(wù)端openGauss的調(diào)用棧。
獲取調(diào)用棧主要包含兩種方式,一種是通過執(zhí)行SQL語句獲取,另一種是通過gs_ctl工具執(zhí)行命令獲取。
1在客戶端工具執(zhí)行g(shù)s_stack([tid])函數(shù)
使用具有monadmin或者sysadmin用戶權(quán)限的用戶,通過gsql或者其他工具連接數(shù)據(jù)庫;
執(zhí)行命令:
返回當(dāng)前openGauss所有線程的調(diào)用棧:
只需要查看某一個(gè)線程的調(diào)用棧時(shí),執(zhí)行命令:
說明
xxx為某個(gè)線程的thread_id,能夠返回thread_id為xxx的線程的調(diào)用棧:
2?在服務(wù)器端使用gs_ctl stack –D data_dir命令
當(dāng)線程池滿,無法通過gsql連接數(shù)據(jù)庫的時(shí)候,可以使用gs_ctl工具執(zhí)行命令獲取線程調(diào)用棧:
使用集群用戶登錄服務(wù)器,執(zhí)行命令gs_ctl stack –D data_dir,data_dir是指定gaussdb的數(shù)據(jù)目錄的絕對(duì)路徑:
可以取gaussdb所有線程的調(diào)用棧。
只需要查看某一個(gè)線程的調(diào)用棧時(shí),執(zhí)行命令:
說明
data_dir是指定gaussdb的數(shù)據(jù)目錄的絕對(duì)路徑,xxx指的是線程的lwpid(taskid),可以通過top –Hp的方式獲取線程的lwpid, 也可以通過cat /proc/yyyy/task獲取線程的lwpid 。yyyy指的是進(jìn)程id,可以通過ps –ux | grep gaussdb獲取。
總結(jié)
通過以上我們介紹的openGauss的gs_stack功能,我們可以很方便地定位某個(gè)openGauss線程正在做的事情,并可以根據(jù)這些函數(shù)調(diào)用情況判斷當(dāng)前openGauss任務(wù)是否出現(xiàn)了問題,以及發(fā)現(xiàn)性能瓶頸。后續(xù),我們將會(huì)進(jìn)一步在這個(gè)功能上進(jìn)行演進(jìn),不斷增強(qiáng)openGauss的核心競(jìng)爭(zhēng)力。