亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3145 | 回復(fù): 6
打印 上一主題 下一主題

利用DTrace實(shí)時(shí)檢測(cè)MySQL(zt) 推薦一個(gè)不錯(cuò)的文章 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-04-27 09:25 |只看該作者 |倒序?yàn)g覽
 與我們大多數(shù)人想象的不同,DTrace用于MySQL時(shí)不需對(duì)MySQL做任何更改。DTrace最強(qiáng)大的“提供器”(provider,是一組可觀測(cè)的探測(cè)器)是FBT(Functional Boundary Tracing,函數(shù)邊界跟蹤)提供器。我們可以把它與PID提供器結(jié)合起來(lái),用于深入觀測(cè)userland過(guò)程。只需要對(duì)MySQL代碼有一些基本了解,我們就可以開(kāi)發(fā)挖掘這些功能了。
  那么,我們?nèi)绾尾拍芰私釳ySQL代碼呢?有兩種方法。第一,你可以買(mǎi)一本好點(diǎn)兒的相關(guān)書(shū)籍,如MySQL Internals。如果你很重視MySQL相關(guān)知識(shí),一定要買(mǎi)這本書(shū)。第二種方法是通過(guò)DTrace本身來(lái)了解MySQL代碼。DTrace最好的一個(gè)功能是一個(gè)叫做“flowindent”的編譯指示選項(xiàng)。這個(gè)函數(shù)會(huì)相應(yīng)地顯示entry和return并生成一個(gè)邏輯樹(shù),以便用戶能了解其內(nèi)部的函數(shù)調(diào)用關(guān)系。實(shí)際上,我們可以通過(guò)這種方式了解到MySQL的內(nèi)部情況。
  下面是代碼(mysqlflow.d):
#!/usr/sbin/dtrace -s
  
#pragma D option flowindent
  
pid$target:mysqld::entry
{
}
pid$target:mysqld::return
{
}
  將這段代碼放到一個(gè)文本文件中,然后將該文件改為可執(zhí)行文件。這里,我們使用PID提供器來(lái)觀測(cè)“mysqld”過(guò)程。因?yàn)槲覀冎付ǖ牟皇且粋(gè)函數(shù)(請(qǐng)記住,探測(cè)器格式是PROBIDER:MODULE:FUNCTION:NAME),所以它是作為wildcard被翻譯的。因此,我們會(huì)看見(jiàn)所有的函數(shù),所有函數(shù)的entry和return名都為初始探測(cè)器名。
  在運(yùn)行該文件時(shí),我們需要使用DTrace –p來(lái)指定mysql daemon的PID(過(guò)程id)。在Solaris中,通過(guò)如下“pgrep”命令我們可以很方便地獲得PID。
# ./mysqlflow.d -p `pgrep -x mysqld`
0  -> sync_array_get_nth_cell      
0  <- sync_array_get_nth_cell      
0 <- sync_array_print_long_waits      
0 -> os_thread_sleep            
2 <- os_thread_sleep            
2 -> sync_arr_wake_threads_if_sema_free  
2  -> sync_array_enter         
2   -> os_mutex_enter         
2    -> os_fast_mutex_lock      
2    <- os_fast_mutex_lock      
2   <- os_mutex_enter         
2  <- sync_array_enter         
2  -> sync_array_exit           
2   -> os_mutex_exit           
2    -> os_fast_mutex_unlock      
2    <- os_fast_mutex_unlock      
2   <- os_mutex_exit           
2  <- sync_array_exit           
2 <- sync_arr_wake_threads_if_sema_free
...
  使用^C可以結(jié)束跟蹤。單單是這些就可能夠你折騰幾個(gè)小時(shí)了。
  首先你會(huì)發(fā)現(xiàn)的是InnoDB非常“健談”,即使數(shù)據(jù)庫(kù)非常清閑時(shí)也是如此。這個(gè)看似恒定“sync_array_get_nth_cell()”函數(shù)流實(shí)際上是InnoDB檢查點(diǎn)的結(jié)果。
  上述例子向我們展示了DTrace實(shí)時(shí)監(jiān)視MySQL函數(shù)進(jìn)出情況的能力。但是,要想發(fā)揮它的作用,我們還需要了解都有哪些東西進(jìn)入了這些函數(shù)。我們需要看看某些特定的函數(shù)和它們的引數(shù)(argument)。我們誰(shuí)都喜歡監(jiān)視別人,對(duì)吧?如果我告訴你我不需要登錄數(shù)據(jù)庫(kù)也不需要查看任何日志文件就可以看到MySQL處理的每一個(gè)查詢,你會(huì)怎么想呢?其實(shí)很簡(jiǎn)單,通過(guò)跟蹤“dispatch_command()”的引數(shù),你就可以做到了。
  如下是需要用到的腳本(query_watch.d):
#!/usr/sbin/dtrace -s
  
#pragma D option quiet
  
pid$target:mysqld:*dispatch_command*:entry
{
printf("Query: %s\n", copyinstr(arg2));
}
  同樣,將該腳本保存到一個(gè)文本文件中并將它改為可執(zhí)行文件,利用“-p PID”執(zhí)行它,使用^C停止跟蹤。
