From 7d36d186893bbbf8a230b6f98b6263719d9acb3d Mon Sep 17 00:00:00 2001 From: mbshields Date: Mon, 9 Oct 2023 11:31:08 -0700 Subject: [PATCH] docs: address additional comments Signed-off-by: mbshields --- .wordlist.txt | 1 - docs/admin-guide/admin-configuration.md | 10 +- .../pprofiling.md | 95 +++++++----------- docs/assets/images/profile001.gif | Bin 12324 -> 0 bytes docs/assets/images/profile001.png | Bin 0 -> 22450 bytes .../images/{flame.svg => profiling-flame.svg} | 0 docs/developer-guide/onboarding.md | 6 ++ mkdocs.yml | 2 +- 8 files changed, 54 insertions(+), 60 deletions(-) rename docs/{developer-guide => articles}/pprofiling.md (60%) delete mode 100644 docs/assets/images/profile001.gif create mode 100644 docs/assets/images/profile001.png rename docs/assets/images/{flame.svg => profiling-flame.svg} (100%) diff --git a/.wordlist.txt b/.wordlist.txt index dbeda2b..c687aad 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -41,7 +41,6 @@ CRI crt CSS cURL -curl cve CVE CVEs diff --git a/docs/admin-guide/admin-configuration.md b/docs/admin-guide/admin-configuration.md index 8ee201e..e100243 100644 --- a/docs/admin-guide/admin-configuration.md +++ b/docs/admin-guide/admin-configuration.md @@ -314,11 +314,15 @@ zot supports a range of monitoring tools including the following: * Metrics - Metrics data is available in a Prometheus format. A full zot image with extensions includes a node exporter. A minimal zot image can use an external node exporter such as `zxp`. + Metrics data is available in a Prometheus format. A full zot image with extensions includes a node exporter. A minimal zot image can use an external node exporter such as `zxp`. * Benchmarking - The zot project includes the `zb` tool, which allows you to benchmark a zot registry or any other container image registry that conforms to the [OCI Distribution Specification](https://github.com/opencontainers/distribution-spec). + The zot project includes the `zb` tool, which allows you to benchmark a zot registry or any other container image registry that conforms to the [OCI Distribution Specification](https://github.com/opencontainers/distribution-spec). + +* Performance profiling + + Performance profiling capabilities within zot allow a zot [administrator](../articles/authn-authz.md) to collect and export a range of diagnostic performance data such as CPU intensive function calls, memory allocations, and execution traces. The collected data can then be analyzed using Go tools and a variety of available visualization tools. When zot is deployed in a Kubernetes setup, a site reliability engineering (SRE) operator can monitor service level indicators (SLI) such as metrics and logs. Metrics will appear in [Prometheus](https://prometheus.io/docs/guides/query-log/) using the zot `metrics` extension, while logs will appear in the Elasticsearch stack ([ELK stack](https://www.elastic.co/what-is/elk-stack)) using [Filebeat](https://www.elastic.co/beats/filebeat). @@ -326,6 +330,8 @@ For detailed information about the monitoring tools, see [Monitoring the registr For detailed information about benchmarking, see [Benchmarking zot with zb](../articles/benchmarking-with-zb.md). +For detailed information about performance profiling, see [Performance Profiling in zot](../articles/pprofiling.md). + ## Clustering zot diff --git a/docs/developer-guide/pprofiling.md b/docs/articles/pprofiling.md similarity index 60% rename from docs/developer-guide/pprofiling.md rename to docs/articles/pprofiling.md index de7bb2e..65c72b3 100644 --- a/docs/developer-guide/pprofiling.md +++ b/docs/articles/pprofiling.md @@ -2,11 +2,15 @@ > :point_right: Use zot's built-in profiling tools to collect and analyze runtime performance. -The profiling capabilities within zot allow a zot [administrator](../articles/authn-authz.md) to collect and export a range of diagnostic performance data such as CPU intensive function calls, memory allocations, and execution traces. The collected data can then be analyzed using go tools and a variety of available visualization tools. +The profiling capabilities within zot allow a zot [administrator](../articles/authn-authz.md) to collect and export a range of diagnostic performance data such as CPU intensive function calls, memory allocations, and execution traces. The collected data can then be analyzed using Go tools and a variety of available visualization tools. + +> :pencil2: If authentication is enabled, only a zot admin user can access the APIs for profiling. +> +> :pencil2: All examples in this article assume that the zot registry is running at `localhost:8080`. ## What data is available? -The zot source code incorporates runtime analysis tools to collect data for the following performance-related profiles: +The zot source code incorporates [golang's pprof package](https://pkg.go.dev/runtime/pprof) of runtime analysis tools to collect data for the following performance-related profiles: | Profile | Description | | ------- | --------- | @@ -20,7 +24,7 @@ The zot source code incorporates runtime analysis tools to collect data for the | threadcreate | Stack traces that led to the creation of new OS threads. | | trace | A trace of execution of the current program. You can specify the duration in the `seconds` URL query parameter. After you get the trace file, use the `go tool trace` command to investigate the trace. | -To return an HTML-format profile list along with a count of currently available records for each profile, use the following API command: +To return a current HTML-format profile list along with a count of currently available records for each profile, use the following API command: /v2/_zot/pprof/ @@ -30,80 +34,60 @@ To return an HTML-format profile list along with a count of currently available To collect and export any available profile, use the following API command format: - /v2/_zot/pprof/[?] - -The following example shows an API request for the CPU usage profile named `profile` using a collection window of 10 seconds: - - $ curl -s -v http://localhost:8080/v2/_zot/pprof/profile?seconds=10 > cpu10.prof - * Trying 127.0.0.1:8080... - * Connected to localhost (127.0.0.1) port 8080 (#0) - > GET /v2/_zot/pprof/profile?seconds=10 HTTP/1.1 - > Host: localhost:8080 - > User-Agent: curl/8.1.2 - > Accept: */* - > - < HTTP/1.1 200 OK - < Content-Disposition: attachment; filename="profile" - < Content-Type: application/octet-stream - < X-Content-Type-Options: nosniff - < Date: Tue, 26 Sep 2023 17:01:28 GMT - < Content-Length: 107 - < - { [107 bytes data] - * Connection #0 to host localhost left intact - -This command creates an output data file named "cpu10.prof". - -- Using the query parameter `?seconds=`, we specify the number of seconds to gather the profile data. If this parameter is not specified, the default is 30 seconds. -- In this example, the raw output data is redirected to a file named "cpu10.prof". Alternatively, you can use `curl -O` to create a file with the default profile name (in this case, "profile"). If no output file is specified by either a cURL flag or an output redirection, the cURL command fails with "Failure writing output to destination". + /v2/_zot/pprof/[?] + +The following example shows an API request for the CPU usage profile named `profile` using a collection window of 30 seconds: + + $ curl -s http://localhost:8080/v2/_zot/pprof/profile?seconds=30 > cpu.prof + +This command example creates an output data file named "cpu.prof". + +- The query parameter `?seconds=` specifies the number of seconds to gather the profile data. If this parameter is not specified, the default is 30 seconds. +- In this example, the raw output data is redirected to a file named "cpu.prof". Alternatively, you can use `curl -O` to create a file with the default profile name (in this case, "profile"). If no output file is specified by either a cURL flag or an output redirection, the cURL command fails with "Failure writing output to destination". - The command output file is in a machine-readable format that can be interpreted by performance analyzers. ## Analyzing the CPU usage profile using `go tool pprof` -The pprof package provides a variety of presentation formats for analyzing runtime performance. +Go's pprof package provides a variety of presentation formats for analyzing runtime performance. For detailed information, see the [pprof documentation](https://pkg.go.dev/runtime/pprof). ### Generating a pprof web presentation -When an HTTP port is specified as a command flag, the `go tool pprof` command installs and opens a local web server that provides a web interface for viewing and analyzing the profile data. This example opens a localhost page at port 9090 for viewing the CPU usage data captured in the profile file named "cpu10.prof". +When an HTTP port is specified as a command flag, the `go tool pprof` command installs and opens a local web server that provides a web interface for viewing and analyzing the profile data. This example opens a localhost page at port 9090 for viewing the CPU usage data captured in the profile file named "cpu.prof". - $ go tool pprof -http=:9090 cpu10.prof + $ go tool pprof -http=:9090 cpu.prof Serving web UI on http://localhost:9090 -The pprof web view offers several options for viewing and interpreting the collected performance data. Select VIEW to see the following options: +The pprof web view offers several options for viewing and interpreting the collected performance data. Select VIEW to see the available options: ![pprof-view.jpg](../assets/images/pprof-view.jpg){width="300"} A Flame Graph can be very useful for analyzing CPU usage: -![flame.svg](../assets/images/flame.svg){width="300"} +![profiling-flame.svg](../assets/images/profiling-flame.svg){width="300"} ### Generating a graphic image -The pprof package can generate graphic representations of profile data in many formats. This example generates a GIF file representing the CPU usage in the "cpu10.prof" file. - - $ go tool pprof -gif cpu10.prof - Generating report in profile001.gif - -![profile001.gif](../assets/images/profile001.gif){width="300"} +The pprof package can generate graphic representations of profile data in many formats. This example generates a PNG file representing the CPU usage in the "cpu.prof" file. -!!! note "Documentation comments" + $ go tool pprof -png cpu.prof + Generating report in profile001.png - Is this section helpful? Need a more interesting illustration (maybe Flame?) +![profile001.png](../assets/images/profile001.png){width="300"} ### Opening a pprof interactive session This example opens an interactive session with pprof and executes the pprof `top` command, which displays the top ten modules by CPU usage during the profiling capture window. - $ go tool pprof cpu10.prof + $ go tool pprof cpu.prof Type: cpu Time: Sep 26, 2023 at 10:01am (PDT) - Duration: 10s, Total samples = 10ms ( 0.1%) + Duration: 30s, Total samples = 10ms ( 0.1%) Entering interactive mode (type "help" for commands, "o" for options) (pprof) top Showing nodes accounting for 10ms, 100% of 10ms total @@ -118,29 +102,28 @@ This example opens an interactive session with pprof and executes the pprof `top 0 0% 100% 10ms 100% runtime.semawakeup (pprof) -!!! note "Documentation comments" - - Is this section helpful? If so, it would be better to have more realistic data. ## Analyzing the trace profile using `go tool trace` -!!! note "Documentation comments" - - Is this section helpful? - You can collect trace data with the `trace` profile, as in this example: - $ curl -s -v http://localhost:8080/v2/_zot/pprof/trace?seconds=10 > trace10.prof + $ curl -s -v http://localhost:8080/v2/_zot/pprof/trace?seconds=30 > trace.prof -Using the `go tool trace` package, you can analyze the trace data captured in the "trace10.prof" example file: +Using the `go tool trace` package, you can analyze the trace data captured in the "trace.prof" example file: - $ go tool trace trace10.prof + $ go tool trace trace.prof 2023/09/21 16:58:58 Parsing trace... 2023/09/21 16:58:58 Splitting trace... 2023/09/21 16:58:58 Opening browser. Trace viewer is listening on http://127.0.0.1:62606 The `go tool trace` command installs and opens a local web server that provides a web interface for viewing and analyzing the trace data. -> :bulb: As an alternative, you can generate a pprof-like profile from the trace file using the following command: +As an alternative, you can generate a pprof-like profile from the trace file using the following command: + + $ go tool trace -pprof=[net|sync|syscall|sched] + +For example: + + $ go tool trace -pprof=net trace.prof + - go tool trace -pprof=[net|sync|syscall|sched] trace10.prof diff --git a/docs/assets/images/profile001.gif b/docs/assets/images/profile001.gif deleted file mode 100644 index 54dc969f58db60993e0eb5138a268682d4c02a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12324 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 C;Du@c diff --git a/docs/assets/images/profile001.png b/docs/assets/images/profile001.png new file mode 100644 index 0000000000000000000000000000000000000000..094d72f38cd43e0b0117ddfe9ff6ab2985d0b563 GIT binary patch literal 22450 zcmce;2RPS%-#7e4MrarjB}y5UQTCRMWYaJrAuBT@WECnziHz(KiHfWuk`%I|G9z0u zlCpEZe&_$XuKT{P>w2E!xsUre9_MkK=l?kC|MUHR#{2zR?_a2{w%Qh2c3OfUwy2*_ z)+Y$Eb^P;Z8gl&ispm~8_#Y|@4K-zAgY=)Y%A9C|;3CwOkDc;L`jPA{dAfJCdLXEY z@n8hsL&l>qG2u>3qhB-V*`9uUr0;aV)b2B1LKtK2DWze@qs(R3^!XUxNn`{c)v4Q? z^J~>o?ux?dmB^yjBf(F9FAvMwJp1YQ#dx*<>a(c#7KKF68*^bls%t4M|N5tX+S1jX z^i&;X)t;RAlNFY(8B5`vngis$e)Lp9lP2aBcSwJq&SCM$PWo);Yt!;nL2niW3i|8J zh2yIz|G)jq>7F5fe*X0S^P_tkBPHqga}0mDe`t-`X<+qlkxi?li&TH9=xa0Dg6469}Z$- zC4!pUNzXzQTwR=zyZXodw7sd_B7<7wZZ>&euQ=Xt(t9&WNR&O*Dwvx7nh$Rf zStHW2B>ot9{rVD9?fU=4+Npeb)|-+2@ZrP!{M*vElai8xgOwNSNl)Y#F;lwA#>RHz z#*OFCpJ%E@Fz(nPASft!@F2Uq?~8l)^ffdZd&``6v9l{3KR!J@U120ldMIx9D+)Tt zj|UYN{#;$0jgF3HVq`q?#F&yOEiK)=d9zN6?DER*yvj}%R3)dQ!ssCB17+}mccP-AVq%z82qUBJi;b}!agwCdGCtu{pd zpKeZ;`O??t+f{IZP)wfvIb5fqp+Q#t@gvq^YU<0gYuBy~RQXW^`mO%iyxHT59_b7x zE|hyG9XgYLLR%ZBkAaa`P2EOdZL6xPSXfxbTaphQJovn%L<_6h((-3< zF;(mm%hBhAVopayM8tsu2U?S)hDS$tFfgQNW*Qh7Z6>f{7cN{FZ%uucn`>tfI5sv$ zNylPkWwl$@Yp(C5TU{ha$LG&2t*zq;vp2TvGBz>s^Y#5&oUXk*;*n_I~OV`4h{ zE3P;XR5edG4o|daj*gDvo$*KaqoNAS%JB5+Cr%9Vp5L-%i@2$%m{>*CZDCw;rUmJW zZ3GjKrm%#>>wpb;A6Kftt}a77jggU&d+5sP&reKlmY*LP9li3Si;O699#AF2_U_uX zt8884cxdjZ>Zr$a*~xy-5GXSzpBNaz{r0=c5C?L?_#FU@%?)rR+-wY8fFy#F?0$BrFh zVq%{^f2LzO%$3t%7bC^b$7gGAzfYB%P&{#>zP|oesxQjbSWcQm6{<*fc6MQ*tGm1V zv14!Q?r`E67Zw)yYPRi`)YT;Y&=VgT8_Cl0^EJP3ylrJ4eEj$zv9vJBlzREzuXiYO zsn^Zy7sC#k92pyT?xpU_X3`9gkn6`}UyZ5gjuMZ-&ZCpEc+`oSPdNi*N zV`O`K`^bUXzIjT*+uM6-F_VliJj}A9qbXX0=iifab6Wm^NvMytWOu2f3C{VC?xNmv z-*>RGs;zCKp@~0wG3?0`fpXc)BQ%7Uj}QBwP%? z-kzO>g@=d76Qv_!m&E5!pGX^Wb&h}jw61O!PE+35XFOUDtel*xF1)?bo~fpxuHOGT zfYVtz_>H;GW;yXxHB;060n$(EzNQ?V)Eo3{N9{gliTmLK@am)_rKURD+e^Do=!y^E z+Bc;tY&0iIU>|T{xMCYms;ghTcyTigjV}GKo}L~-<6=G$5d&3K>!$c44n@Mbzxpe$ zEQ{ljYizp@p*P%nJYsaN*(6r>_DjB#{-MKb-_;B*_PGUO?OKfbc zliOJr`PmB8-mSaDHI0m3x}7xlk?CKrN{xz2&&bHg$+5At9G;kvv}xImyNYu73HP+6 zMH@IqMP>AT#4bJ;Wo6}4r%tubIN-fJr+XegdEz(xKEi)}<)XECbhtJj3=8H4^fIP|{e7|0K zy*96bu4!m!c*Q0HZLoEGWU;X|mZ}agD zw7Zp+l|6lZ*~P`~z?8s9*q$J&ElQCA>%YH5a>$^`v+Ug2HAdB*)Hb=0m6i3f3B0^z`(=B6qgBj-U~qP*SRS6GWY(nK0j~u(4a}a_!r&tZf?d}9h9v@0b9Hsyw{IUn$eTBB&?Yo=bjHxfV)Z;tuW{!43Vj{)BB1ey&eSf(JfRRa&wU$I2k=;8nv$(#p;&b-w+0Lb&yQ+%S zjg8^jIhl>uD5yQt>N4}p3k}iQ`1tr}XleJ|mM3UvXaIEsmgc@)`tr27v2mC;x1c~c zY&Hl$i=Ur=Z{{|_AX{^JeR1Fphs>FC=bChe&OSXCdgso@uT}+|R~*Q1moG$@G9 z&d%7wM)SSSuS+Hy4U)I2b-!@6ynJ~cWw&Br;*fbyGcz+IDZ6n;FYlC*k)fu( zi6(yP7!CHO6#Jj$>+4(d_U)xhm*NCW{tUgNvmN)lGFVN9IxC;ZIcAepF#y~{ z>sQa6+ua+818~g1fNA-zkP~X&wr$&_q@-#tPJVn?Q&Th2()W7f?=GVLoxEdDF}ip- ztI&Kx4Hn{-mb#s2Pg8;ja1F{-ivj7igXqgT4&{NlEEnJ7p~H{53x} zH#Z|g$y2$NnD;Eeu_Ctb+NIHDTiR@~8HFHVV|{UK%$k*z6|c$5%`IZnlC)))xVs^T zrch4B^xr@-icOT1xo`2N;e|C0s+(JWx%btA1@_np;2{w*Kh?O-C|F#>`@W+Q5gfN)(mHD@44qiMc+1Nm83m?7!oJ6v_?fJ#Zdz4pCvioOG)vcXxod5 zp{Aym@jBkd?(VVa;Etzyc|qoRMk#vo{%gQ#@6k095)w)@xF>9jtU4x0WFk)RA>Wow z?LI2X%3f4oU%K%UuY7(V6cf9@vAXpL9xpyVK2gGXzKQae$VZKFSO2BCH*ep*efMs3 z`PX>;fqnaG8X6|CgMco$Cr=(fz84h*%4JmUZf9*hhDrfiiwffF=Z6Ihb)RrAFDxv~ z${I-!v3d3C6-o!d>D{O&&z^0gqmw~vlV%K$`26{dXh!|?wDa8HoAs676oC@XUkODw zw_n#O>5d*fitFPw)A!P{F4FGOrSb9cyu3Vg@?8WzDgVh6T)pm(Y?3Z%fq~UHQ}w;R z`z*f{M#ku*%7aWL#K)&;u!P@_j_!CJ5U^h$BVgk%p=)SZuS4tbqrYPD%lUu<3U{QW zT!(5=C0T^be18tTLtS}lQnpo&*DIDvXG!no6YJ&B%fG*WDlacbS8+s@p`xO)x3@>T z9wDQ0V)w{5dVa0+s{ZNIqq*`v`YkDPi8&0^#8B7fd8Q~G9-S0=0^D*s;?^?%#6!=3 z&PRIaxtt3AvfnH&T>_vpBTne(EY8pO6xryUI@O7{Hmmg6!NTGR1OvdQaP^M^sx!ob z0~Q=Io(@>0#yBBXCZ>*0pFCV$m*+?6q}BCKp8P)3Ujd4;N7$UmA<#-6{fcvQmJALI zBzyvt@7&B(yAvB1x4N>jl|%XzAi&qJRoU4*d-q=W(N#E+{|7ir>w#$KFaCW84@!H_ zkM#5y&o>H5dp)--QpwEB1Riv-vkMhe@Lg)_>N??nKPaF=7pDvhX>|pN6
  • KdY+- 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/flame.svg b/docs/assets/images/profiling-flame.svg similarity index 100% rename from docs/assets/images/flame.svg rename to docs/assets/images/profiling-flame.svg diff --git a/docs/developer-guide/onboarding.md b/docs/developer-guide/onboarding.md index cee4908..ea7fe58 100644 --- a/docs/developer-guide/onboarding.md +++ b/docs/developer-guide/onboarding.md @@ -102,6 +102,12 @@ Delve is a powerful open-source debugger for the Go programming language. Downloads and documentation for Delve are available on GitHub at . +## Performance profiling + +Performance profiling capabilities within zot allow a zot [administrator](../articles/authn-authz.md) to collect and export a range of diagnostic performance data such as CPU intensive function calls, memory allocations, and execution traces. The collected data can then be analyzed using Go tools and a variety of available visualization tools. + +For detailed information about performance profiling, see [Performance Profiling in zot](../articles/pprofiling.md). + ## Code Organization The zot project codebase is organized as follows: diff --git a/mkdocs.yml b/mkdocs.yml index 1f42eec..0be5142 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -110,7 +110,6 @@ nav: - Developer Guide: - Onboarding: developer-guide/onboarding.md - Extensions: developer-guide/extensions-dev.md - - Performance Profiling: developer-guide/pprofiling.md - Contributing: developer-guide/contributing.md - Articles: - CI/CD Pipeline: articles/building-ci-cd-pipeline.md @@ -122,6 +121,7 @@ nav: - Clustering: articles/clustering.md - Monitoring: articles/monitoring.md - Benchmarking with zb: articles/benchmarking-with-zb.md + - Performance Profiling: articles/pprofiling.md - Using kind for Deployment Testing: articles/kind-deploy.md extra_css: - stylesheets/custom.css