如何将分析器附加到docker进程
我正在面临Docker容器中存在的作业服务器中的内存泄漏问题。 要分析是什么导致了这个问题,我需要将jprofiler或yourkit附加到docker容器进程。 我不知道该怎么做。 有人可以把它放在一些光?
您可以尝试关注“ configurationJProfiler 9.2来分析在Docker容器中运行的应用程序 ”,来自Andrew Liu :
这将涉及完成现有的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中的ENV JPAGENT_PATH="-agentpath:/usr/local/jprofiler9/bin/linux-x64/libjprofilerti.so=nowait"
”。JAVA_OPTS
下行添加到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。 以下步骤在主机上完成。
- 从https://www.ej-technologies.com/download/jprofiler/files下载JProfiler 9.2并安装。
- 打开JProfiler并按Ctrl + N打开一个新的会话或在会话菜单中点击“新build会话”。
- 在“会话types”部分中select“附加到configuration文件JVM(本地或远程)”。 在“configuration文件JVM设置”部分inputIP地址和8849作为configuration文件端口。 将其他设置保留为默认值。 然后单击确定。
您可以将您的jProfiler附加到泊坞窗容器中的应用程序,如下所示:
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
当容器被构build时,这将下载并提取Docker容器内的jProfiler。
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循环是保持容器运行的必要条件。