我正在使用 async-profiler 和 perf 并决定测量DirectByteBuffer
磁盘 IO 的内核活动。这是代码(用 Scala 编写,但它的 Java 版本应该很明显):
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)
}
}
我多次运行此代码并同时执行perf
并async-profiler
注意到以下结果:
异步探查器
$~/profiler.sh -i 28169 -d 30 <pid> //.... stack traces ommited ns percent samples top 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]
性能
sudo perf record -F 31499 -g -p <pid> -- sleep 30
在我所做的所有跑步中,我注意到copy_user_enhanced_fast_string
百分比在perf
和async-profiler
61.02%
vs 中是不同的77.65%
问题:为什么和copy_user_enhanced_fast_string
采样?我试图提供相同的条件(频率和采样周期,并且我没有同时运行这两个分析器。31499 Hz ≈ 28169 纳秒)。perf
async-profiler
还是我对结果的解释是错误的?