From b86a15a1c948ccbbd2f0114d927c7d34f28d926b Mon Sep 17 00:00:00 2001 From: Ivan Babrou Date: Tue, 15 May 2018 21:40:18 -0700 Subject: [PATCH] Add support for jmaps in containers This is built on the following work: * https://github.com/jvm-profiling-tools/perf-map-agent/issues/50 * http://batey.info/docker-jvm-flamegraphs.html * https://github.com/chbatey/perf-map-agent/commit/60c50eb5519355b68bab8a3ddfdf1c9bf67d32f4 --- jmaps | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/jmaps b/jmaps index dcaac19d..9d23a970 100755 --- a/jmaps +++ b/jmaps @@ -72,25 +72,40 @@ for pid in $(pgrep -x java); do mapfile=/tmp/perf-$pid.map [[ -e $mapfile ]] && rm $mapfile - cmd="cd $AGENT_OUT; $JAVA_HOME/bin/java -Xms32m -Xmx128m -cp $AGENT_JAR:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $pid $opts" - (( debug )) && echo $cmd - user=$(ps ho user -p $pid) - if [[ "$user" != root ]]; then - if [[ "$user" == [0-9]* ]]; then - # UID only, run sudo with #UID: - cmd="sudo -u '#'$user sh -c '$cmd'" + + container=$(cat /proc/$pid/cgroup | grep :/docker/ | awk -F/ '{ print $NF }' | head -n1) + if [[ $container != "" ]]; then + container_pid=$(cat /proc/$pid/status | grep ^NSpid | awk '{ print $NF }') + echo "Prorcess $pid is in container $container" + docker cp $AGENT_JAR $container:/tmp + docker cp $AGENT_HOME/libperfmap.so $container:/tmp + docker exec -u $user $container sh -c "cd /tmp; java -Xms32m -Xmx128m -cp attach-main.jar:$(docker exec -u $user $container jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')/../lib/tools.jar net.virtualvoid.perf.AttachOnce $container_pid $opts" + docker cp $container:/tmp/perf-$container_pid.map $mapfile + docker exec -u $user $container rm /tmp/perf-$container_pid.map + else + cmd="cd $AGENT_OUT; $JAVA_HOME/bin/java -Xms32m -Xmx128m -cp $AGENT_JAR:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce $pid $opts" + (( debug )) && echo $cmd + + if [[ "$user" != root ]]; then + if [[ "$user" == [0-9]* ]]; then + # UID only, run sudo with #UID: + cmd="sudo -u '#'$user sh -c '$cmd'" + else + cmd="sudo -u $user sh -c '$cmd'" + fi + fi + + echo $cmd + + echo "Mapping PID $pid (user $user):" + if (( debug )); then + time eval $cmd else - cmd="sudo -u $user sh -c '$cmd'" + eval $cmd fi fi - echo "Mapping PID $pid (user $user):" - if (( debug )); then - time eval $cmd - else - eval $cmd - fi if [[ -e "$mapfile" ]]; then chown root $mapfile chmod 666 $mapfile