diff --git a/.github/ecosystem-dashboard-tracker.md b/.github/ecosystem-dashboard-tracker.md new file mode 100644 index 0000000000..91adc51f5b --- /dev/null +++ b/.github/ecosystem-dashboard-tracker.md @@ -0,0 +1,107 @@ +# Ecosystem Dashboard Tracker + +Track which install guides have an `ecosystem_dashboard` front matter field. + +Progress: 96 total | 28 have ecosystem_dashboard | 68 do not + +Legend: [x] has ecosystem_dashboard | [-] no entry available | [ ] not reviewed + + +| # | Guide | Title | Published | ecosystem_dashboard | +|---|-------|-------|-----------|---------------------| +| 1 | acfl | Arm Compiler for Linux | ✓ | [-] no entry | +| 2 | ambaviz | Arm AMBA Viz | ✓ | [-] no entry | +| 3 | ams | Arm Performance Studio | ✓ | [-] no entry | +| 4 | anaconda | Anaconda | ✓ | [x] | +| 5 | ansible | Ansible | ✓ | [x] | +| 6 | aperf | APerf | ✓ | [-] no entry | +| 7 | arduino-pico | Arduino core for the Raspberry Pi Pico | ✓ | [-] no entry | +| 8 | armclang | Arm Compiler for Embedded | ✓ | [-] no entry | +| 9 | armds | Arm Development Studio | ✓ | [-] no entry | +| 10 | armie | Arm Instruction Emulator (armie) | ✓ | [-] no entry | +| 11 | armpl | Arm Performance Libraries | ✓ | [-] no entry | +| 12 | asct | Arm System Characterization Tool | 🔒 hidden | [-] no entry | +| 13 | atp | Arm Total Performance | 🔒 hidden | [-] no entry | +| 14 | avh | Arm Virtual Hardware | ✓ | [-] no entry | +| 15 | aws_access_keys | AWS Credentials | ✓ | [-] no entry | +| 16 | aws-cli | AWS CLI | ✓ | [-] no entry | +| 17 | aws-copilot | AWS Copilot CLI | ✓ | [-] no entry | +| 18 | aws-greengrass-v2 | AWS IoT Greengrass | ✓ | [-] no entry | +| 19 | aws-sam-cli | AWS SAM CLI | ✓ | [-] no entry | +| 20 | azure_login | Azure Authentication | ✓ | [-] no entry | +| 21 | azure-cli | Azure CLI | ✓ | [x] | +| 22 | bedrust | Bedrust - invoke models on Amazon Bedrock | ✓ | [-] no entry | +| 23 | bolt | BOLT | ✓ | [-] no entry | +| 24 | browsers/ | Browsers on Arm (multi-page) | ✓ | [-] no entry | +| 25 | claude-code | Claude Code | ✓ | [-] no entry | +| 26 | cmake | CMake | ✓ | [x] | +| 27 | cmsis-toolbox | CMSIS-Toolbox | ✓ | [-] no entry | +| 28 | codex-cli | Codex CLI | ✓ | [-] no entry | +| 29 | container | Container CLI for macOS | ✓ | [-] no entry | +| 30 | cyclonedds | Cyclone DDS | ✓ | [-] no entry | +| 31 | dcperf | DCPerf | ✓ | [-] no entry | +| 32 | docker/ | Docker (multi-page) | ✓ | [x] | +| 33 | dotnet | .NET SDK | ✓ | [x] | +| 34 | eksctl | AWS EKS CLI (eksctl) | ✓ | [-] no entry | +| 35 | finch | Finch on Arm Linux | ✓ | [-] no entry | +| 36 | fm_fvp/ | Arm Fast Models and FVPs (multi-page) | ✓ | [-] no entry | +| 37 | forge | Linaro Forge | ✓ | [-] no entry | +| 38 | fvps-on-macos | AVH FVPs on macOS | ✓ | [-] no entry | +| 39 | gcloud | Google Cloud Platform (GCP) CLI | ✓ | [-] no entry | +| 40 | gcc/ | GNU Compiler (multi-page) | ✓ | [x] | +| 41 | gemini | Gemini CLI | ✓ | [-] no entry | +| 42 | gfortran | GFortran | ✓ | [-] no entry | +| 43 | git-woa | Git for Windows on Arm | ✓ | [x] | +| 44 | github-copilot | GitHub Copilot | ✓ | [-] no entry | +| 45 | go | Go | ✓ | [x] | +| 46 | helm | Helm | ✓ | [x] | +| 47 | hyper-v | Hyper-V on Arm | ✓ | [-] no entry | +| 48 | ipexplorer | Arm IP Explorer | ✓ | [-] no entry | +| 49 | java | Java | ✓ | [x] | +| 50 | keilstudio_vs | Arm Keil Studio for VS Code | ✓ | [-] no entry | +| 51 | keilstudiocloud | Arm Keil Studio Cloud | ✓ | [-] no entry | +| 52 | kiro-cli | Kiro CLI | ✓ | [-] no entry | +| 53 | kubectl | Kubectl | ✓ | [-] no entry | +| 54 | license/ | Arm Software Licensing (multi-page) | ✓ | [-] no entry | +| 55 | linux-migration-tools | Arm Linux Migration Tools | ✓ | [-] no entry | +| 56 | llvm-embedded | LLVM Embedded Toolchain for Arm | ✓ | [-] no entry | +| 57 | llvm-woa | LLVM toolchain for Windows on Arm | ✓ | [-] no entry | +| 58 | mcuxpresso_vs | NXP MCUXpresso for VS Code | ✓ | [-] no entry | +| 59 | mdk | Arm Keil uVision | ✓ | [-] no entry | +| 60 | multipass | Multipass | ✓ | [x] | +| 61 | nerdctl | Nerdctl | ✓ | [-] no entry | +| 62 | nomachine | NoMachine | ✓ | [-] no entry | +| 63 | oc | OpenShift CLI (oc) | ✓ | [x] | +| 64 | oci-cli | Oracle Cloud Infrastructure (OCI) CLI | ✓ | [-] no entry | +| 65 | openvscode-server | OpenVSCode Server | ✓ | [-] no entry | +| 66 | papi | Performance API (PAPI) | ✓ | [-] no entry | +| 67 | perf | Perf for Linux on Arm (LinuxPerf) | ✓ | [x] | +| 68 | porting-advisor | Porting Advisor for Graviton | ✓ | [x] | +| 69 | powershell | PowerShell | ✓ | [x] | +| 70 | pulumi | Pulumi | ✓ | [x] | +| 71 | py-woa | Python for Windows on Arm | ✓ | [x] | +| 72 | pytorch | PyTorch | ✓ | [x] | +| 73 | pytorch-woa | PyTorch for Windows on Arm | ✓ | [x] | +| 74 | ros2 | ROS - Robot Operating System | ✓ | [-] no entry | +| 75 | rust | Rust for Linux Applications | ✓ | [x] | +| 76 | rust_embedded | Rust for Embedded Applications | ✓ | [-] no entry | +| 77 | sbt | sbt | ✓ | [x] | +| 78 | skopeo | Skopeo | ✓ | [-] no entry | +| 79 | socrates | Arm Socrates | ✓ | [-] no entry | +| 80 | ssh | SSH | ✓ | [x] | +| 81 | stm32_vs | STM32 extensions for VS Code | ✓ | [-] no entry | +| 82 | streamline | Arm Streamline | ✓ | [-] no entry | +| 83 | streamline-cli | Streamline CLI Tools | ✓ | [-] no entry | +| 84 | successkits | Arm Success Kits | ✓ | [-] no entry | +| 85 | swift | Swift | ✓ | [x] | +| 86 | sysbox | Sysbox | ✓ | [-] no entry | +| 87 | terraform | Terraform | ✓ | [x] | +| 88 | tkn | Tekton CLI (tkn) | ✓ | [-] no entry | +| 89 | topdown-tool | Telemetry Solution (Topdown Methodology) | ✓ | [-] no entry | +| 90 | vnc | VNC on Arm Linux | ✓ | [x] | +| 91 | vs-woa | Visual Studio for Windows on Arm | ✓ | [x] | +| 92 | vscode-tunnels | VS Code Tunnels | ✓ | [-] no entry | +| 93 | windows-perf-vs-extension | Visual Studio Extension for WindowsPerf | ✓ | [-] no entry | +| 94 | windows-perf-wpa-plugin | Windows Performance Analyzer (WPA) plugin | ✓ | [-] no entry | +| 95 | windows-sandbox-woa | Windows Sandbox for Windows on Arm | ✓ | [-] no entry | +| 96 | wperf | WindowsPerf (wperf) | ✓ | [-] no entry | diff --git a/content/install-guides/anaconda.md b/content/install-guides/anaconda.md index 40c09a0dd2..45a47d7a5a 100644 --- a/content/install-guides/anaconda.md +++ b/content/install-guides/anaconda.md @@ -11,6 +11,7 @@ author: Jason Andrews multi_install: false multitool_install_part: false official_docs: https://docs.anaconda.com/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=anaconda test_images: - ubuntu:latest test_link: null diff --git a/content/install-guides/ansible.md b/content/install-guides/ansible.md index 94243806d8..be6395f494 100644 --- a/content/install-guides/ansible.md +++ b/content/install-guides/ansible.md @@ -8,6 +8,7 @@ minutes_to_complete: 10 multi_install: false multitool_install_part: false official_docs: https://docs.ansible.com/ansible/latest/index.html +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=ansible test_maintenance: true test_images: - ubuntu:latest diff --git a/content/install-guides/azure-cli.md b/content/install-guides/azure-cli.md index ce40f2b4b1..20e2b53a6e 100644 --- a/content/install-guides/azure-cli.md +++ b/content/install-guides/azure-cli.md @@ -8,6 +8,7 @@ minutes_to_complete: 15 multi_install: false multitool_install_part: false official_docs: https://learn.microsoft.com/en-us/cli/azure +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=microsoft-azure-cli test_images: - ubuntu:latest test_maintenance: true diff --git a/content/install-guides/cmake.md b/content/install-guides/cmake.md index 2220fac1d9..345f81be76 100644 --- a/content/install-guides/cmake.md +++ b/content/install-guides/cmake.md @@ -12,6 +12,7 @@ minutes_to_complete: 10 author: Jason Andrews official_docs: https://cmake.org/documentation/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=cmake test_images: - ubuntu:latest diff --git a/content/install-guides/docker/docker-desktop-arm-linux.md b/content/install-guides/docker/docker-desktop-arm-linux.md index 4486456ec3..187f6517cc 100644 --- a/content/install-guides/docker/docker-desktop-arm-linux.md +++ b/content/install-guides/docker/docker-desktop-arm-linux.md @@ -15,6 +15,7 @@ author: Jason Andrews ### Link to official documentation official_docs: https://docs.docker.com/desktop/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=docker weight: 4 # Defines page ordering. Must be 1 for first (or only) page. tool_install: false # Set to true to be listed in main selection page, else false diff --git a/content/install-guides/docker/docker-engine.md b/content/install-guides/docker/docker-engine.md index 7df070b1f4..385fb1df17 100644 --- a/content/install-guides/docker/docker-engine.md +++ b/content/install-guides/docker/docker-engine.md @@ -15,6 +15,7 @@ author: Jason Andrews ### Link to official documentation official_docs: https://docs.docker.com/engine/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=docker-ce weight: 2 # Defines page ordering. Must be 1 for first (or only) page. tool_install: false # Set to true to be listed in main selection page, else false diff --git a/content/install-guides/dotnet.md b/content/install-guides/dotnet.md index 04b5f5368b..e97b0d0732 100644 --- a/content/install-guides/dotnet.md +++ b/content/install-guides/dotnet.md @@ -5,6 +5,7 @@ author: Jason Andrews multi_install: false multitool_install_part: false official_docs: https://learn.microsoft.com/en-us/dotnet/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=.net additional_search_terms: - .NET SDK test_images: diff --git a/content/install-guides/gcc/native.md b/content/install-guides/gcc/native.md index a276c27c42..42d22afa35 100644 --- a/content/install-guides/gcc/native.md +++ b/content/install-guides/gcc/native.md @@ -7,6 +7,7 @@ author: Jason Andrews multi_install: false multitool_install_part: true official_docs: https://gcc.gnu.org/onlinedocs/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=GNU%20Toolchain%20%28GCC%29 test_images: - ubuntu:latest - fedora:latest diff --git a/content/install-guides/git-woa.md b/content/install-guides/git-woa.md index 54cc37a063..e1562e4ba9 100644 --- a/content/install-guides/git-woa.md +++ b/content/install-guides/git-woa.md @@ -12,6 +12,7 @@ minutes_to_complete: 10 ### Link to official documentation official_docs: https://git-scm.com/doc +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/windows?package=git author: Jason Andrews diff --git a/content/install-guides/go.md b/content/install-guides/go.md index 9665cca74d..260f3b20c1 100644 --- a/content/install-guides/go.md +++ b/content/install-guides/go.md @@ -10,6 +10,7 @@ author: Jason Andrews multi_install: false multitool_install_part: false official_docs: https://go.dev/doc/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=golang test_images: - ubuntu:latest test_maintenance: true diff --git a/content/install-guides/helm.md b/content/install-guides/helm.md index a4e510b3af..e309d290c9 100644 --- a/content/install-guides/helm.md +++ b/content/install-guides/helm.md @@ -5,6 +5,7 @@ author: Jason Andrews minutes_to_complete: 10 official_docs: https://helm.sh/docs/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=helm additional_search_terms: - kubernetes diff --git a/content/install-guides/java.md b/content/install-guides/java.md index 3cb6f99063..a689110559 100644 --- a/content/install-guides/java.md +++ b/content/install-guides/java.md @@ -3,6 +3,7 @@ title: Java author: Jason Andrews minutes_to_complete: 15 official_docs: https://docs.oracle.com/en/java/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=Java%2FOpenJDK additional_search_terms: - linux diff --git a/content/install-guides/multipass.md b/content/install-guides/multipass.md index dc4fdb2f91..80c3d85df2 100644 --- a/content/install-guides/multipass.md +++ b/content/install-guides/multipass.md @@ -20,6 +20,7 @@ author: Jason Andrews ### Link to official documentation official_docs: https://documentation.ubuntu.com/multipass/en/latest/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=Canonical%20Multipass test_images: - ubuntu:latest diff --git a/content/install-guides/oc.md b/content/install-guides/oc.md index 3088e105d6..7a1c2fe4a5 100644 --- a/content/install-guides/oc.md +++ b/content/install-guides/oc.md @@ -4,6 +4,7 @@ title: OpenShift CLI (oc) author: Jason Andrews official_docs: https://docs.redhat.com/en/documentation/openshift_container_platform/4.18/html/cli_tools/openshift-cli-oc#cli-getting-started +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=OpenShift minutes_to_complete: 10 additional_search_terms: diff --git a/content/install-guides/perf.md b/content/install-guides/perf.md index 0b29ebf6d1..b42d5d8fc9 100644 --- a/content/install-guides/perf.md +++ b/content/install-guides/perf.md @@ -18,6 +18,7 @@ author: Jason Andrews ### Link to official documentation official_docs: https://perf.wiki.kernel.org/index.php/Main_Page +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=perf test_images: - ubuntu:latest diff --git a/content/install-guides/porting-advisor.md b/content/install-guides/porting-advisor.md index 1879dc94b0..fcb02408b9 100644 --- a/content/install-guides/porting-advisor.md +++ b/content/install-guides/porting-advisor.md @@ -21,6 +21,7 @@ author: Jason Andrews ### Link to official documentation official_docs: https://github.com/aws/porting-advisor-for-graviton/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=Porting%20Advisor ### PAGE SETUP weight: 1 # Defines page ordering. Must be 1 for first (or only) page. diff --git a/content/install-guides/powershell.md b/content/install-guides/powershell.md index 3da5f48aa1..cf87bdafeb 100644 --- a/content/install-guides/powershell.md +++ b/content/install-guides/powershell.md @@ -2,6 +2,7 @@ title: PowerShell minutes_to_complete: 10 official_docs: https://learn.microsoft.com/en-us/powershell/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=powershell author: Jason Andrews additional_search_terms: - pwsh diff --git a/content/install-guides/pulumi.md b/content/install-guides/pulumi.md index a42b2bb879..cc084fbe4b 100644 --- a/content/install-guides/pulumi.md +++ b/content/install-guides/pulumi.md @@ -2,8 +2,8 @@ title: Pulumi minutes_to_complete: 5 official_docs: https://www.pulumi.com/docs/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=pulumi author: Jason Andrews - test_maintenance: true test_images: - ubuntu:latest diff --git a/content/install-guides/py-woa.md b/content/install-guides/py-woa.md index bd482fb1c4..85b0d638c0 100644 --- a/content/install-guides/py-woa.md +++ b/content/install-guides/py-woa.md @@ -16,6 +16,7 @@ minutes_to_complete: 15 ### Link to official documentation official_docs: https://www.python.org/doc/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/windows?package=python author: Jason Andrews diff --git a/content/install-guides/pytorch-woa.md b/content/install-guides/pytorch-woa.md index 9e36c50eb9..29a4b64844 100644 --- a/content/install-guides/pytorch-woa.md +++ b/content/install-guides/pytorch-woa.md @@ -17,6 +17,7 @@ minutes_to_complete: 15 ### Link to official documentation official_docs: https://docs.pytorch.org/docs/stable/index.html +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/windows?package=pytorch author: Pareena Verma diff --git a/content/install-guides/pytorch.md b/content/install-guides/pytorch.md index 4701be399b..8ec473b7fb 100644 --- a/content/install-guides/pytorch.md +++ b/content/install-guides/pytorch.md @@ -10,6 +10,7 @@ author: Jason Andrews multi_install: false multitool_install_part: false official_docs: https://pytorch.org/docs/stable/index.html +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=pytorch test_images: - ubuntu:latest test_link: null diff --git a/content/install-guides/rust.md b/content/install-guides/rust.md index c38036eaeb..759ba66f82 100644 --- a/content/install-guides/rust.md +++ b/content/install-guides/rust.md @@ -2,6 +2,7 @@ title: Rust for Linux Applications minutes_to_complete: 10 official_docs: https://www.rust-lang.org/tools/install +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=rust author: Mathias Brossard additional_search_terms: - compiler diff --git a/content/install-guides/sbt.md b/content/install-guides/sbt.md index 0c6f168644..0740cabb92 100644 --- a/content/install-guides/sbt.md +++ b/content/install-guides/sbt.md @@ -12,6 +12,7 @@ layout: installtoolsall multi_install: false multitool_install_part: false official_docs: https://www.scala-sbt.org/download/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=scala test_images: - ubuntu:latest test_link: null diff --git a/content/install-guides/ssh.md b/content/install-guides/ssh.md index 47227e12a9..a4ce4b0711 100644 --- a/content/install-guides/ssh.md +++ b/content/install-guides/ssh.md @@ -16,6 +16,7 @@ author: Jason Andrews ### Link to official documentation official_docs: https://www.openssh.com/manual.html +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=openssh test_images: - ubuntu:latest diff --git a/content/install-guides/swift.md b/content/install-guides/swift.md index ec2b3dfa03..7f5272d585 100644 --- a/content/install-guides/swift.md +++ b/content/install-guides/swift.md @@ -11,6 +11,7 @@ layout: installtoolsall multi_install: false multitool_install_part: false official_docs: https://www.swift.org/documentation/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=Swift%20(Arm64) test_images: - ubuntu:latest test_maintenance: true diff --git a/content/install-guides/terraform.md b/content/install-guides/terraform.md index 000eb8db5c..75f08c91a6 100644 --- a/content/install-guides/terraform.md +++ b/content/install-guides/terraform.md @@ -12,6 +12,7 @@ author: Jason Andrews multi_install: false multitool_install_part: false official_docs: https://developer.hashicorp.com/terraform/docs +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=terraform test_images: - ubuntu:latest test_link: false diff --git a/content/install-guides/vnc.md b/content/install-guides/vnc.md index 8982fc9ac3..b16479a920 100644 --- a/content/install-guides/vnc.md +++ b/content/install-guides/vnc.md @@ -16,6 +16,7 @@ author: Jason Andrews ### Link to official documentation official_docs: https://tigervnc.org/ +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=TurboVNC test_images: - ubuntu:latest diff --git a/content/install-guides/vs-woa.md b/content/install-guides/vs-woa.md index e481a65c47..4510fae878 100644 --- a/content/install-guides/vs-woa.md +++ b/content/install-guides/vs-woa.md @@ -13,6 +13,7 @@ additional_search_terms: minutes_to_complete: 30 official_docs: https://learn.microsoft.com/en-us/visualstudio/install/visual-studio-on-arm-devices +ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/windows?package=Visual%20Studio author: Pareena Verma diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/_index.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/_index.md index 2f08fa0764..583ce4888c 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/_index.md @@ -1,13 +1,10 @@ --- -title: "Get started with BOLT" +title: "Optimize AArch64 binaries with LLVM BOLT" -draft: true -cascade: - draft: true minutes_to_complete: 20 -who_is_this_for: This learning path is intended for developers who have compiled an AArch64 Linux application and want to evaluate whether LLVM BOLT can improve its runtime performance. +who_is_this_for: This is an introductory topic for developers who have compiled an AArch64 Linux application and want to evaluate whether LLVM BOLT can improve its runtime performance. learning_objectives: @@ -19,8 +16,8 @@ learning_objectives: prerequisites: - An AArch64 system running Linux with [perf](/install-guides/perf/) installed - - Linux kernel version 6.17 or later to enable Branch Record Buffer Extension [BRBE](./brbe) profiling - - Linux kernel version 6.14 or later for Arm Statistical Profiling Extension [SPE](./spe) support + - Linux kernel version 6.17 or later to enable Branch Record Buffer Extension ([BRBE profiling](/learning-paths/servers-and-cloud-computing/bolt-demo/brbe/)) + - Linux kernel version 6.14 or later for Arm Statistical Profiling Extension ([SPE profiling](/learning-paths/servers-and-cloud-computing/bolt-demo/spe/)) - GCC version 13.3 or later to compile the example program ([GCC](/install-guides/gcc/) ) - LLVM BOLT version [21.1.8](https://github.com/llvm/llvm-project/releases/tag/llvmorg-21.1.8) or later (download [zip](https://github.com/llvm/llvm-project/releases/download/llvmorg-21.1.8/LLVM-21.1.8-Linux-ARM64.tar.xz)) - A system with with sufficient hardware performance counters to use the [TopDown](/install-guides/topdown-tool) methodology. This typically requires running on bare metal rather than a virtualized environment. @@ -54,6 +51,18 @@ further_reading: title: Arm Topdown Methodology link: https://developer.arm.com/documentation/109542/02/Arm-Topdown-methodology type: documentation + - resource: + title: Optimizing Clang - A Practical Example of Applying BOLT + link: https://github.com/llvm/llvm-project/blob/main/bolt/docs/OptimizingClang.md + type: documentation + - resource: + title: Metrics by metric group in Neoverse V2 + link: https://developer.arm.com/documentation/109528/0200/Metrics-by-metric-group-in-Neoverse-V2 + type: documentation + - resource: + title: Arm® Architecture Reference Manual, for A-profile architecture + link: https://developer.arm.com/documentation/ddi0487/latest + type: documentation diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/brbe.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/brbe.md index a5f89c0972..ea09f9e8a3 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/brbe.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/brbe.md @@ -1,12 +1,12 @@ --- -title: "BOLT with BRBE" +title: Optimize with BRBE profiling weight: 5 ### FIXED, DO NOT MODIFY layout: learningpathall --- -### What is BRBE +## What is BRBE? BRBE stands for Branch Record Buffer Extension. It is an Arm hardware unit with a circular buffer that captures the most recent 32 or 64 taken branches. The exact size depends on the hardware implementation. For BOLT, BRBE provides an efficient and low-overhead way to collect profiling data. The hardware records taken branches directly without requiring frequent interrupts or instrumentation. Each recorded taken branch represents a control-flow edge, which makes BRBE an edge-based profiling method. @@ -15,11 +15,11 @@ Taken branches are continuously added to the circular buffer, and the buffer is Recording only taken branches is an efficient use of the buffer, since fall-through paths do not need to be captured at runtime. During post-processing, fall-through edges between the recorded taken branches are reconstructed, extending the effective branch history beyond what is stored in the buffer. BOLT performs this reconstruction automatically. -### When to use BRBE +## When to use BRBE When available, BRBE is the preferred profiling option for BOLT. It is expected to have the lowest runtime overhead while still providing near-optimal profiles, close to those obtained with instrumentation. -### Availability +## Check BRBE availability BRBE is an optional processor feature called **FEAT_BRBE** (Branch Record Buffer Extension), introduced in the [Armv9.1 architecture](https://developer.arm.com/documentation/109697/2025_09/Feature-descriptions/The-Armv9-2-architecture-extension#extension__feat_FEAT_BRBE). To check whether your system supports BRBE, attempt to record a branch profile using `perf`. @@ -46,7 +46,7 @@ Check your kernel version with: ```bash uname -r ``` -### Optimizing with BRBE +## Optimize with BRBE After confirming the availability of BRBE on your system, you can now collect a BRBE profile by running the workload under `perf`. Then convert the collected profile into the format that BOLT expects and run the BOLT optimizer. ```bash { line_numbers=true } @@ -58,5 +58,8 @@ llvm-bolt out/bsort -o out/bsort.opt.brbe --data prof/brbe.fdata \ --dyno-stats ``` -### Further Reading -- [Arm Architecture Reference Manual for A-profile architecture](https://developer.arm.com/documentation/ddi0487/latest) +## What you've learned and what's next + +You've collected a BRBE profile and used it to optimize the binary with BOLT. BRBE provides high-quality control-flow profiles with minimal runtime overhead. + +You can now explore alternative profiling methods (instrumentation, SPE, or PMU) or proceed directly to verify the optimization results. diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/bsort.cpp b/content/learning-paths/servers-and-cloud-computing/bolt-demo/bsort.cpp new file mode 100644 index 0000000000..298c2afd3a --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/bsort.cpp @@ -0,0 +1,113 @@ +#include +#include +#include + +#define ARRAY_LEN 10000 +#define FUNC_COPIES 5 +volatile bool Cond = false; +#define COND() (__builtin_expect(Cond, true)) + +#define NOPS(N) \ + asm volatile( \ + ".rept %0\n" \ + "nop\n" \ + ".endr\n" \ + : : "i"(N) : "memory") + +// Swap functionality plus some cold blocks. +#define SWAP_FUNC(ID) \ + static __attribute__((noinline)) \ + void swap##ID(int *left, int *right) { \ + if (COND()) NOPS(300); \ + int tmp = *left; \ + if (COND()) NOPS(300); else *left = *right; \ + if (COND()) NOPS(300); else *right = tmp; \ + } + +// Aligned at 16KiB +#define COLD_FUNC(ID) \ + static __attribute__((noinline, aligned(16384), used)) \ + void cold_func##ID(void) { \ + asm volatile("nop"); \ + } + +// Create copies of swap, and interleave with big chunks of cold code. +SWAP_FUNC(1) COLD_FUNC(1) +SWAP_FUNC(2) COLD_FUNC(2) +SWAP_FUNC(3) COLD_FUNC(3) +SWAP_FUNC(4) COLD_FUNC(4) +SWAP_FUNC(5) COLD_FUNC(5) + +typedef void (*swap_fty)(int *, int *); +static swap_fty const swap_funcs[FUNC_COPIES] = { + swap1, swap2, swap3, swap4, swap5 +}; + + +/* Sorting Logic */ +void bubble_sort(int *a, int n) { + if (n <= 1) + return; + + int end = n - 1; + int swapped = 1; + unsigned idx = 0; + + while (swapped && end > 0) { + swapped = 0; + // pick a different copy of the swap function, in a round-robin fashion + // and call it. + for (int i = 1; i <= end; ++i) { + if (a[i] < a[i - 1]) { + auto swap_func = swap_funcs[idx++]; + idx %= FUNC_COPIES; + swap_func(&a[i - 1], &a[i]); + swapped = 1; + } + } + --end; + } +} + +void sort_array(int *data) { + for (int i = 0; i < ARRAY_LEN; ++i) { + data[i] = rand(); + } + bubble_sort(data, ARRAY_LEN); +} + +/* Timers, helpers, and main */ +static struct timespec timer_start; +static inline void start_timer(void) { + clock_gettime(CLOCK_MONOTONIC, &timer_start); +} + +static inline void stop_timer(void) { + struct timespec timer_end; + clock_gettime(CLOCK_MONOTONIC, &timer_end); + long long ms = (timer_end.tv_sec - timer_start.tv_sec) * 1000LL + + (timer_end.tv_nsec - timer_start.tv_nsec) / 1000000LL; + printf("%lld ms ", ms); +} + +static void print_first_last(const int *data, int n) { + if (n <= 0) + return; + + const int first = data[0]; + const int last = data[n - 1]; + printf("(first=%d last=%d)\n", first, last); +} + +int main(void) { + srand(0); + printf("Bubble sorting %d elements\n", ARRAY_LEN); + int data[ARRAY_LEN]; + + start_timer(); + sort_array(data); + stop_timer(); + + print_first_last(data, ARRAY_LEN); + return 0; +} diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/good-candidates.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/good-candidates.md index bc3991a13d..3cc13d420b 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/good-candidates.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/good-candidates.md @@ -1,17 +1,17 @@ --- -title: Good BOLT Candidates +title: Identify programs for BOLT optimization weight: 4 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## What make the code a good BOLT candidate? +## What makes a program a good BOLT candidate? Hardware performance metrics can help determine whether a program is a good candidate for code layout optimization with BOLT. Developers often analyze these metrics using methodologies such as the [Arm TopDown methodology](https://developer.arm.com/documentation/109542/02/Arm-Topdown-methodology). -In this tutorial, you will focus on a small set of TopDown indicators related to instruction delivery and code locality. These indicators describe how efficiently the processor fetches instructions and keeps the execution pipeline busy. +You will focus on a small set of TopDown indicators related to instruction delivery and code locality. These indicators describe how efficiently the processor fetches instructions and keeps the execution pipeline busy. -When instruction delivery is inefficient, the workload is refered to as **front-end bound**, meaning the CPU often waits for instructions instead of executing them. +When instruction delivery is inefficient, the workload is referred to as **front-end bound**, meaning the CPU often waits for instructions instead of executing them. This usually points to instruction fetch or code layout issues, where improving code layout can help. The L1 instruction cache (L1 I-cache) is the first and fastest cache used to store instructions close to the CPU. @@ -84,7 +84,8 @@ To compute the **L1I cache MPKI** manually from the `perf stat` output, apply th $$\frac{(\text{L1-icache-misses} \times 1000)}{\text{instructions}}$$ -### Further Reading -- [Arm Topdown methodology]( https://developer.arm.com/documentation/109542/02/Arm-Topdown-methodology) -- [Optimizing Clang : A Practical Example of Applying BOLT](https://github.com/llvm/llvm-project/blob/main/bolt/docs/OptimizingClang.md) -- [Metrics by metric group in Neoverse V2](https://developer.arm.com/documentation/109528/0200/Metrics-by-metric-group-in-Neoverse-V2?lang=en) +## What you've learned and what's next + +You've learned how to evaluate whether a program is a good candidate for BOLT optimization by analyzing frontend stalls and L1I cache MPKI. The example program shows clear signs of poor instruction locality with 55% frontend bound and an L1I MPKI of 60. + +In the following sections, you'll explore different profiling methods to collect the data BOLT needs for optimization, starting with BRBE profiling. diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/instrumentation.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/instrumentation.md index 6043b97cff..030eed809c 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/instrumentation.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/instrumentation.md @@ -1,12 +1,12 @@ --- -title: "BOLT with Instrumentation" +title: Optimize with instrumentation profiling weight: 6 ### FIXED, DO NOT MODIFY layout: learningpathall --- -### What is instrumentation? +## What is instrumentation? Instrumentation is a profiling technique that inserts counters into a program to record how often different parts of the code execute. Unlike sampling-based methods, instrumentation collects exact execution counts. @@ -18,7 +18,7 @@ However, instrumentation increases the size of the binary and adds extra instruc Developers typically use instrumentation when other profiling methods, such as BRBE, are unavailable or when they want to measure the maximum optimization potential of BOLT. -### Optimizing with instrumentation +## Optimize with instrumentation First, generate an instrumented version of the binary. BOLT inserts counters into the program to record how often different code paths execute. Next, run the instrumented program to collect the execution profile. By default, BOLT writes the profile to `/tmp/prof.fdata`. You can specify a different location using the `--instrumentation-file` option. @@ -32,3 +32,9 @@ llvm-bolt out/bsort -o out/bsort.opt.instr --data /tmp/prof.fdata \ --dyno-stats ``` This process produces an optimized binary named out/bsort.opt.instr, which uses the collected execution profile to improve code layout. + +## What you've learned and what's next + +You've used instrumentation to collect a highly accurate execution profile and generated an optimized binary. While instrumentation introduces runtime overhead during profiling, it provides the most precise control-flow information. + +You can explore other profiling methods or proceed to verify how much the optimization improved performance. diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/overview.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/overview.md index 975061a46c..b7d92c2a38 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/overview.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/overview.md @@ -1,29 +1,37 @@ --- -title: Overview +title: Understand BOLT optimization for Arm weight: 2 ### FIXED, DO NOT MODIFY layout: learningpathall --- -### Overview +## Overview -This Learning Path demonstrates how to use [BOLT](https://github.com/llvm/llvm-project/blob/main/bolt/README.md) a post-link binary optimizer from LLVM, to improve the performance of AArch64 applications using profile-guided code layout optimization. -The example used in the Learning Path is based on a demonstration from the 2025 LLVM Developers Conference: -[BOLT tutorial on AArch64 and how it competes or complements other PGOs](https://youtu.be/KdHtOMc5_c8?si=249wZTn_YcTFOjcJ&t=1452). +This Learning Path demonstrates how to use [BOLT](https://github.com/llvm/llvm-project/blob/main/bolt/README.md), a post-link binary optimizer from LLVM, to improve the performance of AArch64 applications using profile-guided code layout optimization. +The example is based on a [BOLT tutorial from the 2025 LLVM Developers Conference](https://youtu.be/KdHtOMc5_c8?si=249wZTn_YcTFOjcJ&t=1452). -The input program is a deliberately inefficient implementation based on [BubbleSort](../setup). This workload exhibits poor instruction locality, making it a useful example for demonstrating how BOLT can improve performance by reorganizing code layout. +The input program is a deliberately inefficient implementation based on BubbleSort (described in the [setup section](/learning-paths/servers-and-cloud-computing/bolt-demo/setup/)). This workload exhibits poor instruction locality, making it a useful example for demonstrating how BOLT can improve performance by reorganizing code layout. -The tutorial first evaluates whether the input binary is a good candidate for code layout optimization. If the program shows signs of poor spatial locality, you will then collect runtime profiles that BOLT can use to guide optimization. -Several profiling methods are supported: -- **[BRBE](../brbe)**: Uses the Arm Branch Record Buffer Extension to sample branch history with low runtime overhead. -- **[Instrumentation](../instrumentation)**: Inserts counters into the binary to record execution frequencies. This produces highly accurate profiles but introduces runtime overhead during profile collection. -- **[SPE](../spe)**: Uses the Arm Statistical Profiling Extension to sample microarchitectural events. BOLT can infer control-flow behavior from these samples, although the resulting profile quality may be lower than BRBE. -- **[PMU](../pmu)**: Uses standard performance monitoring unit events such as instructions or cycles. This method provides the least detailed information about control flow and is typically used when other profiling options are unavailable. +You will first evaluate whether the input binary is a good candidate for code layout optimization. If the program shows signs of poor spatial locality, you will then collect runtime profiles that BOLT can use to guide optimization. -Arm trace extensions such as **ETM** and **ETE** can also generate traces that are usable by BOLT, but these tracing mechanisms are not covered in this tutorial. +BOLT supports several profiling methods, each with different trade-offs: -For each profiling method, you will walk through the process of collecting a profile, converting it into a format usable by BOLT, and applying BOLT to generate an optimized binary. +- [BRBE profiling](/learning-paths/servers-and-cloud-computing/bolt-demo/brbe/) uses the Arm Branch Record Buffer Extension to sample branch history with minimal runtime overhead. When available, this is typically the preferred option. -Finally, you will use hardware performance metrics to evaluate how effective the optimization was. +- [Instrumentation profiling](/learning-paths/servers-and-cloud-computing/bolt-demo/instrumentation/) inserts counters directly into the binary to record execution frequencies. While this produces highly accurate profiles, it introduces runtime overhead during profile collection. + +- For systems without BRBE, [SPE profiling](/learning-paths/servers-and-cloud-computing/bolt-demo/spe/) (Statistical Profiling Extension) samples microarchitectural events. BOLT can infer control-flow behavior from these samples, though the resulting profile quality may be lower than BRBE. + +- Finally, [PMU profiling](/learning-paths/servers-and-cloud-computing/bolt-demo/pmu/) works on any system with standard performance monitoring support. It samples events like instructions or cycles, providing less detailed control-flow information but serving as a reliable fallback when other methods aren't available. + +Arm trace extensions such as ETM and ETE can also generate usable traces, but this Learning Path doesn't cover them. + +For each profiling method, you'll collect a profile, convert it to BOLT's format, and generate an optimized binary. After optimization, you'll measure the performance improvement using hardware metrics. + +## What you've learned and what's next + +You now understand what BOLT is and the four profiling methods available for collecting optimization profiles: BRBE, instrumentation, SPE, and PMU. Each method offers different trade-offs between profiling accuracy and runtime overhead. + +In the next section, you'll set up your environment and compile the example program that demonstrates poor code locality. diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/pmu.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/pmu.md index 456c5f0ded..c7066b995d 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/pmu.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/pmu.md @@ -1,7 +1,5 @@ --- - -title: "BOLT with PMU" - +title: Optimize with PMU profiling weight: 8 ### FIXED, DO NOT MODIFY @@ -10,7 +8,7 @@ layout: learningpathall --- -### What is PMU +## What is PMU? The PMU (Performance Monitoring Unit) is a hardware component that records microarchitectural events during program execution. It supports event-based sampling of events such as instructions, cycles, cache accesses, and branches. Most Arm processors provide a PMU, which makes this profiling method widely available. For BOLT, PMU provides samples that capture coarse hotness information. Samples are associated with instruction addresses and therefore with basic blocks, which are straight-line sequences of instructions that always execute in full once entered. This indicates how often those blocks run, rather than how control flows between them. @@ -18,17 +16,17 @@ For this reason, PMU profiling is often referred to as *basic sampling* rather t Because functions consist of many basic blocks, PMU sampling can provide useful information at the function level. This makes it suitable for coarse-grained optimizations such as function reordering, but can be less effective for fine-grained block layout. Increasing the sampling frequency can improve coverage, but at the cost of higher profile collection overhead. -### When to use PMU +## When to use PMU Use PMU profiling when BRBE and SPE are unavailable and instrumentation is not practical for the workload. -PMU provides the least detailed control-flow information among the profiling methods described in this tutorial. Because it samples instruction addresses rather than control-flow edges, it mainly reveals which parts of the program execute frequently. +PMU provides the least detailed control-flow information among the profiling methods described here. Because it samples instruction addresses rather than control-flow edges, it mainly reveals which parts of the program execute frequently. For this reason, PMU profiling typically serves as a fallback option for BOLT when more informative profiling methods are not available. -### Availability +## Check PMU availability All Arm systems that support the Linux perf tool provide access to PMU events. PMU profiling does not require any additional hardware features beyond standard performance monitoring support. -### Optimizing with PMU +## Optimize with PMU Record a PMU profile by running the workload under `perf`. Then convert the recorded profile into a format that BOLT understands and run the BOLT optimizer. -This tutorial uses instruction sampling, which attributes samples to the instructions that were executing when the sampling event occurred. +The example uses instruction sampling, which attributes samples to the instructions that were executing when the sampling event occurred. The process consists of three steps: * Record a PMU profile using perf * Convert the profile into BOLT’s .fdata format @@ -46,3 +44,8 @@ llvm-bolt out/bsort -o out/bsort.opt.pmu --data prof/pmu.fdata \ The `perf record` command collects samples of the instructions event in user space. The `perf2bolt` tool converts the collected samples into BOLT’s .fdata profile format using the --ba option, which interprets the samples as basic-block counts. Finally, `llvm-bolt` uses the generated profile to reorganize functions and basic blocks in the binary, producing an optimized binary named `out/bsort.opt.pmu`. +## What you've learned and what's next + +You've collected a PMU profile and generated an optimized binary using basic sampling. While PMU provides less detailed control-flow information than BRBE or SPE, it's available on all Arm systems. + +Now you're ready to verify how effective the BOLT optimization was by measuring performance improvements. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/setup.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/setup.md index e64004961e..a652f43636 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/setup.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/setup.md @@ -1,5 +1,5 @@ --- -title: Setup and Input +title: Prepare your environment for BOLT weight: 3 ### FIXED, DO NOT MODIFY @@ -7,126 +7,14 @@ layout: learningpathall --- -### Environment setup -On your AArch64 Linux machine, navigate to your home directory (or another empty working directory) and create a file named `bsort.cpp` with the following content: +## Set up your environment +On your AArch64 Linux machine, navigate to your home directory (or another empty working directory) and download the `bsort.cpp` source file: -```cpp -#include -#include -#include - -#define ARRAY_LEN 10000 -#define FUNC_COPIES 5 -volatile bool Cond = false; -#define COND() (__builtin_expect(Cond, true)) - -#define NOPS(N) \ - asm volatile( \ - ".rept %0\n" \ - "nop\n" \ - ".endr\n" \ - : : "i"(N) : "memory") - -// Swap functionality plus some cold blocks. -#define SWAP_FUNC(ID) \ - static __attribute__((noinline)) \ - void swap##ID(int *left, int *right) { \ - if (COND()) NOPS(300); \ - int tmp = *left; \ - if (COND()) NOPS(300); else *left = *right; \ - if (COND()) NOPS(300); else *right = tmp; \ - } - -// Aligned at 16KiB -#define COLD_FUNC(ID) \ - static __attribute__((noinline, aligned(16384), used)) \ - void cold_func##ID(void) { \ - asm volatile("nop"); \ - } - -// Create copies of swap, and interleave with big chunks of cold code. -SWAP_FUNC(1) COLD_FUNC(1) -SWAP_FUNC(2) COLD_FUNC(2) -SWAP_FUNC(3) COLD_FUNC(3) -SWAP_FUNC(4) COLD_FUNC(4) -SWAP_FUNC(5) COLD_FUNC(5) - -typedef void (*swap_fty)(int *, int *); -static swap_fty const swap_funcs[FUNC_COPIES] = { - swap1, swap2, swap3, swap4, swap5 -}; - - -/* Sorting Logic */ -void bubble_sort(int *a, int n) { - if (n <= 1) - return; - - int end = n - 1; - int swapped = 1; - unsigned idx = 0; - - while (swapped && end > 0) { - swapped = 0; - // pick a different copy of the swap function, in a round-robin fashion - // and call it. - for (int i = 1; i <= end; ++i) { - if (a[i] < a[i - 1]) { - auto swap_func = swap_funcs[idx++]; - idx %= FUNC_COPIES; - swap_func(&a[i - 1], &a[i]); - swapped = 1; - } - } - --end; - } -} - -void sort_array(int *data) { - for (int i = 0; i < ARRAY_LEN; ++i) { - data[i] = rand(); - } - bubble_sort(data, ARRAY_LEN); -} - -/* Timers, helpers, and main */ -static struct timespec timer_start; -static inline void start_timer(void) { - clock_gettime(CLOCK_MONOTONIC, &timer_start); -} - -static inline void stop_timer(void) { - struct timespec timer_end; - clock_gettime(CLOCK_MONOTONIC, &timer_end); - long long ms = (timer_end.tv_sec - timer_start.tv_sec) * 1000LL + - (timer_end.tv_nsec - timer_start.tv_nsec) / 1000000LL; - printf("%lld ms ", ms); -} - -static void print_first_last(const int *data, int n) { - if (n <= 0) - return; - - const int first = data[0]; - const int last = data[n - 1]; - printf("(first=%d last=%d)\n", first, last); -} - -int main(void) { - srand(0); - printf("Bubble sorting %d elements\n", ARRAY_LEN); - int data[ARRAY_LEN]; - - start_timer(); - sort_array(data); - stop_timer(); - - print_first_last(data, ARRAY_LEN); - return 0; -} +```bash +wget https://raw.githubusercontent.com/ArmDeveloperEcosystem/arm-learning-paths/main/content/learning-paths/servers-and-cloud-computing/bolt-demo/bsort.cpp ``` -The [Why Bubble Sort?](#why-bubble-sort) section explains why this tutorial uses BubbleSort as the demonstration workload. +The [Why Bubble Sort?](#why-bubble-sort) section explains why BubbleSort is used as the demonstration workload. Create the following directories to organize generated files from this example: ```bash @@ -136,7 +24,7 @@ mkdir -p out prof heatmap - **prof**: Stores profile data - **heatmap**: Stores heatmap visualizations and related metrics -### Compile the input program {#compile} +## Compile the input program {#compile} Next, compile the input program. Because BOLT and other profile-guided optimization pipelines often involve multiple build stages, you will refer to this initial binary as the **stage-0 binary**. @@ -171,7 +59,7 @@ clang bsort.cpp -o out/bsort -O3 -fuse-ld=lld -ffunction-sections -Wl,--emit-rel {{< /tab >}} {{< /tabpane >}} -### Verify the function order +## Verify the function order Verify that the compiler preserved the intended function order by inspecting the symbols in the `.text` section of the binary. Run the following command: @@ -211,7 +99,7 @@ Run the following command: The output should show the **swap** and **cold** functions interleaved. This layout matches the order in the source file and creates poor instruction locality, which makes the program a good candidate for BOLT optimization. -### Verify the presence of relocations +## Verify the presence of relocations Verify that the binary contains relocation information. BOLT relies on relocation records to safely modify the binary layout after linking. @@ -250,13 +138,13 @@ Check the ELF section table and confirm that relocation sections such as `.rela. Look for relocation sections such as **`.rela.text`** in the output. Their presence confirms that the linker preserved relocation information required by BOLT. -### Why relocations are important {#why-relocations} +## Why relocations are important {#why-relocations} BOLT uses relocation records to update references after it changes the code layout. When BOLT reorders functions or basic blocks, it must update addresses used by instructions such as calls, branches, and references to code or data. Relocation records identify these locations in the binary so that BOLT can safely rewrite them. Without relocations, BOLT cannot reliably adjust these references. As a result, many optimizations become unavailable. For example, BOLT disables function reordering when relocation information is missing, which prevents most code layout optimizations. Because BOLT operates on fully linked binaries, it must modify addresses that the linker already resolved. Relocations preserve the information needed to update those addresses correctly. -### Why Bubble Sort? +## Why Bubble Sort? Bubble Sort is a simple program with all the code in one file. The program has no external dependencies, and runs in a few seconds under instrumentation with a small, fixed workload. In its original form, the program does not benefit much from code layout optimization. To create a more interesting example, instruction locality is intentionally reduced. We introduce **cold code paths** between frequently executed code. These cold blocks separate hot instructions in memory and degrade spatial locality. BOLT later improves performance by reorganizing the binary so that hot code paths appear closer together. @@ -321,3 +209,9 @@ SWAP_FUNC(3) COLD_FUNC(3) SWAP_FUNC(4) COLD_FUNC(4) SWAP_FUNC(5) COLD_FUNC(5) ``` + +## What you've learned and what's next + +You've compiled the BubbleSort example program with intentionally poor code locality and verified that the binary contains the necessary relocation information. The program is now ready for profiling and optimization. + +Next, you'll learn how to identify whether this program is a good candidate for BOLT optimization by analyzing its performance metrics. diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/spe.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/spe.md index 71c033550d..9c8092c9f9 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/spe.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/spe.md @@ -1,7 +1,5 @@ --- - -title: "BOLT with SPE" - +title: Optimize with SPE profiling weight: 7 ### FIXED, DO NOT MODIFY @@ -10,22 +8,22 @@ layout: learningpathall --- -### What is SPE +## What is SPE? SPE (Statistical Profiling Extension) is an Arm hardware profiling unit that collects statistical samples of program execution with very low runtime overhead. SPE periodically samples microarchitectural events such as instruction execution, memory accesses, and branches. The processor records information about the sampled event in a trace buffer, which profiling tools later decode. For BOLT, SPE branch samples are the relevant input as they provide an edge-based control-flow profile. -Unlike [BRBE](../brbe), SPE does not record sequences of taken branches. Instead, each sample describes only a single branch transition between two program locations, representing a single edge in the control-flow graph. Because of this limited context, SPE typically produces less detailed control-flow profiles than BRBE. +Unlike [BRBE profiling](/learning-paths/servers-and-cloud-computing/bolt-demo/brbe/), SPE does not record sequences of taken branches. Instead, each sample describes only a single branch transition between two program locations, representing a single edge in the control-flow graph. Because of this limited context, SPE typically produces less detailed control-flow profiles than BRBE. Some processors also support the Previous Branch Target (PBT) feature. PBT records the target of the most recently taken branch in addition to the sampled edge. This provides a depth-1 branch history, which slightly improves the quality of the reconstructed control-flow profile. Even with PBT, SPE provides less branch history than BRBE, but it remains a useful profiling option when BRBE is not available. -### When to use SPE +## When to use SPE SPE provides less detailed control-flow information than BRBE because it samples individual branch events rather than recording full branch histories. Despite this limitation, SPE can still capture useful branch behavior and guide code layout decisions. Use SPE when BRBE is unavailable or when instrumentation overhead is too high for the workload. In these cases, SPE offers a practical compromise between profiling overhead and profile quality. -### Availability +## Check SPE availability SPE is an optional processor feature called **FEAT_SPE (Statistical Profiling Extension)**, introduced in the [Armv8.1 architecture](https://developer.arm.com/documentation/109697/2025_12/Feature-descriptions/The-Armv8-2-architecture-extension#md447-the-armv82-architecture-extension__feat_FEAT_SPE). To check whether your system supports SPE, attempt to record an SPE trace using `perf`. @@ -60,7 +58,7 @@ Recording SPE traces requires a Linux kernel version 6.14 or later. Check the ke ```bash uname -r ``` -### Optimizing with SPE +## Optimize with SPE Next, collect an SPE profile by running the workload under `perf`. Then convert the recorded trace into a format that BOLT can use and run the BOLT optimizer. The process consists of three steps: * Record an SPE profile using perf @@ -80,5 +78,8 @@ The `perf record` command collects branch samples using the SPE hardware profile The `perf2bolt` tool converts the SPE trace into BOLT’s .fdata profile format, using the --spe option to interpret the samples correctly. Finally, `llvm-bolt` uses the generated profile to reorganize functions and basic blocks in the binary, producing an optimized binary named `out/bsort.opt.spe`. -### Further Reading -- [Arm Statistical Profiling Extension: Performance Analysis Methodology White Paper](https://developer.arm.com/documentation/109429/latest/) +## What you've learned and what's next + +You've collected an SPE profile and used it to optimize the binary with BOLT. SPE provides useful control-flow information when BRBE is unavailable, though it captures less detailed branch history. + +You can explore other profiling methods or move on to verify the optimization results. diff --git a/content/learning-paths/servers-and-cloud-computing/bolt-demo/verify-optimization.md b/content/learning-paths/servers-and-cloud-computing/bolt-demo/verify-optimization.md index bb6b5a7547..9f4ace9e07 100644 --- a/content/learning-paths/servers-and-cloud-computing/bolt-demo/verify-optimization.md +++ b/content/learning-paths/servers-and-cloud-computing/bolt-demo/verify-optimization.md @@ -1,15 +1,15 @@ --- -title: Verify Optimization +title: Verify BOLT optimization results weight: 9 ### FIXED, DO NOT MODIFY layout: learningpathall --- -### Verify with runtime +## Verify optimization with runtime {{% notice Note %}} -The example below uses a [BRBE](../brbe) optimized binary. You can apply the same verification steps to binaries optimized using the other BOLT profiling methods. +The example below uses a [BRBE profiling](/learning-paths/servers-and-cloud-computing/bolt-demo/brbe/) optimized binary. You can apply the same verification steps to binaries optimized using the other BOLT profiling methods. {{% /notice %}} First, compare the runtime of the original and optimized BubbleSort binaries. A shorter runtime provides an initial indication that BOLT improved the code layout. @@ -29,7 +29,7 @@ In this example, the optimized binary runs in about 147 ms, compared with 280 ms The improvement is large because the example program intentionally creates poor code locality. Real applications typically show smaller but still meaningful improvements after BOLT optimization. -### Verify with hardware metrics +## Verify optimization with hardware metrics Next, apply the [TopDown Methodology](https://developer.arm.com/documentation/109542/02/Arm-Topdown-methodology) again to verify that BOLT improved the code layout. The runtime comparison shows the performance impact, but the TopDown metrics reveal how the optimization affects processor behavior. Run the same tool used earlier when evaluating whether the program was a good BOLT candidate. This time, run it on the optimized binary, for example, the BRBE-optimized version. @@ -76,11 +76,11 @@ Compare these metrics with the earlier results collected from the original binar In this example, the optimized program is 36% frontend bound, down from 55%. The L1I cache MPKI drops to nearly 0, which indicates a significant improvement in instruction locality. -This value is unusually low because the tutorial program intentionally creates poor code locality. +This value is unusually low because the example program intentionally creates poor code locality. The Branch MPKI also decreases—from 16 to about 10—because BOLT can improve branch prediction. It uses profile data to adjust code layout and swap fall-through and taken paths when beneficial. -You can also compute the MPKI values manually using `perf stat`, as described in the [Good BOLT Candidates](../good-candidates) section. +You can also compute the MPKI values manually using `perf stat`, as described in the [Good BOLT Candidates](/learning-paths/servers-and-cloud-computing/bolt-demo/good-candidates/) section. ## Summary diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/_index.md b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/_index.md new file mode 100644 index 0000000000..6fcda9c8f7 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/_index.md @@ -0,0 +1,66 @@ +--- +title: Monitor Azure Cobalt 100 Arm64 virtual machines using Dynatrace OneAgent + +draft: true +cascade: + draft: true + +minutes_to_complete: 30 + +who_is_this_for: This learning path is designed for developers, DevOps engineers, and platform engineers who want to implement infrastructure and application monitoring using Dynatrace on Arm-based cloud environments. + +learning_objectives: + - Deploy Dynatrace OneAgent on Azure Cobalt 100 Arm64 virtual machines + - Configure Dynatrace ActiveGate for secure monitoring communication + - Monitor system resources, processes, and services using Dynatrace + - Validate application monitoring using a sample NGINX workload + +prerequisites: + - A [Microsoft Azure account](https://azure.microsoft.com/) with access to Cobalt 100 based instances (Dpsv6) + - Basic knowledge of Linux command-line operations + - Familiarity with SSH and remote server access + - Basic understanding of cloud infrastructure and monitoring concepts + +author: Pareena Verma + +### Tags +skilllevels: Introductory +subjects: Containers and Virtualization +cloud_service_providers: + - Microsoft Azure + +armips: + - Neoverse + +tools_software_languages: + - Dynatrace + - NGINX + - ActiveGate + +operatingsystems: + - Linux + +further_reading: + - resource: + title: Dynatrace Official Website + link: https://www.dynatrace.com + type: website + - resource: + title: Dynatrace OneAgent documentation + link: https://docs.dynatrace.com/docs/observe/infrastructure-monitoring/hosts/installation + type: documentation + - resource: + title: Dynatrace ActiveGate documentation + link: https://docs.dynatrace.com/docs/ingest-from/dynatrace-activegate + type: documentation + - resource: + title: Azure Cobalt 100 processors + link: https://techcommunity.microsoft.com/blog/azurecompute/announcing-the-preview-of-new-azure-vms-based-on-the-azure-cobalt-100-processor/4146353 + type: documentation + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 +layout: "learningpathall" +learning_path_main_page: "yes" +--- diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/_next-steps.md new file mode 100644 index 0000000000..c3db0de5a2 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/activegate-installation.md b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/activegate-installation.md new file mode 100644 index 0000000000..02be2776cf --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/activegate-installation.md @@ -0,0 +1,237 @@ +--- +title: Install Dynatrace ActiveGate on Azure Ubuntu Arm64 virtual machine +weight: 6 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Install Dynatrace ActiveGate on Azure Ubuntu Arm64 + +Dynatrace ActiveGate acts as a **secure gateway between monitored environments and the Dynatrace SaaS platform**. +It improves scalability, enables Kubernetes monitoring, and routes monitoring traffic efficiently. + +In this guide, you'll install Dynatrace ActiveGate on an **Azure Ubuntu 24.04 LTS Arm64 virtual machine running on Azure Cobalt 100 processors**. + +At the end of the installation, ActiveGate will be: + +* Installed and running as a system service +* Listening on port **9999** for Dynatrace communication +* Connected to your Dynatrace SaaS environment +* Verified on **Arm64 (Aarch64)** architecture + +## Verify OneAgent installation + +ActiveGate is commonly installed on a host that already has **Dynatrace OneAgent** installed. +This allows ActiveGate to securely route monitoring traffic from OneAgent to the Dynatrace environment. + +Verify that OneAgent is running: + +```console +sudo systemctl status oneagent +``` + +If OneAgent is not installed, install it first using the previous guide. + +## Log in to Dynatrace + +Open your Dynatrace environment in a browser. + +```text +https://.live.dynatrace.com +``` + +**Example:** + +```text +https://qzo722404.live.dynatrace.com +``` + +This is your Dynatrace SaaS environment URL. + +## Navigate to the ActiveGate deployment page + +From the Dynatrace dashboard: + +- Select Deployment status +- Choose ActiveGate +- Install ActiveGate + +![Dynatrace deployment status page showing no ActiveGate detected alt-txt#center](images/activegate1.png "Dynatrace ActiveGate not yet installed") + +Dynatrace will generate an installation command specifically for your environment. + +## Select ARM architecture + +On the installer configuration page: + +- Platform → Linux +- Architecture → ARM64 + +![Dynatrace Install ActiveGate page showing deployment type Linux and architecture ARM selection alt-txt#center](images/activegate-install.png "Dynatrace ActiveGate installation configuration") + +This ensures that the installer downloads the Arm64-compatible ActiveGate binaries. + +## Copy the ActiveGate installer command + +Dynatrace generates a command similar to the following: + +**Download ActiveGate:** + +```console +wget -O Dynatrace-ActiveGate-Linux-arm.sh \ +"https://.live.dynatrace.com/api/v1/deployment/installer/gateway/unix/latest?arch=arm" \ +--header="Authorization: Api-Token " +``` + +Example: + +```console +wget -O Dynatrace-ActiveGate-Linux-arm.sh \ +"https://qzo72404.live.dynatrace.com/api/v1/deployment/installer/gateway/unix/latest?arch=arm" \ +--header="Authorization: Api-Token DT_API_TOKEN" +``` + +**Verify signature:** + +```console +wget https://ca.dynatrace.com/dt-root.cert.pem ; ( echo 'Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="--SIGNED-INSTALLER"'; echo ; echo ; echo '----SIGNED-INSTALLER' ; cat Dynatrace-ActiveGate-Linux-arm64-1.331.24.20260210-044521.sh ) | openssl cms -verify -CAfile dt-root.cert.pem > /dev/null +``` +![Dynatrace ActiveGate installer command for Linux ARM64 environment alt-txt#center](images/activegate-installation-commands.png "Dynatrace ActiveGate installer command") + +**Install ActiveGate as the privileged user:** + +```console +sudo /bin/bash Dynatrace-ActiveGate-Linux-arm64-1.331.24.20260210-044521.sh +``` + +The installer automatically performs the following tasks: + +- Downloads ActiveGate components +- Installs the ActiveGate service +- Configures communication with Dynatrace SaaS +- Starts the ActiveGate service + +The output is similar to: +```output +2026-03-12 05:59:21 UTC Starting Dynatrace ActiveGate AutoUpdater... +2026-03-12 05:59:21 UTC Checking if Dynatrace ActiveGate AutoUpdater is running ... +2026-03-12 05:59:21 UTC Dynatrace ActiveGate AutoUpdater is running. +2026-03-12 05:59:21 UTC Cleaning autobackup... +2026-03-12 05:59:21 UTC Removing old installation log files... +2026-03-12 05:59:21 UTC +2026-03-12 05:59:21 UTC -------------------------------------------------------------- +2026-03-12 05:59:21 UTC Installation finished successfully. +``` + +## Verify the ActiveGate service + +Check that the ActiveGate service is running. + +```console +sudo systemctl status dynatracegateway +``` + +The output is similar to: +```output +● dynatracegateway.service - Dynatrace ActiveGate service + Loaded: loaded (/etc/systemd/system/dynatracegateway.service; enabled; preset: enabled) + Active: active (running) since Thu 2026-03-12 05:59:07 UTC; 1min 7s ago + Process: 20280 ExecStart=/opt/dynatrace/gateway/dynatracegateway start (code=exited, status=0/SUCCESS) +``` +This confirms that ActiveGate started successfully. + +## Verify the ActiveGate communication port + +ActiveGate communicates using port 9999. + +**Verify that the port is listening:** + +```console +sudo ss -tulnp | grep 9999 +``` + +The output is similar to: +```console +tcp LISTEN 0 50 *:9999 *:* users:(("java",pid=20319,fd=403)) +``` + +This confirms that ActiveGate is accepting incoming connections. + +## Confirm ActiveGate in Dynatrace UI + +Open the Dynatrace web interface and navigate to: + +```text +Deployment Status → ActiveGates +``` + +You should see your ActiveGate instance listed with: + +- Host name +- Version +- Status: Connected + +![Dynatrace Deployment Status page showing ActiveGate instance connected and running alt-txt#center](images/activegate-ui.png "Dynatrace ActiveGate deployment status") + +![Dynatrace ActiveGate details page displaying modules architecture and configuration alt-txt#center](images/activegate-details.png "Dynatrace ActiveGate details view") + +## Test application monitoring with Nginx + +To validate that Dynatrace is collecting monitoring data correctly, deploy a simple web server on the virtual machine. Dynatrace OneAgent will automatically detect and monitor the process. + +### Install Nginx + +Update the package index and install the Nginx web server. + +```console +sudo apt update +sudo apt install -y nginx +``` +## Check the Nginx service status. + +```console +sudo systemctl status nginx +``` + +The output is similar to: + +```output +Active: active (running) +``` + +## Verify process detection in Dynatrace + +Dynatrace OneAgent automatically discovers running processes and services. + +Return to the Dynatrace web interface and navigate to: + +```text +Infrastructure & Operations → Hosts +``` + +Select your monitored host and open: + +```text +Processes +``` + +You should see a process similar to: + +- nginx +- Dynatrace automatically begins collecting metrics such as: +- CPU usage +- memory consumption +- network activity +- request throughput + +![Dynatrace Infrastructure Explorer showing NGINX process monitoring on an ARM64 host alt-txt#center](images/nginx-monitoring.png "Dynatrace NGINX process monitoring dashboard") + +## What you've accomplished + +You've successfully installed Dynatrace ActiveGate on your Azure Ubuntu Arm64 virtual machine. Your environment now includes: + +- Dynatrace OneAgent performing host monitoring +- ActiveGate routing monitors traffic securely +- Communication with Dynatrace SaaS through port 9999 +- Full compatibility with Arm64-based Cobalt 100 processors diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/background.md b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/background.md new file mode 100644 index 0000000000..42f64494e5 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/background.md @@ -0,0 +1,27 @@ +--- +title: "Overview of Azure Cobalt 100 and Dynatrace" + +weight: 2 + +layout: "learningpathall" +--- + +## Azure Cobalt 100 Arm-based processor + +Azure’s Cobalt 100 is Microsoft’s first-generation, in-house Arm-based processor. Built on Arm Neoverse N2, Cobalt 100 is a 64-bit CPU that delivers strong performance and energy efficiency for cloud-native, scale-out Linux workloads such as web and application servers, data analytics, open-source databases, and caching systems. Running at 3.4 GHz, Cobalt 100 allocates a dedicated physical core for each vCPU, which helps ensure consistent and predictable performance. + +To learn more, see the Microsoft blog [Announcing the preview of new Azure VMs based on the Azure Cobalt 100 processor](https://techcommunity.microsoft.com/blog/azurecompute/announcing-the-preview-of-new-azure-vms-based-on-the-azure-cobalt-100-processor/4146353). + +## Dynatrace + +Dynatrace is an AI-powered observability and application performance monitoring (APM) platform used to monitor applications, infrastructure, logs, and user experience across cloud and on-premises environments. Dynatrace provides automatic discovery, full-stack monitoring, and real-time analytics to help teams understand system behavior and quickly identify performance issues. + +Dynatrace automatically maps dependencies between services, hosts, containers, and applications using intelligent automation and topology mapping. The platform uses AI-driven analysis to detect anomalies and identify root causes across complex distributed systems. + +There are three main components of Dynatrace: + +- **Dynatrace OneAgent:** a lightweight monitoring agent installed on hosts that automatically collects metrics, logs, and traces from applications and infrastructure. Learn more in the [Dynatrace OneAgent documentation](https://docs.dynatrace.com/docs/ingest-from/dynatrace-oneagent). + +- **Dynatrace ActiveGate:** a secure gateway component that routes monitoring traffic, enables cloud integrations, and provides additional monitoring capabilities such as Kubernetes monitoring and synthetic monitoring. Learn more in the [Dynatrace ActiveGate documentation](https://docs.dynatrace.com/docs/ingest-from/dynatrace-activegate). + +- **Dynatrace Platform (SaaS or Managed):** the central observability platform that processes monitoring data, provides dashboards, AI-driven root cause analysis, and system-wide visibility across applications and infrastructure. See the [Dynatrace documentation portal](https://docs.dynatrace.com/docs) for more details. diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/firewall.md b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/firewall.md new file mode 100644 index 0000000000..9d4b90aa85 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/firewall.md @@ -0,0 +1,46 @@ +--- +title: Create a firewall rule on Azure +weight: 4 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Configure Azure firewall for Dynatrace ActiveGate + +To allow external traffic on port **9999** for Dynatrace ActiveGate running on an Azure virtual machine, open the port in the Network Security Group (NSG) attached to the virtual machine's network interface or subnet. + +{{% notice Note %}} For more information about Azure setup, see [Getting started with Microsoft Azure Platform](/learning-paths/servers-and-cloud-computing/csp/azure/).{{% /notice %}} + +## Create a firewall rule in Azure + +To expose the TCP port **9999**, create a firewall rule. + +Navigate to the [Azure Portal](https://portal.azure.com), go to **Virtual Machines**, and select your virtual machine. + +![Azure portal Virtual Machines page showing list of running VMs with details like status, location, and size alt-txt#center](images/virtual_machine.png "Virtual Machines") + +In the left menu, select **Networking** and in the **Networking** select **Network settings** that is associated with the virtual machine's network interface. + +![Azure portal Network settings page showing network interface and security group configuration alt-txt#center](images/networking.png "Network settings") + +Navigate to **Create port rule**, and select **Inbound port rule**. + +![Azure portal showing Create port rule dropdown with Inbound port rule option highlighted alt-txt#center](images/port_rule.png "Create rule") + +Configure it using the following details: + +- **Source:** Any +- **Source port ranges:** * +- **Destination:** Any +- **Destination port ranges:** **9999** +- **Protocol:** TCP +- **Action:** Allow +- **Priority:** 1000 +- **Name:** dynatrace-activegate + +After filling in the details, select **Add** to save the rule. + +![Azure portal inbound security rule configuration form showing port 9999, TCP protocol, and Allow action alt-txt#center](images/inbound_rule.png "Network settings") + +The network firewall rule is now created, allowing Dynatrace ActiveGate to communicate over port **9999**. diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-details.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-details.png new file mode 100644 index 0000000000..1be750f92c Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-details.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-install.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-install.png new file mode 100644 index 0000000000..582a28769e Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-install.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-installation-commands.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-installation-commands.png new file mode 100644 index 0000000000..735be13c02 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-installation-commands.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-ui.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-ui.png new file mode 100644 index 0000000000..fc668c5db2 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate-ui.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate1.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate1.png new file mode 100644 index 0000000000..b1c6d7e950 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/activegate1.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-env-id.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-env-id.png new file mode 100644 index 0000000000..61b71f15e5 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-env-id.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-host.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-host.png new file mode 100644 index 0000000000..ffc9701162 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-host.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-process.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-process.png new file mode 100644 index 0000000000..55146e8a41 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/dynatrace-process.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/final-vm.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/final-vm.png new file mode 100644 index 0000000000..5207abfb41 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/final-vm.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/inbound_rule.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/inbound_rule.png new file mode 100644 index 0000000000..405c89a28b Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/inbound_rule.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance.png new file mode 100644 index 0000000000..285cd764a5 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance1.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance1.png new file mode 100644 index 0000000000..b9d22c352d Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance1.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance4.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance4.png new file mode 100644 index 0000000000..2a0ff1e3b0 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/instance4.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/networking.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/networking.png new file mode 100644 index 0000000000..9d6d15f8a3 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/networking.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/nginx-monitoring.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/nginx-monitoring.png new file mode 100644 index 0000000000..cf33bbca69 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/nginx-monitoring.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/onagent-install.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/onagent-install.png new file mode 100644 index 0000000000..55368b2ffe Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/onagent-install.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/oneagent-arch.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/oneagent-arch.png new file mode 100644 index 0000000000..1a031f65a0 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/oneagent-arch.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/oneagent1.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/oneagent1.png new file mode 100644 index 0000000000..241cef9c40 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/oneagent1.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/port_rule.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/port_rule.png new file mode 100644 index 0000000000..681dc71aa1 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/port_rule.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/ubuntu-pro.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/ubuntu-pro.png new file mode 100644 index 0000000000..d54bd75ca6 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/ubuntu-pro.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/virtual_machine.png b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/virtual_machine.png new file mode 100644 index 0000000000..cf6704fcc6 Binary files /dev/null and b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/images/virtual_machine.png differ diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/instance.md b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/instance.md new file mode 100644 index 0000000000..1da75b2837 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/instance.md @@ -0,0 +1,76 @@ +--- +title: Create an Azure Cobalt 100 Arm64 virtual machine +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Prerequisites and setup + +There are several common ways to create an Arm-based Cobalt 100 virtual machine, and you can choose the method that best fits your workflow or requirements: + +- The Azure Portal +- The Azure CLI +- An infrastructure as code (IaC) tool + +In this section, you will launch the Azure Portal to create a virtual machine with the Arm-based Azure Cobalt 100 processor. + +This Learning Path focuses on general-purpose virtual machines in the Dpsv6 series. For more information, see the [Microsoft Azure guide for the Dpsv6 size series](https://learn.microsoft.com/en-us/azure/virtual-machines/sizes/general-purpose/dpsv6-series). + +While the steps to create this instance are included here for convenience, you can also refer to the [Deploy a Cobalt 100 virtual machine on Azure Learning Path](/learning-paths/servers-and-cloud-computing/cobalt/). + +## Create an Arm-based Azure virtual machine + +Creating a virtual machine based on Azure Cobalt 100 is no different to creating any other virtual machine in Azure. To create an Azure virtual machine: + +- Launch the Azure portal and navigate to **Virtual Machines**. +- Select **Create**, and select **Virtual Machine** from the drop-down list. +- Inside the **Basic** tab, fill in the instance details such as **Virtual machine name** and **Region**. +- Select the image for your virtual machine (for example, Ubuntu Pro 24.04 LTS) and select **Arm64** as the VM architecture. +- In the **Size** field, select **See all sizes** and select the D-Series v6 family of virtual machines. +- Select **D4ps_v6** from the list as shown in the diagram below: + +![Azure Portal VM size selection showing the D-Series v6 (Dpsv6) family highlighted with D4ps_v6 option selected for Arm64 architecture alt-txt#center](images/instance.png "Select D4ps_v6 from the D-Series v6 family") + +- For **Authentication type**, select **SSH public key**. + +{{% notice Note %}} +Azure generates an SSH key pair for you and lets you save it for future use. This method is fast, secure, and easy for connecting to your virtual machine. +{{% /notice %}} + +- Fill in the **Administrator username** for your VM. +- Select **Generate new key pair**, and select **RSA SSH Format** as the SSH Key Type. + +{{% notice Note %}} +RSA offers better security with keys longer than 3072 bits. +{{% /notice %}} + +- Give your SSH key a key pair name. +- In the **Inbound port rules**, select **HTTP (80)** and **SSH (22)** as the inbound ports, as shown below: + +![Azure Portal inbound port rules configuration showing HTTP (80) and SSH (22) selected as allowed incoming traffic alt-txt#center](images/instance1.png "Configure inbound port rules for HTTP and SSH access") + +- Now select the **Review + Create** tab and review the configuration for your virtual machine. It should look like the following: + +![Azure Portal Review + Create tab showing VM configuration summary with Ubuntu Pro 24.04 LTS image, D4ps_v6 size, and networking settings configured alt-txt#center](images/ubuntu-pro.png "Review VM configuration before creation") + +- When you are happy with your selection, select the **Create** button and then **Download Private key and Create Resource** button. + +![Azure Portal showing the Create button and Download Private key and Create Resource button to finalize VM creation alt-txt#center](images/instance4.png "Download SSH key and create the virtual machine") + +Your virtual machine should be ready and running in a few minutes. You can SSH into the virtual machine using the private key, along with the public IP details. + +![Azure Portal showing successful VM deployment with green checkmark, VM name, resource group, and public IP address displayed in the confirmation notification alt-txt#center](images/final-vm.png "Successful VM deployment confirmation") + +{{% notice Note %}}To learn more about Arm-based virtual machine in Azure, see “Getting Started with Microsoft Azure” in [Get started with Arm-based cloud instances](/learning-paths/servers-and-cloud-computing/csp/azure).{{% /notice %}} + +## What you've accomplished and what's next + +You've successfully: + +- Created an Azure Cobalt 100 Arm-based virtual machine using the D-Series v6 (Dpsv6) family +- Selected Ubuntu Pro 24.04 LTS as the operating system +- Configured SSH authentication for secure access + +Your Azure Cobalt 100 Arm64 virtual machine is now ready. Next, you'll install Dynatrace OneAgent to begin monitoring the virtual machine and automatically discover running services and processes. diff --git a/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/native-intstallation.md b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/native-intstallation.md new file mode 100644 index 0000000000..a070f5365e --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/dynatrace-azure/native-intstallation.md @@ -0,0 +1,247 @@ +--- +title: Install Dynatrace OneAgent on Azure Ubuntu Arm64 virtual machine +weight: 5 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Install Dynatrace OneAgent on Azure Ubuntu Arm64 + +To install Dynatrace OneAgent on an Azure Ubuntu 24.04 LTS Arm64 virtual machine, follow these steps. + +At the end of the installation, Dynatrace is: + +* Installed and running as a host monitoring agent +* Connected to the Dynatrace SaaS environment +* Monitoring system processes and services automatically +* Verified on Arm64 (aarch64) architecture + +## Update the system and install required tools + +Update the operating system and install the tools required for downloading the Dynatrace installer. + +```console +sudo apt update && sudo apt upgrade -y +sudo apt install -y curl wget unzip ca-certificates +``` + +## Verify Arm64 architecture + +Confirm that the virtual machine is running on the Arm64 architecture. + +```console +uname -m +``` + +output is similar to: +```output +aarch64 +``` +This confirms the system is using the Arm64 architecture required for Cobalt 100 processors. + +## Create your Dynatrace trial environment + +Fill in the required information: + +- First name +- Last name +- Work email address +- Company name +- Country + +After submitting the form, Dynatrace creates a new SaaS monitoring environment for you. + +This process usually takes 1–2 minutes. + +## Access your Dynatrace environment + +After the environment is created, you will receive an email with a link similar to: + +```console +https://.live.dynatrace.com +``` + +**Example:** + +```text +https://qzo72404.live.dynatrace.com +``` +The Environment ID uniquely identifies your Dynatrace tenant and is required for agent installation. + +![Dynatrace environment login page showing the SaaS environment URL alt-txt#center](images/dynatrace-env-id.png "Dynatrace SaaS environment login") + +## Navigate to Deployment + +From the Dynatrace dashboard: + +- Select Deploy Dynatrace +- Choose OneAgent +- Select Linux + +![Dynatrace deployment page showing OneAgent setup options alt-txt#center](images/oneagent1.png "Dynatrace OneAgent deployment setup page") + +This page generates the installation command tailored for your environment. + +## Select ARM Architecture + +In the installer page: + +- Cloud platform → Linux +- Select architecture → ARM64 +- Select monitoring mode: + >Full-stack monitoring + +![Dynatrace installer configuration page showing ARM64 architecture selection alt-txt#center](images/oneagent-arch.png "Dynatrace OneAgent ARM64 architecture selection") + +## Copy OneAgent Installer Command + +Dynatrace generates an installer command that includes your environment ID and API token.: + +```console +wget -O Dynatrace-OneAgent-Linux-arm.sh \ +"https://.live.dynatrace.com/api/v1/deployment/installer/agent/unix/default/latest?arch=arm" \ +--header="Authorization: Api-Token " +``` + +**Example:** + +```text +wget -O Dynatrace-OneAgent-Linux-arm.sh \ +"https://qzo72404.live.dynatrace.com/api/v1/deployment/installer/agent/unix/default/latest?arch=arm" \ +--header="Authorization: Api-Token DT_API_TOKEN" +``` +- The API token allows secure access to the Dynatrace installer. + +Run this command on the virtual machine to download the installer. + +**Verify signature** + +For security, verify the installer signature using Dynatrace’s root certificate. + +```console +wget https://ca.dynatrace.com/dt-root.cert.pem ; ( echo 'Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="--SIGNED-INSTALLER"'; echo ; echo ; echo '----SIGNED-INSTALLER' ; cat Dynatrace-OneAgent-Linux-x86-1.331.49.20260227-104933.sh ) | openssl cms -verify -CAfile dt-root.cert.pem > /dev/null +``` +Run it on the VM. + +![Dynatrace UI displaying the generated OneAgent installer command alt-txt#center](images/onagent-install.png "Dynatrace OneAgent installation command") + +## Install OneAgent as the privileged user + +Run: + +```console +sudo /bin/sh Dynatrace-OneAgent-Linux-x86-1.331.49.20260227-104933.sh --set-monitoring-mode=fullstack --set-app-log-content-access=true +``` + +The output is similar to: +```output +2026-03-12 05:59:21 UTC Starting Dynatrace ActiveGate AutoUpdater... +2026-03-12 05:59:21 UTC Checking if Dynatrace ActiveGate AutoUpdater is running ... +2026-03-12 05:59:21 UTC Dynatrace ActiveGate AutoUpdater is running. +2026-03-12 05:59:21 UTC Cleaning autobackup... +2026-03-12 05:59:21 UTC Removing old installation log files... +2026-03-12 05:59:21 UTC +2026-03-12 05:59:21 UTC -------------------------------------------------------------- +2026-03-12 05:59:21 UTC Installation finished successfully. +``` + +The installer performs several tasks automatically: + +- Downloads monitoring components +- Configures kernel instrumentation +- Installs the OneAgent system service +- Registers the host with your Dynatrace environment + +## Verify OneAgent Service + +Check that the Dynatrace monitoring service is running. + +This confirms the monitoring agent started successfully. +```console +sudo systemctl status oneagent +``` + +The output is similar to: +```output +● dynatracegateway.service - Dynatrace ActiveGate service + Loaded: loaded (/etc/systemd/system/dynatracegateway.service; enabled; preset: enabled) + Active: active (running) since Thu 2026-03-12 05:59:07 UTC; 1min 7s ago + Process: 20280 ExecStart=/opt/dynatrace/gateway/dynatracegateway start (code=exited, status=0/SUCCESS) + Main PID: 20316 (dynatracegatewa) +``` + +This confirms the monitoring agent started successfully. + +## Verify Dynatrace Processes + +This confirms the monitoring agent started successfully. + +```console +ps aux | grep oneagent +``` + +The output is similar to: +```output +dtuser 17754 0.0 0.0 307872 4388 ? Ssl 05:48 0:00 /opt/dynatrace/oneagent/agent/lib64/oneagentwatchdog -bg -config=/opt/dynatrace/oneagent/agent/conf/watchdog.conf +dtuser 17761 0.2 0.3 1183000 59136 ? Sl 05:48 0:06 oneagentos -Dcom.compuware.apm.WatchDogTimeout=900 -watchdog.restart_file_location=/var/lib/dynatrace/oneagent/agent/watchdog/watchdog_restart_file -Dcom.compuware.apm.WatchDogPipe=/var/lib/dynatrace/oneagent/agent/watchdog/oneagentos_pipe_17754 +dtuser 17793 0.0 0.2 689184 34408 ? Sl 05:48 0:01 oneagentloganalytics -Dcom.compuware.apm.WatchDogTimeout=900 -Dcom.compuware.apm.WatchDogPipe=/var/lib/dynatrace/oneagent/agent/watchdog/oneagentloganalytics_pipe_17754 +dtuser 17795 0.1 0.2 361936 42940 ? Sl 05:48 0:04 oneagentnetwork -Dcom.compuware.apm.WatchDogTimeout=900 -Dcom.compuware.apm.WatchDogPipe=/var/lib/dynatrace/oneagent/agent/watchdog/oneagentnetwork_pipe_17754 +dtuser 17883 0.0 0.0 28212 5340 ? Sl 05:49 0:00 /opt/dynatrace/oneagent/agent/lib64/oneagentebpfdiscovery --log-dir /var/log/dynatrace/oneagent/os/ --log-no-stdout --log-level info +azureus+ 23847 0.0 0.0 9988 2772 pts/0 S+ 06:33 0:00 grep --color=auto oneagent +``` + +This confirms the monitoring agent started successfully. + +## Confirm Host Detection in Dynatrace + +Return to the Dynatrace web interface. + +Navigate to: + +```text +Infrastructure & Operations +→ Hosts +``` + +You should see: + +```outout +Host name: +OS: Linux +Architecture: ARM64 +Monitoring mode: Full Stack +``` + +![Dynatrace hosts dashboard showing detected ARM64 virtual machine alt-txt#center](images/dynatrace-host.png "Dynatrace host monitoring dashboard") + +## Check Automatic Process Discovery + +Dynatrace automatically discovers running applications and services. + +View them under: + +```text +Hosts → Processes +``` + +Dynatrace identifies services such as: + +- system processes +- web servers +- databases +- container runtimes + +![Dynatrace process monitoring dashboard showing automatically discovered services alt-txt#center](images/dynatrace-process.png "Dynatrace process discovery view") + +## What you've accomplished and what's next + +You've successfully installed Dynatrace OneAgent on your Azure Ubuntu Arm64 virtual machine. Your installation includes: + +- Dynatrace OneAgent is installed and running as a system service +- Automatic startup enabled through systemd +- Secure connection to the Dynatrace SaaS platform +- Full-stack monitoring of system resources and processes +- Arm64-native monitoring on Azure Cobalt 100 processors + +Next, you'll install Dynatrace ActiveGate to enable additional capabilities such as Kubernetes monitoring, secure data routing, and extension support. diff --git a/themes/arm-design-system-hugo-theme/layouts/partials/general-formatting/metadata-table.html b/themes/arm-design-system-hugo-theme/layouts/partials/general-formatting/metadata-table.html index efaee7650c..3556605f8c 100644 --- a/themes/arm-design-system-hugo-theme/layouts/partials/general-formatting/metadata-table.html +++ b/themes/arm-design-system-hugo-theme/layouts/partials/general-formatting/metadata-table.html @@ -145,6 +145,16 @@

{{$page_h2}}

{{end}} + {{if and (not $is_learning_path) .Params.ecosystem_dashboard}} + + + Ecosystem dashboard: + + + View {{ partial "general-formatting/external-link.html"}} + + + {{end}} @@ -189,6 +199,18 @@

{{$page_h2}}

{{end}} + {{if and (not $is_learning_path) .Params.ecosystem_dashboard}} + + + Ecosystem dashboard: + + + + + View {{ partial "general-formatting/external-link.html"}} + + + {{end}}