我們把網(wǎng)站流量訪問(wèn)統(tǒng)計(jì)系統(tǒng)開(kāi)發(fā)過(guò)程分成了兩個(gè)階段:第一個(gè)階段聚焦于單用戶,第二個(gè)階段聚焦于多用戶。按照初步的設(shè)想:在單用戶下,我們會(huì)關(guān)注耗時(shí)的SQL語(yǔ)句、單個(gè)事務(wù)中的數(shù)據(jù)庫(kù)訪問(wèn)次數(shù)、明顯低效的算法、緩存的使用、計(jì)算負(fù)載過(guò)重的循環(huán)塊、重復(fù)的業(yè)務(wù)計(jì)算等;在多用戶下,我們會(huì)關(guān)注CPU和內(nèi)存的使用狀況、GC的頻率、線程競(jìng)爭(zhēng)、網(wǎng)絡(luò)流量、數(shù)據(jù)庫(kù)負(fù)載等。
很明顯,經(jīng)過(guò)上面的劃分,我們開(kāi)始有了一些比較具體的設(shè)想。這些設(shè)想聽(tīng)上去的第一感覺(jué)是,盡管頭緒繁多,但還算有一定的條理??墒?,網(wǎng)站流量訪問(wèn)統(tǒng)計(jì)系統(tǒng)開(kāi)發(fā)按照這些設(shè)想實(shí)際做起來(lái)卻遠(yuǎn)遠(yuǎn)沒(méi)有聽(tīng)上去那么容易,因?yàn)殛P(guān)鍵的問(wèn)題還沒(méi)有解決。例如,如何關(guān)注耗時(shí)的SQL語(yǔ)句?如何找到針對(duì)這些SQL的解決方案?這些經(jīng)典的“如何”句式是實(shí)踐者的最?lèi)?ài),也是實(shí)踐者最常感到困惑的地方。
致遠(yuǎn)服軟認(rèn)為:http://www.soft8.com.cn/選擇Yourkit作為Java Profiler工具。事實(shí)上,和大多數(shù)的Java Profiler工具一樣,Yourkit幾乎可以提供所有關(guān)于性能的數(shù)據(jù),其中包括執(zhí)行SQL語(yǔ)句所占用的CPU時(shí)間。不過(guò),和大多數(shù)的Java Profiler工具一樣,Yourkit提供的性能數(shù)據(jù)并不準(zhǔn)確,這種不準(zhǔn)確是由Java Profiler工具的實(shí)現(xiàn)機(jī)制決定的。這些工具大多通過(guò)特定的API(例如,從Java 5開(kāi)始提供的JVMTI——JVM Tool Interface)與JVM進(jìn)行通信。
JVMTI(JVM Tool Interface)是Java虛擬機(jī)所提供的native編程接口,是JVMPI(Java Virtual Machine Profiler Interface)和JVMDI(Java Virtual Machine Debug Interface)的更新版本。從這個(gè)API的發(fā)展歷史軌跡中我們就可以知道,JVMTI提供了可用于debug和profiler的接口;同時(shí),在Java 5/6中,虛擬機(jī)接口也增加了監(jiān)聽(tīng)(Monito-ring)、線程分析(Thread analysis)以及覆蓋率分析(Coverage Analysis)等功能。正是由于JVMTI的強(qiáng)大功能,它是實(shí)現(xiàn)Java調(diào)試器以及其他Java運(yùn)行態(tài)測(cè)試與分析工具的基礎(chǔ)。
JVMTI使用了所謂的“字節(jié)碼檢測(cè)”(bytecode instrumentation)技術(shù),這意味著Java Profiler工具在收集分析數(shù)據(jù)時(shí)會(huì)修改應(yīng)用程序的字節(jié)碼,并在特定的位置插入一些字節(jié)碼指令。這顯然會(huì)影響被分析應(yīng)用程序的執(zhí)行效率。有時(shí)候,這種影響會(huì)干擾分析人員的判斷。當(dāng)然,如果你追求比較接近真實(shí)的性能數(shù)據(jù),就可以關(guān)閉recording object al-location和CPU tracing而使用CPU sampling功能,但是影響仍然存在。
Yourkit作為數(shù)據(jù)庫(kù)服務(wù)器的客戶端,自動(dòng)化軟件測(cè)試其實(shí)無(wú)法真正地給出SQL語(yǔ)句的執(zhí)行時(shí)間,這里面也許有網(wǎng)絡(luò)的因素。在大多數(shù)的情況下,我們不關(guān)注客戶端或者服務(wù)器端對(duì)SQL語(yǔ)句執(zhí)行時(shí)間統(tǒng)計(jì)的差異,網(wǎng)站流量訪問(wèn)統(tǒng)計(jì)系統(tǒng)開(kāi)發(fā)盡管不在一個(gè)數(shù)量級(jí)上,但絕對(duì)差值并不大。但是,有些時(shí)候我們?nèi)匀恍枰獙?duì)SQL語(yǔ)句執(zhí)行效率的細(xì)微差異進(jìn)行關(guān)注。例如,SQL語(yǔ)句執(zhí)行的次數(shù)非常多。