我使用docker容器部署了微服务,并希望检查jvm信息。因此,我进入容器并找到pid。然后我运行jmap -heap pid命令,但得到以下错误日志:
如何解决?
答案 0 :(得分:0)
在Linux中,jmap -heap
在Serviceability Agent之上运行,而Serviceability Agent又依赖于ptrace
syscall。
默认情况下,ptrace
需要root特权(或更准确地说,是CAP_SYS_PTRACE
功能)。此外,docker默认安全配置文件通过seccomp或apparmor拒绝ptrace
系统调用。
因此,为了允许ptrace
和jmap -heap
放在容器中,可能需要添加以下docker选项:
--cap-add=SYS_PTRACE --security-opt=seccomp:unconfined --security-opt=apparmor:unconfined
注意:从安全角度来看,这不是最佳解决方案。查阅docker手册以查找如何在不关闭seccomp和apparmor的情况下启用特定的系统调用。
更好的选择是完全避免使用jmap -heap
。在没有Serviceability Agent支持的情况下,还有其他有效的方法来监视JVM,例如jcmd
,jstat
和JMX
。