讓運維加監控,被問到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;