更新时间:2024-09-20 GMT+08:00
分享

perf_event mmap failed...报错问题

问题现象

此错误一般出现在JVM的标准输出中。Profiler功能进行CPU热点采样时,会同时采集Native(Linux Kernel + JVM + C/C++)以及Java栈,采集Native栈需要对Java中每个线程的perf_event的fd进行MMap,Linux内核中限制了进程perf_event相关的MMap的总内存大小(默认516 K Bytes)。当Java中线程数较多时,会触发限制并在Java标准输出中打印警告信息perf_event mmap failed...。出现这个告警信息,对Java的运行没有副作用,对业务也没有影响,实际的影响是火焰图中看不到Native的栈。一般来说定位CPU热点问题时,只看Java方法栈就够了,您可以忽略此告警。

解决方案

如果想消除这个错误信息,可以执行以下步骤。

  1. 在宿主机上执行以下命令。

    echo 1028 > /proc/sys/kernel/perf_event_mlock_kb

    默认阈值是516,可以逐渐增加,直到不出现告警。该值尽量满足8*N + 4,N是自然数。例如516 = 512 + 4, 1028 = 1024 + 4。

  2. 重启Docker,即可消除错误。

相关文档