mirror of
https://github.com/matrix-org/dendrite
synced 2024-12-15 07:42:58 +00:00
76db8e90de
### Pull Request Checklist <!-- Please read https://matrix-org.github.io/dendrite/development/contributing before submitting your pull request --> I was reading through the Dendrite documentation on https://matrix-org.github.io/dendrite/development/contributing and noticed the installation link leads to a 404 error. This link works fine if it is viewed directly from [docs/CONTRIBUTING.md](https://github.com/matrix-org/dendrite/blob/main/docs/CONTRIBUTING.md) but this might not be very obvious to new contributors who are reading through the [contribution page](https://matrix-org.github.io/dendrite/development/contributing) directly. This PR is mainly a small re-organization of the online documentation mainly in the [Development](https://matrix-org.github.io/dendrite/development) tab along with any links throughout the doc that may be impacted by the change. This does not contain any Go unit tests as this does not actually touch core dendrite functionality. * [ ] I have added Go unit tests or [Complement integration tests](https://github.com/matrix-org/complement) for this PR _or_ I have justified why this PR doesn't need tests * [x] Pull request includes a [sign off below using a legally identifiable name](https://matrix-org.github.io/dendrite/development/contributing#sign-off) _or_ I have already signed off privately Signed-off-by: `Kento Okamoto <kentokamoto@proton.me>`
95 lines
3.9 KiB
Markdown
95 lines
3.9 KiB
Markdown
---
|
|
title: Profiling
|
|
parent: Development
|
|
permalink: /development/profiling
|
|
---
|
|
|
|
# Profiling Dendrite
|
|
|
|
If you are running into problems with Dendrite using excessive resources (e.g. CPU or RAM) then you can use the profiler to work out what is happening.
|
|
|
|
Dendrite contains an embedded profiler called `pprof`, which is a part of the standard Go toolchain.
|
|
|
|
## Enable the profiler
|
|
|
|
To enable the profiler, start Dendrite with the `PPROFLISTEN` environment variable. This variable specifies which address and port to listen on, e.g.
|
|
|
|
```
|
|
PPROFLISTEN=localhost:65432 ./bin/dendrite-monolith-server ...
|
|
```
|
|
|
|
If pprof has been enabled successfully, a log line at startup will show that pprof is listening:
|
|
|
|
```
|
|
WARN[2020-12-03T13:32:33.669405000Z] [/Users/neilalexander/Desktop/dendrite/internal/log.go:87] SetupPprof
|
|
Starting pprof on localhost:65432
|
|
```
|
|
|
|
All examples from this point forward assume `PPROFLISTEN=localhost:65432` but you may need to adjust as necessary for your setup.
|
|
|
|
## Profiling CPU usage
|
|
|
|
To examine where CPU time is going, you can call the `profile` endpoint:
|
|
|
|
```
|
|
http://localhost:65432/debug/pprof/profile?seconds=30
|
|
```
|
|
|
|
The profile will run for the specified number of `seconds` and then will produce a result.
|
|
|
|
### Examine a profile using the Go toolchain
|
|
|
|
If you have Go installed and want to explore the profile, you can invoke `go tool pprof` to start the profile directly. The `-http=` parameter will instruct `go tool pprof` to start a web server providing a view of the captured profile:
|
|
|
|
```
|
|
go tool pprof -http=localhost:23456 http://localhost:65432/debug/pprof/profile?seconds=30
|
|
```
|
|
|
|
You can then visit `http://localhost:23456` in your web browser to see a visual representation of the profile. Particularly usefully, in the "View" menu, you can select "Flame Graph" to see a proportional interactive graph of CPU usage.
|
|
|
|
### Download a profile to send to someone else
|
|
|
|
If you don't have the Go tools installed but just want to capture the profile to send to someone else, you can instead use `curl` to download the profiler results:
|
|
|
|
```
|
|
curl -O http://localhost:65432/debug/pprof/profile?seconds=30
|
|
```
|
|
|
|
This will block for the specified number of seconds, capturing information about what Dendrite is doing, and then produces a `profile` file, which you can send onward.
|
|
|
|
## Profiling memory usage
|
|
|
|
To examine where memory usage is going, you can call the `heap` endpoint:
|
|
|
|
```
|
|
http://localhost:65432/debug/pprof/heap
|
|
```
|
|
|
|
The profile will return almost instantly.
|
|
|
|
### Examine a profile using the Go toolchain
|
|
|
|
If you have Go installed and want to explore the profile, you can invoke `go tool pprof` to start the profile directly. The `-http=` parameter will instruct `go tool pprof` to start a web server providing a view of the captured profile:
|
|
|
|
```
|
|
go tool pprof -http=localhost:23456 http://localhost:65432/debug/pprof/heap
|
|
```
|
|
|
|
You can then visit `http://localhost:23456` in your web browser to see a visual representation of the profile. The "Sample" menu lets you select between four different memory profiles:
|
|
|
|
* `inuse_space`: Shows how much actual heap memory is allocated per function (this is generally the most useful profile when diagnosing high memory usage)
|
|
* `inuse_objects`: Shows how many heap objects are allocated per function
|
|
* `alloc_space`: Shows how much memory has been allocated per function (although that memory may have since been deallocated)
|
|
* `alloc_objects`: Shows how many allocations have been made per function (although that memory may have since been deallocated)
|
|
|
|
Also in the "View" menu, you can select "Flame Graph" to see a proportional interactive graph of the memory usage.
|
|
|
|
### Download a profile to send to someone else
|
|
|
|
If you don't have the Go tools installed but just want to capture the profile to send to someone else, you can instead use `curl` to download the profiler results:
|
|
|
|
```
|
|
curl -O http://localhost:65432/debug/pprof/heap
|
|
```
|
|
|
|
This will almost instantly produce a `heap` file, which you can send onward.
|