# query_watch.d -p `pgrep -x mysqld`
Query: show tables
Query: select * from Country LIMIT 10
Query: explain user
...
  既然我們可以實(shí)時(shí)查看所有進(jìn)入MySQL dispatcher的查詢,因此我們可以很輕易地看出查詢的情況和趨勢(shì)。不知道你注意到?jīng)]有,每秒鐘你的CRM都會(huì)執(zhí)行幾百個(gè)相同的查詢。
  你可能意識(shí)到了我想暗示你的安全性問(wèn)題,只有root用戶(或Solaris中明確指定的特權(quán)用戶)才能運(yùn)行DTrace。如果你的本能反應(yīng)是害怕DTrace系統(tǒng)中的MySQL,我們可以把DTrace這樣用于Oracle、PostgreSQL、Mozilla或其它任何應(yīng)用。DTrace可以看見(jiàn)所有的一切。如果你還不了解DTrace的威力,我希望你了解一下。
  下面,我們?cè)偕钊氲乜纯催@個(gè)例子。重復(fù)的查詢可能會(huì)導(dǎo)致嚴(yán)重的問(wèn)題,通常會(huì)引發(fā)客戶端存儲(chǔ)緩慢或應(yīng)用邏輯性差等問(wèn)題。我們可以用DTrace計(jì)算一下所有重復(fù)的查詢,并報(bào)告每個(gè)查詢?cè)谔囟〞r(shí)間段被執(zhí)行過(guò)多少次。
  使用如下腳本(querycounts.d):
#!/usr/sbin/dtrace -s
  
#pragma D option quiet
  
dtrace:::BEGIN
{
    printf("Tracing... Hit Ctrl-C to end.\n");
}
  
pid$target::*dispatch_command*:entry
{
    @query[copyinstr(arg2)] = count();
}
  在運(yùn)行該腳本時(shí),它會(huì)開(kāi)始收集數(shù)據(jù),直到完成才會(huì)輸出報(bào)告。合并計(jì)算函數(shù)count()將通過(guò)“dispatch_command”函數(shù)的arg2的結(jié)果賦給@query。
# querycounts.d -p `pgrep -x mysqld`
Tracing... Hit Ctrl-C to end.
  
^C
select * from CountryLanguage LIMIT 5  1
show tables     4
select * from City    10
  顯然,這個(gè)例子的輸出結(jié)果并不是真正的生產(chǎn)系統(tǒng)的結(jié)果。如果在生產(chǎn)中使用,你得到的結(jié)果會(huì)遠(yuǎn)遠(yuǎn)大于該輸出結(jié)果。
  這里所討論的例子僅僅是冰山一角。如果你結(jié)合一本好的MySQL internal參考書(shū),很快你會(huì)發(fā)現(xiàn)你的理解方式是以前想都沒(méi)想到過(guò)的。你能夠?qū)Trace利用到生產(chǎn)代碼中的各個(gè)部分。
  我希望這篇文章能幫助你穩(wěn)步前進(jìn),一步一個(gè)腳印。你可以用它來(lái)學(xué)習(xí),吸引你的同事,節(jié)約時(shí)間。最后,祝您跟蹤愉快!
  特別感謝Derek Crudginton。
  關(guān)于作者:Ben Rockwood是云計(jì)算基礎(chǔ)架構(gòu)Joyent公司的系統(tǒng)經(jīng)理。他是Solaris方面的專(zhuān)家,也是Sun推廣者。



http://www.searchdatacenter.com. ... enterweekly20090424

評(píng)分

參與人數(shù) 1可用積分 +3 收起 理由
yuhuohu + 3 我很贊同

查看全部評(píng)分

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-04-27 09:30 |只看該作者
感謝風(fēng)版回歸solaris

論壇徽章:
2
丑牛
日期:2014-06-11 13:55:04ChinaUnix元老
日期:2015-02-06 15:16:14
3 [報(bào)告]
發(fā)表于 2009-04-27 09:40 |只看該作者
好東西

論壇徽章:
221
15-16賽季CBA聯(lián)賽之吉林
日期:2017-12-11 12:51:59黑曼巴
日期:2019-04-12 13:40:0515-16賽季CBA聯(lián)賽之廣東
日期:2019-04-23 10:41:1215-16賽季CBA聯(lián)賽之遼寧
日期:2019-05-06 13:03:2815-16賽季CBA聯(lián)賽之山西
日期:2019-05-09 10:56:5815-16賽季CBA聯(lián)賽之青島
日期:2019-05-17 13:57:0515-16賽季CBA聯(lián)賽之新疆
日期:2019-06-10 13:39:0515-16賽季CBA聯(lián)賽之天津
日期:2019-07-08 15:04:4519周年集字徽章-19
日期:2019-08-27 13:31:2619周年集字徽章-19
日期:2019-08-27 13:31:2619周年集字徽章-周
日期:2019-09-06 18:46:4715-16賽季CBA聯(lián)賽之天津
日期:2019-02-27 11:24:07
4 [報(bào)告]
發(fā)表于 2009-04-27 09:54 |只看該作者
DTrace知道是個(gè)好東西,可現(xiàn)實(shí)環(huán)境中,一直沒(méi)有用過(guò)

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-04-27 11:01 |只看該作者
又換女人了

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-04-29 11:56 |只看該作者
好像很難

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2009-04-29 16:30 |只看該作者

回復(fù) #1 風(fēng)之幻想 的帖子

很難
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP