zoukankan      html  css  js  c++  java
  • Hbase源码分析:Hbase UI中Requests Per Second的具体含义

    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的细节。

  • 相关阅读:
    web前端的发展态势
    AngularJs 简单入门
    css代码优化篇
    git提交报错:Please make sure you have the correct access rights and the repository exists.
    Activiti工作流框架学习
    遍历map集合的4种方法
    js设置日期、月份增加减少
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    webservice_rest接口_学习笔记
    相互匹配两个list集合+动态匹配${}参数
  • 原文地址:https://www.cnblogs.com/timssd/p/5908295.html
Copyright © 2011-2022 走看看