mirror of
https://github.com/apache/impala.git
synced 2025-12-19 18:12:08 -05:00
This patch adds two perf tools to the repository. Both can be used to generate flame graphs (https://www.brendangregg.com/flamegraphs.html). perf-record.sh: It samples the CPU stack traces for the entire system, or for a specific PID until the user hits Ctrl+C. It can be useful if the developer wants to take a look at what Impala is doing. The resulting flame graph is written to an SVG file. perf-query.sh: It takes a query string as a parameter and passes it to the impala shell to execute. While the query is executing the script samples the CPU stack traces for the entire system. The resulting flame graph is written to an SVG file. E.g.: perf-query.sh "select count(*) from tpch.lineitem group by l_returnflag" Change-Id: Ib3da696b939204d23c5285dcf1bf6ee3a3738415 Reviewed-on: http://gerrit.cloudera.org:8080/17834 Reviewed-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com> Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
85 lines
2.8 KiB
Bash
Executable File
85 lines
2.8 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
# This script samples the CPU stack traces for the entire system, or
|
|
# for a specific PID until it gets an interrupt signal (Ctrl+C).
|
|
# It visualizes the stack traces on a flame graph:
|
|
# https://www.brendangregg.com/flamegraphs.html
|
|
#
|
|
# It can be useful if we want to figure out what Impala is doing currently.
|
|
#
|
|
# PREREQUISITIES:
|
|
# * In directory ${IMPALA_TOOLCHAIN}: git clone https://github.com/brendangregg/FlameGraph
|
|
# * Install 'perf' on your system (e.g. 'apt install linux-tools-generic')
|
|
#
|
|
# Usage:
|
|
# perf-record.sh # records events for the whole system until Ctrl+C is pressed
|
|
# or
|
|
# perf-record.sh <pid> # records perf event for specific process until Ctrl+C is pressed
|
|
|
|
|
|
FLAME_GRAPH_DIR=${IMPALA_TOOLCHAIN}/FlameGraph
|
|
|
|
if [ ! -d ${FLAME_GRAPH_DIR} ]; then
|
|
echo "ERROR: ${FLAME_GRAPH_DIR} does not exist."
|
|
echo "Please use 'git clone https://github.com/brendangregg/FlameGraph' in ${IMPALA_TOOLCHAIN}"
|
|
exit 1
|
|
fi
|
|
|
|
PATH="${FLAME_GRAPH_DIR}:${PATH}"
|
|
|
|
# We trap the interrupt signal, so only 'perf record' gets interrupted while this script
|
|
# continues, so it can create the flame graph.
|
|
trap ctrl_c INT
|
|
function ctrl_c() {
|
|
echo "Trapped Ctrl+C"
|
|
}
|
|
|
|
# Measure whole system if no args given. Otherwise we expect a pid as argument.
|
|
if [ $# -eq 0 ]; then
|
|
echo "This script is going to record perf events for the whole system."
|
|
PERF_ARGS=-a
|
|
else
|
|
if ps -p $1 >/dev/null 2>&1; then
|
|
echo "This script is going to record perf events for pid=$1"
|
|
PERF_ARGS="-p $1"
|
|
else
|
|
echo "ERROR: Process with pid=$1 does not exist."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo "perf record started... Hit Ctrl+C to stop sampling."
|
|
# Sample CPU stack traces at 99 Hertz
|
|
sudo perf record -F 99 -g ${PERF_ARGS}
|
|
|
|
if [ ! -f perf.data ]; then
|
|
echo "ERROR: 'perf.data' has not been generated."
|
|
exit 1
|
|
fi
|
|
|
|
# Create the flame graph
|
|
sudo perf script | stackcollapse-perf.pl > out.perf-folded
|
|
flamegraph.pl out.perf-folded > perf_record.svg
|
|
|
|
echo "Flame graph has been written to 'perf_record.svg'."
|
|
|
|
# Render the flame graph in browser
|
|
firefox perf_record.svg 2>/dev/null
|