{"id":616,"date":"2022-06-20T17:03:33","date_gmt":"2022-06-21T00:03:33","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/?p=616"},"modified":"2022-06-20T17:03:33","modified_gmt":"2022-06-21T00:03:33","slug":"recording-hardware-performance-pmu-events-with-complete-examples","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/recording-hardware-performance-pmu-events-with-complete-examples\/","title":{"rendered":"Recording Hardware Performance (PMU) Events with Complete Examples"},"content":{"rendered":"<p>Performance Monitor Unit (PMU) events are used to measure CPU performance and understand workloads CPU characterization. Windows provides a way to collect PMU events through Event Tracing for Windows (ETW). When combined with other ETW events, we can tell a lot more concrete story about the performance. I recently added \u201c<a href=\"https:\/\/docs.microsoft.com\/en-us\/windows-hardware\/test\/wpt\/recording-pmu-events\">Recording Hardware performance (PMU) Events<\/a>\u201d in docs.microsoft.com site. Using the hardware counter is an advanced subject and I couldn\u2019t add all the specific details. This article is a recap of the documentation with focuses on how to use the perf tools such as WPR and Xperf to use PMU events. I will keep the same order of subjects. It is a good idea to keep the prerequisite document on the side.<\/p>\n<p>Prerequisite reading: <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows-hardware\/test\/wpt\/recording-pmu-events\">Recording Hardware performance (PMU) Events<\/a><\/p>\n<p>First things first, we should clarify the words to be used frequently.<\/p>\n<ul>\n<li>PMU \u2013 Performance Monitoring Unit in CPU<\/li>\n<li>PMU events \u2013 Processor performance events, aka profile sources, not to be confused with Windows ETW events<\/li>\n<li>PMC \u2013 Performance monitoring counter in CPU, which counts PMU events.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-size: 24pt;\">Enumerating PMU events supported in the system<\/span><\/h2>\n<p>First you find PMU events supported on your system with the command <code>wpr \u2013pmcsources<\/code> or<code> xperf -pmcsources<\/code><\/p>\n<p>The output shows available IDs and names of PMU events (aka profile sources), their default and range of intervals, and the logger number(session) that is currently using the events.<\/p>\n<p><div class=\"alert alert-primary\"><p class=\"alert-divider\"><i class=\"fabric-icon fabric-icon--Info\"><\/i><strong>Logger column<\/strong><\/p>The logger number will show up only if a session is collecting PMU events on ETW events and OS is Windows 11 22453 or later.<\/div><\/p>\n<p><img decoding=\"async\" width=\"560\" height=\"373\" class=\"wp-image-617\" src=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/wpr-pmcsources-command.png\" alt=\"wpr pmcsources command\" srcset=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/wpr-pmcsources-command.png 560w, https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/wpr-pmcsources-command-300x200.png 300w\" sizes=\"(max-width: 560px) 100vw, 560px\" \/><\/p>\n<p>Also, pmcsession command shows the session information that use PMU events on ETW events. The same command exists for Xperf.exe. The command shows mostly redundant information as <code>pmcsources<\/code> except \u2018Hook Ids\u2019.<\/p>\n<p><img decoding=\"async\" width=\"330\" height=\"102\" class=\"wp-image-618\" src=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/wpr-pmcsessions-command.png\" alt=\"wpr pmcsessions command\" srcset=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/wpr-pmcsessions-command.png 330w, https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/wpr-pmcsessions-command-300x93.png 300w\" sizes=\"(max-width: 330px) 100vw, 330px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h3>PMU events are for one session only!<\/h3>\n<p>The logger number in the command ouput is useful to check whether anyone else is using the PMU event. If another session is using the PMU event, the slot is taken, and you will not get the PMU events in your session. In the picture above, the session with logger number 32 is using TotalCycles and InstructionRetired. If you start a trace making use of those PMU events, you won\u2019t find those PMU events in your trace. To make sure PMU events are going to make to your session, it is helpful to set <strong>Strict=\u201dtrue\u201d<\/strong> in the &lt;HardwareCounter&gt; in the custom profile or <strong>-strict<\/strong> option in Xperf to simply fail to start trace. WPR returns the error 0x800700aa if any PMU events are already in use.<\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-619\" src=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/example-failure-when-stricttrue.png\" alt=\"800700aa error when Strict=&quot;true&quot; \" width=\"340\" height=\"113\" srcset=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/example-failure-when-stricttrue.png 340w, https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-content\/uploads\/sites\/64\/2022\/06\/example-failure-when-stricttrue-300x100.png 300w\" sizes=\"(max-width: 340px) 100vw, 340px\" \/><\/p>\n<p>If PMU event resource is already in use, you will have to stop session #32 first. Refer to the previous posts if you need help on how to <a href=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/controlling-the-event-session-name-with-the-instance-name\/#checking-the-running-trace-sessions\">enumerate sessions<\/a> and <a href=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wpr-fails-to-start-insufficient-system-resources\/#stopping-sessions\">stop a session<\/a>.<\/p>\n<p>One more thing to consider is that the pmcsources command output only shows the logger number that is collecting PMU events on ETW events. If a session was collecting PMU events on sampling basis, <code>wpr -pmcsources<\/code> wouldn\u2019t show the logger number. In that case, you will have to find if any system sessions are using &#8220;pmc_profile&#8221; keyword as the keyword is used to sample on PMU events by <a href=\"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/controlling-the-event-session-name-with-the-instance-name\/#checking-the-running-trace-sessions\">enumerating sessions<\/a> using xperf.<\/p>\n<h2><span style=\"font-size: 24pt;\">Collecting PMU Events<\/span><\/h2>\n<p>CPUs have multiple Performance Monitoring Counters (PMCs) that can count PMU events. ETW (Event Tracing for Windows) provides ways to collect those counter values. You can either collect PMU events whenever certain kernel events fire or on sampling basis, that is whenever a PMC interrupt fires due to the counter overflow.<\/p>\n<p>Depending on the platform, the number of counters is different and the counter to the PMU event may not be a 1 to 1 mapping. Also, many PMU events can only be mapped to a subset of the counters. We\u2019ve not implemented support for that constraint either by allowing explicit mapping or allowing the constraint to be described in the configuration data and finding if there\u2019s an available mapping yet.<\/p>\n<h3>Collecting PMU Events on ETW Events &#8211; Example WPRP profile<\/h3>\n<p>Below is the custom profile that logs TotalCycles and InstructionRetired counter values on CSwitch events. You can add more ETW events up to four but consider a pair of them that are start\/stop to make the trace more useful. CSwitch is such an event that is both a beginning and end since we are ending execution of one thread and beginning another.<\/p>\n<p>To start and stop trace use <code>wpr -start profilename.wprp <strong>-filemode<\/strong><\/code> and <code>wpr -stop filename.etl<\/code>.<\/p>\n<pre class=\"prettyprint\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;WindowsPerformanceRecorder Version=\"1.0\"&gt;\r\n&lt;Profiles&gt;\r\n    &lt;SystemCollector Id=\"SystemCollector_PMC\" Base=\"\" Name=\"WPRSystemCollector\"&gt;\r\n      &lt;BufferSize Value=\"1024\" \/&gt; &lt;!-- PMU events can be verbose. --&gt;\r\n      &lt;Buffers Value=\"256\" \/&gt;\r\n    &lt;\/SystemCollector&gt;\r\n\r\n    &lt;SystemProvider Id=\"SystemProvider_ProcThreadForEventCounters\"&gt;\r\n      &lt;Keywords&gt;\r\n        &lt;Keyword Value=\"Loader\"\/&gt;\r\n        &lt;Keyword Value=\"ProcessThread\"\/&gt;\r\n        &lt;Keyword Value=\"CSwitch\"\/&gt; &lt;!--Need to turn on CSwitch system keyword to trace CSwitch event in HardwareCounter --&gt;\r\n      &lt;\/Keywords&gt;\r\n    &lt;\/SystemProvider&gt;\r\n \r\n    &lt;HardwareCounter Id=\"HardwareCounters_EventCounters\" Strict=\u201dtrue\u201d&gt; &lt;!-- Optional Strict attribute to hard fail of any issues --&gt;\r\n      &lt;Counters&gt;\r\n        &lt;Counter Value=\"TotalCycles\"\/&gt; &lt;!-- beware the event is not used by another session. Only one session can use the event --&gt; \r\n        &lt;Counter Value=\"InstructionRetired\" \/&gt;\r\n       &lt;\/Counters&gt;\r\n      &lt;Events&gt;\r\n        &lt;Event Value=\"CSwitch\"\/&gt; &lt;!-- Counter values are logged on this event. Turn on appropriate keyword in SystemProvider --&gt;\r\n      &lt;\/Events&gt;\r\n    &lt;\/HardwareCounter&gt;\r\n\r\n    &lt;!--Profile to capture the counters with ETW events --&gt;\r\n    &lt;Profile Id=\"PMCE.Verbose.File\" LoggingMode=\"File\" Name=\"PMCE\" DetailLevel=\"Verbose\" Description=\"PMC Test\"&gt;\r\n        &lt;Collectors Operation=\"Add\"&gt;\r\n            &lt;SystemCollectorId Value=\"SystemCollector_PMC\"&gt;\r\n                &lt;SystemProviderId Value=\"SystemProvider_ProcThreadForEventCounters\"&gt;&lt;\/SystemProviderId&gt;\r\n                &lt;HardwareCounterId Value=\"HardwareCounters_EventCounters\"&gt;&lt;\/HardwareCounterId&gt;\r\n            &lt;\/SystemCollectorId&gt;\r\n        &lt;\/Collectors&gt;\r\n    &lt;\/Profile&gt;\t\r\n&lt;\/Profiles&gt;\r\n&lt;\/WindowsPerformanceRecorder&gt;<\/pre>\n<p>&nbsp;<\/p>\n<h3>Sampling on PMC Overflow &#8211; Example WPRP Profile<\/h3>\n<p>Below is the custom profile to sample PMCs in their frequency.<\/p>\n<pre class=\"prettyprint\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;WindowsPerformanceRecorder Version=\"1.0\"&gt;\r\n&lt;Profiles&gt;\r\n    &lt;SystemCollector Id=\"SystemCollector_PMC\" Base=\"\" Name=\"WPRSystemCollector\"&gt;\r\n      &lt;BufferSize Value=\"1024\" \/&gt; &lt;!-- PMU events can be verbose. --&gt;\r\n      &lt;Buffers Value=\"256\" \/&gt;\r\n    &lt;\/SystemCollector&gt;\r\n    &lt;SystemProvider Id=\"SystemProvider_ProcThreadForSamplingCounters\" Base=\"\"&gt;\r\n      &lt;Keywords&gt;\r\n        &lt;Keyword Value=\"Loader\"\/&gt;\r\n        &lt;Keyword Value=\"ProcessThread\"\/&gt;\r\n        &lt;Keyword Value=\"PmcProfile\" \/&gt; &lt;!-- required for sampling counters--&gt;\r\n      &lt;\/Keywords&gt;\r\n    &lt;\/SystemProvider&gt;\r\n    &lt;HardwareCounter Id=\"HardwareCounters_SamplingCounters\" Strict=\"true\"&gt; &lt;!-- Optional Strict attribute to hard fail of any issues --&gt;\r\n        &lt;SampledCounters&gt;\r\n          &lt;SampledCounter Value=\"CacheMisses\" \/&gt; &lt;!-- sampling(periodic) counters using the default interval--&gt;\r\n          &lt;SampledCounter Value=\"BranchMispredictions\" Interval=\"100000\"\/&gt;  &lt;!-- interval is number of events --&gt;\r\n        &lt;\/SampledCounters&gt;\r\n    &lt;\/HardwareCounter&gt;\r\n    &lt;!-- Profile to capture the counters on PMC overflow aka. rollover --&gt;\r\n    &lt;Profile Id=\"PMC.Verbose.File\" Base=\"\" LoggingMode=\"File\" Name=\"PMC\" DetailLevel=\"Verbose\" Description=\"PMC Test\"&gt;\r\n        &lt;Collectors Operation=\"Add\"&gt;\r\n            &lt;SystemCollectorId Value=\"SystemCollector_PMC\"&gt;\r\n                &lt;SystemProviderId Value=\"SystemProvider_ProcThreadForSamplingCounters\"&gt;&lt;\/SystemProviderId&gt;\r\n                &lt;HardwareCounterId Value=\"HardwareCounters_SamplingCounters\"&gt;&lt;\/HardwareCounterId&gt;\r\n            &lt;\/SystemCollectorId&gt;\r\n        &lt;\/Collectors&gt;\r\n    &lt;\/Profile&gt;\r\n&lt;\/Profiles&gt;\r\n&lt;\/WindowsPerformanceRecorder&gt;<\/pre>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-size: 24pt;\">Configuring Extended PMU Counter Configurations<\/span><\/h2>\n<h3>Configuration using WPRP Custom Profile<\/h3>\n<p>The example below shows how to define such counters in the custom profile. Unlike the registration using the registry, this registration will not persist after the system reboot unless you set Persist=\u201dtrue\u201d.<\/p>\n<pre class=\"prettyprint\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;WindowsPerformanceRecorder Version=\"1.0\"&gt;\r\n&lt;Profiles&gt;\r\n    &lt;SystemCollector Id=\"SystemCollector_PMC\" Name=\"WPRSystemCollector\"&gt;\r\n      &lt;BufferSize Value=\"1024\" \/&gt; &lt;!-- PMU events can be verbose. --&gt;\r\n      &lt;Buffers Value=\"256\" \/&gt;\r\n    &lt;\/SystemCollector&gt;\r\n    &lt;SystemProvider Id=\"SystemProvider_ProcThreadForSamplingCounters\"&gt;\r\n      &lt;Keywords&gt;\r\n        &lt;Keyword Value=\"Loader\"\/&gt;\r\n        &lt;Keyword Value=\"ProcessThread\"\/&gt;\r\n        &lt;Keyword Value=\"PmcProfile\" \/&gt; &lt;!-- required for sampling counters--&gt;\r\n      &lt;\/Keywords&gt;\r\n    &lt;\/SystemProvider&gt;\r\n\r\n   &lt;MicroArchitecturalConfig Id=\"CounterConfig_Mine\"&gt; &lt;!-- Optional Strict attribute to hard fail of any issues --&gt;\r\n      &lt;ProfileSources Architecture=\"AMD\" Family=\"6\" Model=\"158\" Stepping=\"10\"&gt; &lt;!-- The values are examples only !--&gt;\r\n         &lt;ProfileSource Name=\"UOPS_ISSUED.ANY\" Event=\"0xE\" Unit=\"0x01\" Interval=\"0x02000003\" AllowsHalt=\"false\" Persist=\"false\"\/&gt;\r\n         &lt;ProfileSource Name=\"DTLB_LOAD_MISSES.WALK_COMPLETED_4K\" Event=\"0x8\" Unit=\"0x02\" Interval=\"0x02000003\" AllowsHalt=\"false\" Persist=\"false\"\/&gt;\r\n         &lt;ProfileSource Name=\"L1D_PEND_MISS.PENDING_CYCLES_ANY\" Event=\"0x48\" Unit=\"0x01\" Interval=\"0x02000003\" ExtendedBits=\"01000100\"\/&gt;\r\n      &lt;\/ProfileSources&gt;\r\n    &lt;\/MicroArchitecturalConfig&gt;\r\n\r\n    &lt;HardwareCounter Id=\"HardwareCounters_MyCounters\"&gt;\r\n        &lt;MicroArchitecturalConfigId Value=\"CounterConfig_Mine\"&gt;&lt;\/MicroArchitecturalConfigId&gt;\r\n        &lt;SampledCounters&gt;\r\n          &lt;SampledCounter Value=\"UOPS_ISSUED.ANY\" Interval=\"2147483647\"\/&gt;\r\n          &lt;SampledCounter Value=\"DTLB_LOAD_MISSES.WALK_COMPLETED_4K\" Interval=\"2147483647\"\/&gt;\r\n          &lt;SampledCounter Value=\"L1D_PEND_MISS.PENDING_CYCLES_ANY\" Interval=\"2147483647\"\/&gt;\r\n        &lt;\/SampledCounters&gt;\r\n    &lt;\/HardwareCounter&gt;\r\n\r\n    &lt;Profile Id=\"PMCExtended.Verbose.File\" LoggingMode=\"File\" Name=\"PMCExtended\" DetailLevel=\"Verbose\" Description=\"PMC Test\"&gt;\r\n        &lt;Collectors Operation=\"Add\"&gt;\r\n            &lt;SystemCollectorId Value=\"SystemCollector_PMC\"&gt;\r\n                &lt;SystemProviderId Value=\"SystemProvider_ProcThreadForSamplingCounters\"&gt;&lt;\/SystemProviderId&gt;\r\n                &lt;HardwareCounterId Value=\"HardwareCounters_MyCounters\"&gt;&lt;\/HardwareCounterId&gt;\r\n            &lt;\/SystemCollectorId&gt;\r\n        &lt;\/Collectors&gt;\r\n    &lt;\/Profile&gt;\r\n&lt;\/Profiles&gt;\r\n&lt;\/WindowsPerformanceRecorder&gt;<\/pre>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-size: 24pt;\">Further Reading<\/span><\/h2>\n<p>Each of the CPU vendors such as ARM, Intel, and AMD have detailed technical reference manual for the available PMU events on their platform. These are a couple starters.<\/p>\n<ul>\n<li>For ARM, see the Performance Monitor Unit sections under the specific processor being used. <a href=\"https:\/\/nam06.safelinks.protection.outlook.com\/?url=https%3A%2F%2Fdeveloper.arm.com%2Fdocumentation&amp;data=05%7C01%7Csowoonp%40microsoft.com%7Cf2e1df36d8d4417e626908da4f13dd34%7C72f988bf86f141af91ab2d7cd011db47%7C0%7C0%7C637909243994720822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=d964jlMm6TLlIFmsjsEJT6eyG9znIGu%2FtOqSsIp70lk%3D&amp;reserved=0\">Documentation \u2013 Arm Developer<\/a><\/li>\n<li>For Intel, see the Performance Monitor Unit section in Volume 3B of the\u00a0<a href=\"https:\/\/nam06.safelinks.protection.outlook.com\/?url=https%3A%2F%2Fwww.intel.com%2Fcontent%2Fwww%2Fus%2Fen%2Farchitecture-and-technology%2F64-ia-32-architectures-software-developer-manual-325462.html%3Fwapkw%3Dsdm%2B3b&amp;data=05%7C01%7Csowoonp%40microsoft.com%7Cf2e1df36d8d4417e626908da4f13dd34%7C72f988bf86f141af91ab2d7cd011db47%7C0%7C0%7C637909243994877059%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=Al9hXr75rrHQxc2HQVrPj%2BEGM8IM08QhIPxnKUUBfq0%3D&amp;reserved=0\" target=\"_blank\" rel=\"noopener\">Intel 64 and IA-32 Architectures Developer&#8217;s Manual<\/a>\u00a0and the downloadable JSON counter descriptions for individual architectures are available on\u00a0<a href=\"https:\/\/nam06.safelinks.protection.outlook.com\/?url=https%3A%2F%2Fdownload.01.org%2Fperfmon&amp;data=05%7C01%7Csowoonp%40microsoft.com%7Cf2e1df36d8d4417e626908da4f13dd34%7C72f988bf86f141af91ab2d7cd011db47%7C0%7C0%7C637909243994877059%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;sdata=s0Cm1m1nZ%2BMAgRB6EiyA7aYr2IYAhyc8AsI%2Fg8zUDmI%3D&amp;reserved=0\" target=\"_blank\" rel=\"noopener\">https:\/\/download.01.org\/perfmon<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Performance Monitor Unit (PMU) events are used to measure CPU performance and understand workloads CPU characterization. Windows provides a way to collect PMU events through Event Tracing for Windows (ETW). When combined with other ETW events, we can tell a lot more concrete story about the performance. I recently added \u201cRecording Hardware performance (PMU) Events\u201d [&hellip;]<\/p>\n","protected":false},"author":39815,"featured_media":77,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1,3],"tags":[49,46,47,5,48],"class_list":["post-616","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-performance-diagnostics","category-windows-performance-recorder","tag-hardware-counter","tag-pmc","tag-pmu","tag-wpr","tag-xperf"],"acf":[],"blog_post_summary":"<p>Performance Monitor Unit (PMU) events are used to measure CPU performance and understand workloads CPU characterization. Windows provides a way to collect PMU events through Event Tracing for Windows (ETW). When combined with other ETW events, we can tell a lot more concrete story about the performance. I recently added \u201cRecording Hardware performance (PMU) Events\u201d [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/posts\/616","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/users\/39815"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/comments?post=616"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/posts\/616\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/media\/77"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/media?parent=616"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/categories?post=616"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/performance-diagnostics\/wp-json\/wp\/v2\/tags?post=616"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}