Skip to content

Commit

Permalink
docs: Add new file for Pprof tutorial.
Browse files Browse the repository at this point in the history
  • Loading branch information
TAM360 committed Sep 13, 2024
1 parent d26664f commit c4eed09
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 0 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
68 changes: 68 additions & 0 deletions docs/book/src/cronjob-tutorial/pprof-tutorial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Monitoring Performance with Pprof

`pprof` is a Go profiling tool integrated within the `controller-runtime` library, designed to help identify performance bottlenecks in areas such as CPU usage, memory allocation, and more. This profiling tool, from the Go package [`net/http/pprof`][pprof-go-docs], is especially useful for diagnosing performance issues by providing detailed insights into resource usage during the runtime of your application.

`pprof` is integrated into the HTTP server used by the `controller-runtime` manager, allowing you to collect profiling data via HTTP endpoints. This data can then be visualized using `go tool pprof`. Pprof feature is built into the `controller-runtime` library, so there is no need to install it separately.

The `controller-runtime` [Manager options][manager-options-doc] provide an easy way to enable `pprof`, allowing you to gather detailed runtime metrics for improving the performance of your controllers.

For further information about the Pprof, check out the official [Github repository][github-repo].

<aside class="warning">
<h1>Pprof Not Recommended for Production</h1>

While [Pprof][github-repo] is an excellent tool for profiling and debugging, it is not recommended to leave it enabled in production environments. The primary reasons are:

1. **Security Risk**: The profiling endpoints expose detailed information about your application's performance and resource usage, which could be exploited if accessed by unauthorized users.
2. **Overhead**: Continuous profiling can introduce performance overhead, especially under heavy load, potentially impacting production workloads.

</aside>

## How to use Pprof in your Codebase

1. In your `cmd/main.go` file, add the following `controller-runtime` manager field to enable the `pprof` endpoints:

```golang
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
...
// PprofBindAddress is the TCP address that the controller should bind to
// for serving pprof. Specify the manager address and the port that should be bind.
PprofBindAddress: ":8082",
...
})
```

2. Start your controller on your localhost:

```bash
make run
```

3. Deploy your custom resource on Kind, or any other Kubernetes cluster. Wait for the pods to be ready.

```bash
kubectl apply -f config/samples/batch_v1_cronjob.yaml
```

4. Use `curl` to export the profiling statistics into a file. Note that the **URL hit should be same as the one specified in the `PprofBindAddress` field of your Controller's Manager**.
```bash
curl -s "http://127.0.0.1:8082/debug/pprof/profile" > ./cpu-profile.out
```
5. Visualize the results on an interactive dashboard.
```bash
# Go tool will open a session on port 8080.
# You can change this as per your own need.
go tool pprof -http=:8080 ./cpu-profile.out
```
Visualizaion resutls will vary depending on the deployed workload, and the Controller's behavior.
However, you'll see a dashboard on your browser similar to this one:
![pprof-result-visualization](./images/pprof-result-visualization.png)
[pprof-go-docs]: https://pkg.go.dev/net/http/pprof
[manager-options-doc]: https://pkg.go.dev/sigs.k8s.io/controller-runtime/pkg/manager
[github-repo]: https://github.com/google/pprof
2 changes: 2 additions & 0 deletions docs/book/src/reference/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
- [Object/DeepCopy](markers/object.md)
- [RBAC](markers/rbac.md)

- [Performance Profiling with Pprof](../cronjob-tutorial/pprof-tutorial.md)

- [controller-gen CLI](controller-gen.md)
- [completion](completion.md)
- [Artifacts](artifacts.md)
Expand Down

0 comments on commit c4eed09

Please sign in to comment.