2010-04-13 26 views
2

我正在Apache Tomcat 6上運行的Web應用程序框架進行性能研究。我試圖測量處理HTTP請求的時間開銷。如何攔截套接字級別的Tomcat請求?

我想要做的是:

/

// just before first request byte is read 
long t1 = System.nanoTime(); 

// request is processed... 

// just after final byte is written to response 
long t2 = System.nanoTime(); 

/

然後我會計算的總時間(T2 - T1)。

有沒有辦法做到這一點?謝謝你的幫助!

回答

1

跟蹤最好的方法可能是用Valve

但如果這是不是已經在說的MBean Tomcat的出口跟蹤我會感到很驚訝。特別地,該MBean Catalina:name=http-<my port num>,type=GlobalRequestProcessor列出以下屬性:

bytesSent = 51829989
與BytesReceived = 0
processingTime = 11464
ERRORCOUNT = 8
MAXTIME = 1250
requestCount = 923
modelerType =組織.apache.coyote.RequestGroupInfo

查看關於的文檔以瞭解如何使用JMX訪問這些MBean。

+0

閥門與過濾器有類似的問題。它只在HTTP請求被解析後被調用。 我會考慮的JMX選項。謝謝! – 2010-04-14 08:42:14

+0

我不認爲這是真的。查看Javadocs,一些Valves做預處理工作,然後調用管道中的下一個閥門,然後執行後處理工作(例如RequestDumperValve和ReplicationValve)。當您調用下一個閥門時,控制器會在該閥門(及其調用的所有閥門)返回後返回給您。你可以用過濾器做同樣的事情。 – 2010-04-14 11:36:02

1

一種替代方案,根本不需要任何編碼,就是使用類似Wireshark這樣的工具來查看網絡流量。

+0

這很可能,但很難將請求與處理請求的服務器線程關聯起來。我打算測試同時請求。 – 2010-04-14 08:41:22

1

我想你可以通過添加Filter實現這一目標之前,你的呼叫的doFilter在過濾器鏈的其餘部分後,把你的時間碼。

+0

感謝您的幫助,但僅在HTTP請求處理後調用Filter。 – 2010-04-14 08:40:15

0

的AspectJ你的解決方案。使用它,你可以做任何事情,使用應用程序CL加載的類(但不通過引導CL)。

+0

從來沒有這樣做,聽起來很有趣... – xgMz 2011-05-10 20:42:47