我在玩异步分析器和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,并注意到以下结果:
sudo perf record -F 31499 -g -p <pid> -- sleep 30

在所有的跑动中,我注意到copy_user_enhanced_fast_string百分比在perf和async-profiler 61.02% vs 77.65%中是不同的。
问题:为什么perf和async-profiler采样的copy_user_enhanced_fast_string百分比是不同的?我试着提供相同的条件(频率和采样周期),但我没有同时运行这两个分析器。31499赫兹≈28169纳米)。
还是我对结果的解读是错误的?
发布于 2018-09-21 02:15:20
所选的分析间隔(28μs)太短。
检查dmesg -可能有一些内核警告,如
perf interrupt took too long (18047 > 18000), lowering kernel.perf_event_max_sample_rate to 25000async-profiler在处理PMU事件的机制上不同于perf。perf只是在环形缓冲区中收集样本,而异步分析器则向进程发送一个信号,以调用特定于应用程序的回调。通常对用户来说没有明显的差异,但是当剖析频率太高时,信号可能会带来额外的噪声并影响进程调度。
我建议增加剖面间隔到至少100μs (10000赫兹)。这将使测量更加可靠。
https://stackoverflow.com/questions/52430569
复制相似问题