mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-12 17:32:32 +00:00
96 lines
4.6 KiB
Markdown
96 lines
4.6 KiB
Markdown
---
|
|
slug: /en/sql-reference/aggregate-functions/reference/flame_graph
|
|
sidebar_position: 138
|
|
---
|
|
|
|
# flameGraph
|
|
|
|
Aggregate function which builds a [flamegraph](https://www.brendangregg.com/flamegraphs.html) using the list of stacktraces. Outputs an array of strings which can be used by [flamegraph.pl utility](https://github.com/brendangregg/FlameGraph) to render an SVG of the flamegraph.
|
|
|
|
## Syntax
|
|
|
|
```sql
|
|
flameGraph(traces, [size], [ptr])
|
|
```
|
|
|
|
## Parameters
|
|
|
|
- `traces` — a stacktrace. [Array](../../data-types/array.md)([UInt64](../../data-types/int-uint.md)).
|
|
- `size` — an allocation size for memory profiling. (optional - default `1`). [UInt64](../../data-types/int-uint.md).
|
|
- `ptr` — an allocation address. (optional - default `0`). [UInt64](../../data-types/int-uint.md).
|
|
|
|
:::note
|
|
In the case where `ptr != 0`, a flameGraph will map allocations (size > 0) and deallocations (size < 0) with the same size and ptr.
|
|
Only allocations which were not freed are shown. Non mapped deallocations are ignored.
|
|
:::
|
|
|
|
## Returned value
|
|
|
|
- An array of strings for use with [flamegraph.pl utility](https://github.com/brendangregg/FlameGraph). [Array](../../data-types/array.md)([String](../../data-types/string.md)).
|
|
|
|
## Examples
|
|
|
|
### Building a flamegraph based on a CPU query profiler
|
|
|
|
```sql
|
|
SET query_profiler_cpu_time_period_ns=10000000;
|
|
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
|
|
```
|
|
|
|
```text
|
|
clickhouse client --allow_introspection_functions=1 -q "select arrayJoin(flameGraph(arrayReverse(trace))) from system.trace_log where trace_type = 'CPU' and query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl > flame_cpu.svg
|
|
```
|
|
|
|
### Building a flamegraph based on a memory query profiler, showing all allocations
|
|
|
|
```sql
|
|
SET memory_profiler_sample_probability=1, max_untracked_memory=1;
|
|
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
|
|
```
|
|
|
|
```text
|
|
clickhouse client --allow_introspection_functions=1 -q "select arrayJoin(flameGraph(trace, size)) from system.trace_log where trace_type = 'MemorySample' and query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem.svg
|
|
```
|
|
|
|
### Building a flamegraph based on a memory query profiler, showing allocations which were not deallocated in query context
|
|
|
|
```sql
|
|
SET memory_profiler_sample_probability=1, max_untracked_memory=1, use_uncompressed_cache=1, merge_tree_max_rows_to_use_cache=100000000000, merge_tree_max_bytes_to_use_cache=1000000000000;
|
|
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
|
|
```
|
|
|
|
```text
|
|
clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, size, ptr)) FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx'" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_untracked.svg
|
|
```
|
|
|
|
### Build a flamegraph based on memory query profiler, showing active allocations at the fixed point of time
|
|
|
|
```sql
|
|
SET memory_profiler_sample_probability=1, max_untracked_memory=1;
|
|
SELECT SearchPhrase, COUNT(DISTINCT UserID) AS u FROM hits WHERE SearchPhrase <> '' GROUP BY SearchPhrase ORDER BY u DESC LIMIT 10;
|
|
```
|
|
|
|
- 1 - Memory usage per second
|
|
|
|
```sql
|
|
SELECT event_time, m, formatReadableSize(max(s) as m) FROM (SELECT event_time, sum(size) OVER (ORDER BY event_time) AS s FROM system.trace_log WHERE query_id = 'xxx' AND trace_type = 'MemorySample') GROUP BY event_time ORDER BY event_time;
|
|
```
|
|
|
|
- 2 - Find a time point with maximal memory usage
|
|
|
|
```sql
|
|
SELECT argMax(event_time, s), max(s) FROM (SELECT event_time, sum(size) OVER (ORDER BY event_time) AS s FROM system.trace_log WHERE query_id = 'xxx' AND trace_type = 'MemorySample');
|
|
```
|
|
|
|
- 3 - Fix active allocations at fixed point of time
|
|
|
|
```text
|
|
clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, size, ptr)) FROM (SELECT * FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx' AND event_time <= 'yyy' ORDER BY event_time)" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_time_point_pos.svg
|
|
```
|
|
|
|
- 4 - Find deallocations at fixed point of time
|
|
|
|
```text
|
|
clickhouse client --allow_introspection_functions=1 -q "SELECT arrayJoin(flameGraph(trace, -size, ptr)) FROM (SELECT * FROM system.trace_log WHERE trace_type = 'MemorySample' AND query_id = 'xxx' AND event_time > 'yyy' ORDER BY event_time desc)" | ~/dev/FlameGraph/flamegraph.pl --countname=bytes --color=mem > flame_mem_time_point_neg.svg
|
|
```
|