add profiling docs

This commit is contained in:
A.Unger
2021-08-24 13:54:05 +02:00
parent 8e5b975b7f
commit 09da9305de

View File

@@ -0,0 +1,121 @@
---
title: "Profiling"
date: 2021-08-24T12:32:20+01:00
weight: 56
geekdocRepo: https://github.com/owncloud/ocis
geekdocEditPath: edit/master/docs/ocis/development
geekdocFilePath: profiling.md
---
{{< toc >}}
The only way to enable the profiler currently is to explicitly select which areas to collect samples for. In order to do this, the following steps have to be followed.
## 1. Clone Reva
`git clone github.com/cs3org/reva`
## 2. Patch reva with the area that you want sampled.
For the purposes of this docs let's use the WebDAV `PROPFIND` path.
```diff
diff --git a/internal/http/services/owncloud/ocdav/propfind.go b/internal/http/services/owncloud/ocdav/propfind.go
index 0e9c99be..f271572f 100644
--- a/internal/http/services/owncloud/ocdav/propfind.go
+++ b/internal/http/services/owncloud/ocdav/propfind.go
@@ -32,6 +32,8 @@ import (
"strings"
"time"
+ _ "net/http/pprof"
+
userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1"
rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1"
link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1"
@@ -311,6 +313,12 @@ func requiresExplicitFetching(n *xml.Name) bool {
return true
}
+func init() {
+ go func() {
+ http.ListenAndServe(":1234", nil)
+ }()
+}
+
// from https://github.com/golang/net/blob/e514e69ffb8bc3c76a71ae40de0118d794855992/webdav/xml.go#L178-L205
func readPropfind(r io.Reader) (pf propfindXML, status int, err error) {
c := countingReader{r: r}
```
The previous patch will:
1. import `net/http/pprof`, which will register debug handlers in `DefaultServeMux`.
2. define a `init()` function that starts an http server with the previously registered handlers.
With everything running one should have access to http://localhost:1234/debug/pprof/
## 3. Replace ocis go.mod to local reva and build a new binary
```diff
diff --git a/go.mod b/go.mod
index 131d14d7b..9668c38e4 100644
--- a/go.mod
+++ b/go.mod
@@ -78,6 +78,7 @@ require (
replace (
github.com/crewjam/saml => github.com/crewjam/saml v0.4.5
+ github.com/cs3org/reva => path/to/your/reva
go.etcd.io/etcd/api/v3 => go.etcd.io/etcd/api/v3 v3.0.0-20210204162551-dae29bb719dd
go.etcd.io/etcd/pkg/v3 => go.etcd.io/etcd/pkg/v3 v3.0.0-20210204162551-dae29bb719dd
)
```
Make sure to replace `github.com/cs3org/reva => path/to/your/reva` with the correct location of your reva.
## 4. Build a new ocis binary
From owncloud/ocis root:
```console
$ cd ocis
$ make clean build
```
## 5. Start oCIS server
From owncloud/ocis root:
```console
$ OCIS_LOG_PRETTY=true OCIS_LOG_COLOR=true ocis/bin/ocis server
```
## 6. Run `pprof`
### Install pprof
If `pprof` is not installed make sure to get it; one way of installing it is using the Go tools:
```console
$ go get -u github.com/google/pprof
```
### Collecting samples
Collect 30 seconds of samples:
```console
$ prof -web http://:1234/debug/pprof/profile\?seconds\=30
```
Once the collection is done a browser tab will open with the result `svg`, looking similar to this:
![img](https://i.imgur.com/vo0EbcX.jpg)
For references on how to interpret this graph, [continue reading here](https://github.com/google/pprof/blob/master/doc/README.md#interpreting-the-callgraph).
## References
- https://medium.com/swlh/go-profile-your-code-like-a-master-1505be38fdba
- https://dave.cheney.net/