From 125c561ef6908a3524583f36a115ba98fa8d38c0 Mon Sep 17 00:00:00 2001 From: Kieran Hejmadi Date: Thu, 16 Apr 2026 12:10:54 +0100 Subject: [PATCH 1/4] initial commit --- .../spe-on-performix/_index.md | 69 +++++++++ .../spe-on-performix/_next-steps.md | 8 + .../spe-on-performix/enabled_support.png | Bin 0 -> 125459 bytes .../spe-on-performix/grub_config_change.png | Bin 0 -> 67789 bytes .../spe-on-performix/how-to-1.md | 51 +++++++ .../spe-on-performix/how-to-2.md | 142 ++++++++++++++++++ .../spe-on-performix/how-to-3.md | 129 ++++++++++++++++ .../spe-on-performix/how-to-4.md | 98 ++++++++++++ .../spe-on-performix/kernel-configuration.jpg | Bin 0 -> 140561 bytes .../spe-on-performix/memory-access-no-spe.png | Bin 0 -> 61391 bytes .../memory-access-passing.png | Bin 0 -> 21571 bytes 11 files changed, 497 insertions(+) create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/_index.md create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/_next-steps.md create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/enabled_support.png create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/grub_config_change.png create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/how-to-1.md create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/how-to-2.md create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/how-to-3.md create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/how-to-4.md create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/kernel-configuration.jpg create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/memory-access-no-spe.png create mode 100644 content/learning-paths/servers-and-cloud-computing/spe-on-performix/memory-access-passing.png diff --git a/content/learning-paths/servers-and-cloud-computing/spe-on-performix/_index.md b/content/learning-paths/servers-and-cloud-computing/spe-on-performix/_index.md new file mode 100644 index 0000000000..da58ebf926 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/spe-on-performix/_index.md @@ -0,0 +1,69 @@ +--- +title: Enable Arm SPE for Performix memory access analysis + +description: Learn how to verify and enable Arm Statistical Profiling Extension (SPE) on Arm Linux machines, including systems hosted through cloud service providers, so the Memory Access recipe in Arm Performix can run on supported environments. + +minutes_to_complete: 30 + +who_is_this_for: This is an introductory topic for software developers and performance engineers who want to prepare Arm Linux machines, including cloud-hosted systems, for Arm Performix memory access profiling. + +learning_objectives: + - Check whether Arm SPE is already available on an Arm Linux system using Sysreport and kernel-level checks. + - Explain the hardware, platform, and kernel requirements that allow Linux to expose the `arm_spe_pmu` driver. + - Apply Linux-side changes such as loading the SPE PMU module, installing matching kernel modules, or selecting a kernel with SPE support. + - Identify when a cloud instance does not expose SPE to the guest OS and choose a suitable system for Arm Performix memory access analysis. + +prerequisites: + - Access to a Linux-based Arm system, such as an Arm cloud instance or bare-metal server, with `sudo` or root access. + - Access to Arm Performix on your host machine and SSH access to the target system. See the [Arm Performix install guide](/install-guides/performix/) for setup instructions. + - Familiarity with the Linux command line, SSH, and basic kernel module management. + +author: Kieran Hejmadi + +### Tags +skilllevels: Introductory +subjects: Performance and Architecture +cloud_service_providers: + - AWS + - Google Cloud + - Microsoft Azure +armips: + - Neoverse +tools_software_languages: + - Arm Performix + - Sysreport + - Linux kernel + - perf +operatingsystems: + - Linux + +further_reading: + - resource: + title: Arm Performix install guide + link: https://learn.arm.com/install-guides/performix/ + type: documentation + - resource: + title: Arm Statistical Profiling Extension documentation + link: https://developer.arm.com/documentation/100616/0301/debug-descriptions/statistical-profiling-extension + type: documentation + - resource: + title: Arm Performix + link: https://developer.arm.com/servers-and-cloud-computing/arm-performix + type: website + - resource: + title: Get ready for performance analysis with Sysreport + link: https://learn.arm.com/learning-paths/servers-and-cloud-computing/sysreport/ + type: documentation + - resource: + title: Analyze cache behavior with Perf C2C on Arm + link: https://learn.arm.com/learning-paths/servers-and-cloud-computing/false-sharing-arm-spe/ + type: learning-path + + + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/spe-on-performix/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/spe-on-performix/_next-steps.md new file mode 100644 index 0000000000..727b395ddd --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/spe-on-performix/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # The weight controls the order of the pages. _index.md always has weight 1. +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/spe-on-performix/enabled_support.png b/content/learning-paths/servers-and-cloud-computing/spe-on-performix/enabled_support.png new file mode 100644 index 0000000000000000000000000000000000000000..cfbd7eb63e4aed572dff214d688e05354cd8a10e GIT binary patch literal 125459 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