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方法栈就够了,您可以忽略此告警。
解决方案
如果想消除这个错误信息,可以执行以下步骤。
- 在宿主机上执行以下命令。
echo 1028 > /proc/sys/kernel/perf_event_mlock_kb
默认阈值是516,可以逐渐增加,直到不出现告警。该值尽量满足8*N + 4,N是自然数。例如516 = 512 + 4, 1028 = 1024 + 4。
- 重启Docker,即可消除错误。