如何将性能分析器附加到Docker进程

5

我在Docker容器中的job-server中遇到了内存泄漏问题。为了分析是什么导致了这个问题,我需要将jprofiler或yourkit连接到Docker容器进程。我不确定如何操作,请问有人能提供一些指导吗?

2个回答

3
你可以尝试并关注Andrew Liu的"配置JProfiler 9.2以分析在Docker容器中运行的应用程序":
这将涉及完成现有的Dockerfile:
RUN wget http://download-keycdn.ej-technologies.com/jprofiler/jprofiler_linux_9_2.tar.gz -P /tmp/ &&\
 tar -xzf /tmp/jprofiler_linux_9_2.tar.gz -C /usr/local &&\
 rm /tmp/jprofiler_linux_9_2.tar.gz

ENV JPAGENT_PATH="-agentpath:/usr/local/jprofiler9/bin/linux-x64/libjprofilerti.so=nowait"
EXPOSE 8849

这将使您能够在正在运行的容器中执行bash:

docker exec -it [container-name] bash

cd /usr/local/jrofiler9/
bin/jpenable

或者,如果你想在 Web 服务器启动时启用 JProfiler 代理,并等待来自主机的 JProfiler GUI 连接,而不是将 "ENV JPAGENT_PATH="-agentpath:/usr/local/jprofiler9/bin/linux-x64/libjprofilerti.so=nowait"" 放入 Dockerfile 中。请将以下行添加到 JAVA_OPTS 中。对于 tomcat,它将是 CATALINA_OPTS
注意: config.xml 将是放置 JProfiler 许可证密钥的位置。

JAVA_OPTS="$JAVA_OPTS -agentpath:/usr/local/jprofiler9/bin/linux-x64/libjprofilerti.so=port=8849,wait,config=/usr/local/jprofiler9/config.xml"

现在您已经完成了Docker容器的设置。该容器已准备好附加到您的JProfiler GUI上。以下步骤需要在主机上完成:
  1. https://www.ej-technologies.com/download/jprofiler/files下载并安装JProfiler 9.2。
  2. 打开JProfiler,通过按下Ctrl+N或单击“Session”菜单中的“New Session”来打开一个新会话。
  3. 在“Session Type”部分选择“Attach to profiled JVM (local or remote)”。在“Profiled JVM Settings”部分输入IP地址和8849作为分析端口。将其他设置保留为默认设置,然后单击“OK”。

我按照你在答案中提到的相同步骤进行了操作,但是JProfiler无法连接到远程JVM。我可以ping通远程机器。 - eatSleepCode
@eatSleepCode 你是按照哪个解决方案进行的? - VonC
先解决问题,然后尝试从JProfiler连接。 - eatSleepCode
@eatSleepCode 第二种解决方案(从主机启动JProfiler)是否更好?您使用的主机操作系统是什么?以及您的Docker版本(和使用的镜像)是什么? - VonC

1
您可以像这样将jProfiler附加到Docker容器中的应用程序:
EXPOSE 8849

暴露分析端口很重要(默认为8849)。
RUN wget http://download-keycdn.ej-technologies.com/jprofiler/jprofiler_linux_9_2_1.tar.gz --no-verbose -P /tmp/ && \
  tar -xzf /tmp/jprofiler_linux_9_2_1.tar.gz -C /usr/local && \
  rm /tmp/jprofiler_linux_9_2_1.tar.gz

这会在构建容器时下载并提取jProfiler到您的Docker容器中。
ENTRYPOINT exec java -jar /app.jar & \

 echo $! >>/tmp/process.pid && \

 sleep 60s && \

 /usr/local/jprofiler9/bin/jpenable --pid=$(cat /tmp/process.pid) --gui --port=8849 && \

 while true; do sleep 2147483647; done

这是我处理一个docker容器内无法运行两个应用程序的方法。首先,我们执行jar并将processId保存到文件中。然后等待60秒后启动jProfiler(jpenable),并将其附加到我们的进程(通过processId)。while循环必须保持容器运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接