• 中文
    • English
  • 注册
  • 查看作者
  • 深入理解Metrics(五):Timers

    1.Timers的使用

    account模块在测量鉴权接口的过程中,使用Histograms测量响应时间的分布;使用Meters测量每秒处理的请求数。 

    如果想同时测量又不想写重复代码,有好的方式吗?其实Metrics已经为你准备好了工具:Timers。 借助于Timers工具, account模块对Redis的性能进行了测试 ,下面是测试代码:

    深入理解Metrics(五):Timers

    代码说明:

    1. 主动创建Timer,之后注册到MetricRegistry中。

    2. 在Redis中预先设置好键值对。 

    3. 模拟100的并发,测试总次数 = 并发数 * 1000。 

    4. 在每个线程中单独持有Jedis实例。 

    5. 在测试的过程中统计校验失败数。

     

    最后输出:

    深入理解Metrics(五):Timers

    从上面的输出结果可以看出,Timers不仅统计了请求时间分布,还统计了1分钟、5分钟、15分钟内每秒钟请求的次数。

    2. Timers的层次结构

    深入理解Metrics(五):Timers

    Timer类实现接口的方式使用的是 适配器模式 。Timer通过持有Histogram的实例实现了Sampling统计响应时间分布的接口;通过持有Meter的实例实现了Metered事件发生频率的接口。 让我们看看核心代码:

    深入理解Metrics(五):Timers

    3. 时钟

    在Timer中其实还引用了Clock类, Clock类主要用来追踪消耗的时间

    Clock类定义两个方法:获取当前时间的getTime()和用于时间标记的getTick(),实现getTime()使用的是System.currentTimeMillis();实现getTick()使用的是System.nanoTime(),也许你不禁要问: 使用currentTimeMillis和nanoTime的时机是什么? 带着这个疑问我们来参考JDK帮助文档的定义:

    currentTimeMillis: 当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差,常常结合SimpleDateFormat输出自定义格式的时间。  nanoTime: 返回最准确的可用系统计时器的当前值,以纳秒为单位,此方法只能用于测量消耗的时间,与系统或钟表时间的其他任何时间概念无关。 

    在nanoTime方法声明的注释中,介绍了 nanoTime的使用方式

    Metrics测量消耗的时间使用的就是 结束纳秒与开始纳秒的差值

    4. System.nanoTime() 实现

    我对nanoTime的实现非常的好奇,想研究下底层究竟是怎样实现的,于是就有了下面的历程。

    4.1 下载jvm源码

    下载了jvm hotspot OpenJDK的源码,关于nanoTime的实现,jvm提供了针对不同操作系统的实现,例如:linux、solaris和windows。

    4.2 native方法映射地址

    深入理解Metrics(五):Timers

    4.3 定位实际调用的方法

    深入理解Metrics(五):Timers

    通过设置布尔变量 isNano=true 定位到os::javaTimeNanos方法。

    4.4 javaTimeNanos方法初探

    深入理解Metrics(五):Timers

    javaTimeNanos通过调用supports_monotonic_clock来判定 系统是否支持单调时钟

    那么什么是单调时钟呢?

    在Linux操作系统中用户通过date命令设置系统时间,会导致系统时钟出现跳变,对协调运行时间的程序之间来说会有计时不准的问题,为此Linux提出了单调时钟的概念。

    4.5 单调时钟的初始化

    深入理解Metrics(五):Timers

    4.6 clock_gettime函数说明

    深入理解Metrics(五):Timers

    这个接口基于较新的POSIX标准,过低的Linux版本很可能会不支持。

    4.7 实验

    为了加深印象,在我本机写了测试代码。

    深入理解Metrics(五):Timers

    看得出,我的本还是支持单调时钟的。

    5. 结束语

    如果Linux系统不支持单调时钟,就需要研究gettimeofday方法了。

    深入理解Metrics系列文章:

    深入理解Metrics(五):Timers

  • 0
  • 0
  • 0
  • 73
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: