Skip to content

Instantly share code, notes, and snippets.

@Kadle11
Last active August 20, 2020 12:55
Show Gist options
  • Save Kadle11/7589ab7e8d74195bd01f646387c5e8b1 to your computer and use it in GitHub Desktop.
Save Kadle11/7589ab7e8d74195bd01f646387c5e8b1 to your computer and use it in GitHub Desktop.
Generate /tmp/perf-<PID>.map files for OpenResty-Nginx Docker container

Generate /tmp/perf-<PID>.map files for OpenResty-Nginx Docker Container

# Lua JIT generates /tmp/perf-<PID>.map files that perf needs to resolve symbols
# We need to map PIDs from Container to Host and copy the corrosponding files so 
# perf can resolve the symbols

# Compile LuaJIT in DockerFile with --with-luajit-xcflags="-DLUAJIT_USE_PERFTOOLS"

#!/bin/bash

perf report --sort comm 2> perfErr.txt | gawk  '{print $3};'
cat perfErr.txt | awk '{print $4}' | sort -u | grep -E "perf-[0-9]+" | awk -F "[/.]" '{print $3}' | awk -F "-" '{print $2}' | tr '\n' ' ' > perfErrPIDs.dat
cat perfErrPIDs.dat | xargs ps -f | awk '{print $2 "," $3}' | grep -E '[0-9]+' > ContainerErrIDs.csv
cat perfErr.txt | awk '{print $4}' | sort -u | grep -E "perf-[0-9]+" | awk -F "[/.]" '{print $3}' | awk -F "-" '{print $2}'  > perfErrPIDs.dat

while read p; do
  cat /proc/$p/status | grep NSpid | awk '{print $2 "," $3}' >> PIDMappings.csv
done < perfErrPIDs.dat

while read p; do
  ConatinerPID=$(echo $p | awk -F ',' '{print $2}')
  HostProcPID=$(echo $p | awk -F ',' '{print $1}')
  ContainerProcPID=$(cat PIDMappings.csv | grep $HostProcPID | awk -F ',' '{print $2}')
  ContainerName=$(docker ps -q | xargs docker inspect --format '{{.State.Pid}} {{.Name}}' | grep $ConatinerPID | awk '{print $2}' | awk -F '/' '{print $2}')
  #echo $ContainerName, $HostProcPID, $ContainerProcID
  docker cp $ContainerName:/tmp/perf-$ContainerProcPID.map /tmp/perf-$HostProcPID.map
done < ContainerErrIDs.csv

rm PIDMappings.csv ContainerErrIDs.csv perfErr.txt perfErrPIDs.dat
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment