簡體   English   中英

FacesServlet.service()方法在提供請求時耗費太多時間(高自我時間)

[英]FacesServlet.service() method eating too much time while serving requests (high self-time)

我只是在使用基於Netbeans的Profiler的JSF項目中嘗試一些分析實驗。 但是我發現了一個非常令人驚訝的結果。 我發現JSF的FacesServlet.service()方法在提供請求時大部分時間都在使用。 我確實將數據庫中的內容提供給我的JSF頁面,但我仍然發現主要的時間延遲是由於service()方法的自我時間很長。

以下是分析結果的快照: - 查看FacesServlet service()方法的高自我時間

為什么會發生這種情況,在這種方法中發生的如此昂貴的事情導致如此高的自我時間?

我在Tomcat 7.0.42上以生產模式運行Myfaces 2.1.12。


編輯:

正如@mkienenb在下面的回答中正確指出的那樣,在上面的分析測試中我排除了org.apache.myfaces方法,所以我做了一個新的分析測試,我在新的結果快照下面發布。

在此輸入圖像描述

但是你仍然可以看到由於Myfaces / JSF方法的自身時間導致大量的時間開銷。

我不是分析專家,但我很確定“自我時間”包括所有未在其他地方明確分析的方法。 出於某種原因,您似乎沒有單獨分析“org.apache.myfaces”方法,而只是javax.faces方法。

因此,這將使所有JSF執行時間顯示在javax.faces.webapp.FacesServlet.services()下。

您需要調整包裹排除選項。 我不使用NetBeans,所以我不能具體告訴你這是怎么做的。

嗯,FacesServlet.service()的參數是什么? 那是servlet請求和servlet響應嗎? 似乎是來自您的瀏覽器的典型請求以及來自您的應用/服務器的響應。

很明顯,您的依賴項的代碼和/或使用是FacesServlet.service()完成所花費時間的原因。 哇,似乎你使用prettyfaces依賴是導致FacesServlet.service()完成所需的大部分時間。

2013年9月7日星期六凌晨2點24分,Anton Gavazuk寫道:

處理傳入請求,並通過執行請求處理生命周期來創建相應的響應。

如果此方法的請求和響應參數分別不是HttpServletRequest和HttpServletResponse的實例,則調用此方法的結果是未定義的。

此方法必須通過在響應參數上調用sendError方法(強制轉換為HttpServletResponse)來響應以下字符串開頭的請求,並將代碼HttpServletResponse.SC_NOT_FOUND作為參數傳遞。

所以這個方法實際上包含了所有底層處理:jsf動作,業務服務,與db的交互 - 因此它的時間總是最大的

在回應OP並展示Anton(來自myfaces列表)上面所述的內容時,

(1)在開始此請求之前,我的瀏覽器顯示“會話超時”頁面,因此我單擊“確定”,向服務器發出一個簡單請求以響應登錄頁面。 下面的屏幕截圖將向您顯示,這樣一個簡單的請求,響應時間如此之快,以至於找不到FacesServlet.service()。

圖1a

圖1b

(2)在我的瀏覽器中呈現登錄頁面后,我單擊了“登錄”按鈕,我的應用程序執行了多項操作(檢查數據庫是否有用戶ID,驗證存儲在數據庫中的密碼,然后導航到並呈現進行數據庫檢索的頁面,這可能需要幾秒鍾,具體取決於當前日期完成的用戶操作數量(它是用戶審計跟蹤數據/頁面),當然,在完成所有這些后,頁面將在瀏覽器中呈現。對於FacesServlet.service()幾次,直到找不到更多的事件。在下面的屏幕截圖中,您將看到FacesServlet.service()'time'是由完成其他/底層/調用的操作/進程所花費的時間引起的。

圖2a

圖2b

圖2c

圖2d

圖2e

圖2f

圖2g

(3)在Audit Trail頁面上,我點擊了一個選項,它將調用一個AJAX請求/響應,它將進行數據庫檢索,這可能需要比上面#2中的數據庫檢索更長的時間,然后AJAX響應將是在瀏覽器中呈現。 下面的屏幕截圖將再次顯示FacesServlet.service()'time'是由完成其他/底層/調用的操作/進程所花費的時間引起的。

圖3a

圖3b

(4)接下來/最后,我決定單擊菜單欄選項,該選項執行數據庫檢索以根據當前日期在數據庫中顯示數據,並導航到和/或在瀏覽器中呈現不同的頁面。 下面的屏幕截圖將再次顯示FacesServlet.service()'time'是由完成其他/底層/調用的操作/進程所花費的時間引起的。

圖4a

圖4b

圖4c

我在Tomcat 7.0.42上以生產模式運行Myfaces 2.1.12。

我也是......通過TomEE + 1.6.0'快照'(2013年9月 - 06版本/版本)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM