Hbase源碼分析:Hbase UI中Requests Per Second的具體含義


  讓運維加監控,被問到Requests Per Second(見下圖)的具體含義是什么?我一時竟回答不上來,雖然大概知道它是指每秒Region Server的請求數,但是具體是怎么算的呢,不清楚。於是決定通過研究源碼深入了解下。下面便記錄了這個過程。

 

1,先在代碼庫中全局搜索Requests Per Second關鍵字,發現在幾個jamon結尾的文件找到了。於是google了一下,這個到底是什么東東,發現是一個模板引擎。

2,查看RegionServerListTmpl.jamon內容,需要傳入參數List<ServerName> servers和HMaster master。並且這個模板引擎是在MasterStatusServlet.java的doGet方法中被render的。拋開這些,看下面一段代碼,就知道Requests Per Second是怎么來的呢?

 1 <%java>
 2     int totalRegions = 0;
 3     int totalRequests = 0;
 4     for (ServerName serverName: serverNames) {
 5 
 6     ServerLoad sl = master.getServerManager().getLoad(serverName);
 7     double requestsPerSecond = 0.0;
 8     int numRegionsOnline = 0;
 9 
10     if (sl != null) {
11         requestsPerSecond = sl.getRequestsPerSecond();
12         numRegionsOnline = sl.getNumberOfRegions();
13         totalRegions += sl.getNumberOfRegions();
14         // Is this correct?  Adding a rate to a measure.
15         totalRequests += sl.getNumberOfRequests();
16     }
17     long startcode = serverName.getStartcode();
18 </%java>

其中requestsPerSecond變量的值就是我們要找的。可以看出來是來自ServerLoad中的getRequestsPerSecond函數。

3,繼續查看ServerLoad中的getRequestsPerSecond函數,經過getRequestsPerSecond-》getNumberofRequests發現是serverLoad.getNumberOfRequests中的numberOfRequests_變量的值。

4,  那ClusterStatusProtos.ServerLoad中的numberOfRequests_是怎么來的呢?在HRegionServer中buildServerLoad函數中,可以看到是從MetricsRegionServerWrapperImpl中的requestsPerSecond獲取的

1 serverLoad.setNumberOfRequests((int) regionServerWrapper.getRequestsPerSecond());

5,那MetricsRegionServerWrapperImpl中的requestsPerSecond是怎么算的呢?從下面代碼可以看出是根據上次的總的請求次數和請求時間,以及當前總的請求次數和請求時間,通過相減,然后除以時間差計算出來的。

if (lastRan == 0) {
        lastRan = currentTime - period;
      }


      //If we've time traveled keep the last requests per second.
      if ((currentTime - lastRan) > 0) {
        long currentRequestCount = getTotalRequestCount();
        requestsPerSecond = (currentRequestCount - lastRequestCount) /
            ((currentTime - lastRan) / 1000.0);
        lastRequestCount = currentRequestCount;
      }
      lastRan = currentTime;    

6,getTotalRequestCount()返回的是regionServer.rpcServices.requestCount的值。而requestCount表示的是regionserver中rpcserver記錄的rpc請求次數,每當一個rpc請求(比方說flush,getOnlineRegion等)過來的時候,這個值便會加1. 至此,便很清楚了,Requests Per Second具體的含義就是當前region server中每秒接收到的rpc請求數。

小結:

通過以上分析過程,搞清楚了Requests Per Second的具體含義,感覺結果不是很重要,重要的是過程,通過查看,調試源碼深入了解hbase的細節。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM