首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用异步分析器和perf测量DirectByteBuffer

用异步分析器和perf测量DirectByteBuffer
EN

Stack Overflow用户
提问于 2018-09-20 17:46:07
回答 1查看 345关注 0票数 2

我在玩异步分析器和perf,并决定测量DirectByteBuffer磁盘IO的内核活动。下面是代码(用Scala编写的,但它的Java版本应该很明显):

代码语言:javascript
复制
val path = Paths.get("/tmp/test")

val buffer = ByteBuffer.allocateDirect(4096 * 4096)

def main(args: Array[String]): Unit = {
  var fullReadsCount = 0
  while (true) {
    var bytesRead = 0
    var ch: SeekableByteChannel = null
    try {
      ch = Files.newByteChannel(path)
      while (bytesRead >= 0) {
        bytesRead = ch.read(buffer)
        buffer.clear()
      }
    } finally {
      if (ch != null)
        ch.close()
    }
    fullReadsCount += 1
    if(fullReadsCount % 100 == 0) println(fullReadsCount)
  }
}

我多次运行这段代码,并同时执行perfasync-profiler,并注意到以下结果:

  1. 异步分析器 $~/profiler.sh -i 28169 -d 30 //.264788732 61.02% 9317 copy_user_enhanced_fast_string_k 41510919 9.57% 1467 generic_file_read_iter_k 9333863 2.15% 331 find_get_entry_k 4181131 0.96% 148 __radix_tree_lookup_k 4057194 0.94% 143 copy_page_to_iter_k 1860485 0.43% 63 __d_lookup_rcu_k 1610407 0.37% 50 _raw_spin_unlock_irqrestore_k
  2. perf sudo perf record -F 31499 -g -p <pid> -- sleep 30

在所有的跑动中,我注意到copy_user_enhanced_fast_string百分比在perfasync-profiler 61.02% vs 77.65%中是不同的。

问题:为什么perfasync-profiler采样的copy_user_enhanced_fast_string百分比是不同的?我试着提供相同的条件(频率和采样周期),但我没有同时运行这两个分析器。31499赫兹≈28169纳米)。

还是我对结果的解读是错误的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-21 02:15:20

所选的分析间隔(28μs)太短。

检查dmesg -可能有一些内核警告,如

代码语言:javascript
复制
perf interrupt took too long (18047 > 18000), lowering kernel.perf_event_max_sample_rate to 25000

async-profiler在处理PMU事件的机制上不同于perfperf只是在环形缓冲区中收集样本,而异步分析器则向进程发送一个信号,以调用特定于应用程序的回调。通常对用户来说没有明显的差异,但是当剖析频率太高时,信号可能会带来额外的噪声并影响进程调度。

我建议增加剖面间隔到至少100μs (10000赫兹)。这将使测量更加可靠。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52430569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档