Skip to content

Commit

Permalink
pmdalinux: add mem.numa.hugepages metrics (per node, per hugepage size)
Browse files Browse the repository at this point in the history
Resolves Red Hat bug RHEL-45876
  • Loading branch information
natoscott committed Feb 7, 2025
1 parent 413b47f commit bcadaeb
Show file tree
Hide file tree
Showing 13 changed files with 368 additions and 52 deletions.
10 changes: 6 additions & 4 deletions qa/1788
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# PCP QA Test No. 1788
# Exercise Linux kernel hugepage sysfs metrics.
#
# Copyright (c) 2024 Red Hat. All Rights Reserved.
# Copyright (c) 2024-2025 Red Hat. All Rights Reserved.
#

seq=`basename $0`
Expand All @@ -18,16 +18,18 @@ echo "QA output created by $seq"
_cleanup()
{
cd $here
$sudo rm -f $PCP_VAR_DIR/config/pmda/60.43
$sudo rm -f $PCP_VAR_DIR/config/pmda/60.{43,44}
_restore_config $PCP_VAR_DIR/config/pmda/60.43
_restore_config $PCP_VAR_DIR/config/pmda/60.44
$sudo rm -rf $tmp $tmp.*
}

status=1 # failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15

# deterministic output - move aside any existing indom cache
# deterministic output - move aside any existing indom caches
_save_config $PCP_VAR_DIR/config/pmda/60.43
_save_config $PCP_VAR_DIR/config/pmda/60.44

_filter_instances()
{
Expand All @@ -40,7 +42,7 @@ export LINUX_STATSPATH=$root
pmda=$PCP_PMDAS_DIR/linux/pmda_linux.so,linux_init
local="-L -K clear -K add,60,$pmda"

metrics=`pminfo $local mem.hugepages | LC_COLLATE=POSIX sort`
metrics=`pminfo $local mem.hugepages mem.numa.hugepages | LC_COLLATE=POSIX sort`
for tgz in $here/linux/sysfs-hugepages-*.tgz
do
rm -fr $root
Expand Down
88 changes: 88 additions & 0 deletions qa/1788.out
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,18 @@ mem.hugepages.totalsize
inst [N or "32768kB"] value 327680
inst [N or "64kB"] value 6400

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

== done

== Checking hugepages metric values - sysfs-hugepages-002.tgz
Expand Down Expand Up @@ -65,5 +77,81 @@ mem.hugepages.totalsize
inst [N or "1048576kB"] value 104857600
inst [N or "2048kB"] value 4096000

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

== done

== Checking hugepages metric values - sysfs-hugepages-003.tgz

mem.hugepages.free
inst [N or "1048576kB"] value 104857600
inst [N or "2048kB"] value 4096000
inst [N or "32768kB"] value 0
inst [N or "64kB"] value 0

mem.hugepages.overcommit
inst [N or "1048576kB"] value 0
inst [N or "2048kB"] value 0
inst [N or "32768kB"] value 0
inst [N or "64kB"] value 0

mem.hugepages.pagesize
inst [N or "1048576kB"] value 1048576
inst [N or "2048kB"] value 2048
inst [N or "32768kB"] value 32768
inst [N or "64kB"] value 64

mem.hugepages.reserved
inst [N or "1048576kB"] value 0
inst [N or "2048kB"] value 16384
inst [N or "32768kB"] value 0
inst [N or "64kB"] value 0

mem.hugepages.surplus
inst [N or "1048576kB"] value 0
inst [N or "2048kB"] value 8192
inst [N or "32768kB"] value 0
inst [N or "64kB"] value 0

mem.hugepages.totalsize
inst [N or "1048576kB"] value 104857600
inst [N or "2048kB"] value 4096000
inst [N or "32768kB"] value 0
inst [N or "64kB"] value 0

mem.numa.hugepages.free
inst [N or "node0::1048576kB"] value 104857600
inst [N or "node0::2048kB"] value 4096000
inst [N or "node0::32768kB"] value 0
inst [N or "node0::64kB"] value 0

mem.numa.hugepages.pagesize
inst [N or "node0::1048576kB"] value 1048576
inst [N or "node0::2048kB"] value 2048
inst [N or "node0::32768kB"] value 32768
inst [N or "node0::64kB"] value 64

mem.numa.hugepages.surplus
inst [N or "node0::1048576kB"] value 0
inst [N or "node0::2048kB"] value 8192
inst [N or "node0::32768kB"] value 0
inst [N or "node0::64kB"] value 0

mem.numa.hugepages.totalsize
inst [N or "node0::1048576kB"] value 104857600
inst [N or "node0::2048kB"] value 4096000
inst [N or "node0::32768kB"] value 0
inst [N or "node0::64kB"] value 0

== done

84 changes: 84 additions & 0 deletions qa/821.out
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,18 @@ mem.numa.alloc.miss
mem.numa.alloc.other_node
inst [0 or "node0"] value 0

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

mem.numa.max_bandwidth
No value(s) available!

Expand Down Expand Up @@ -2933,6 +2945,18 @@ mem.numa.alloc.other_node
inst [0 or "node0"] value 11838
inst [1 or "node1"] value 53630

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

mem.numa.max_bandwidth
No value(s) available!

Expand Down Expand Up @@ -5738,6 +5762,18 @@ mem.numa.alloc.other_node
inst [0 or "node0"] value 11838
inst [1 or "node1"] value 53630

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

mem.numa.max_bandwidth
No value(s) available!

Expand Down Expand Up @@ -8537,6 +8573,18 @@ mem.numa.alloc.miss
mem.numa.alloc.other_node
inst [0 or "node0"] value 0

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

mem.numa.max_bandwidth
No value(s) available!

Expand Down Expand Up @@ -11073,6 +11121,18 @@ mem.numa.alloc.miss
mem.numa.alloc.other_node
inst [0 or "node0"] value 0

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

mem.numa.max_bandwidth
No value(s) available!

Expand Down Expand Up @@ -13673,6 +13733,18 @@ mem.numa.alloc.miss
mem.numa.alloc.other_node
inst [0 or "node0"] value 0

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

mem.numa.max_bandwidth
No value(s) available!

Expand Down Expand Up @@ -15551,6 +15623,18 @@ mem.numa.alloc.other_node
inst [0 or "node0"] value 847
inst [1 or "node1"] value 492232

mem.numa.hugepages.free
No value(s) available!

mem.numa.hugepages.pagesize
No value(s) available!

mem.numa.hugepages.surplus
No value(s) available!

mem.numa.hugepages.totalsize
No value(s) available!

mem.numa.max_bandwidth
No value(s) available!

Expand Down
Binary file added qa/linux/sysfs-hugepages-003.tgz
Binary file not shown.
7 changes: 6 additions & 1 deletion src/pmdas/linux/help
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# Portions Copyright (c) International Business Machines Corp., 2002
# Portions Copyright (c) 2007-2009 Aconex. All Rights Reserved.
# Portions Copyright (c) 2016-2017 Fujitsu.
# Portions Copyright (c) 2013-2021,2023-2024 Red Hat.
# Portions Copyright (c) 2013-2021,2023-2025 Red Hat.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
Expand Down Expand Up @@ -1041,6 +1041,11 @@ filled up manually after running some bandwidth saturation benchmark tools.
@ mem.numa.util.hugepagesTotalBytes per-node total amount of hugepages memory
@ mem.numa.util.hugepagesFreeBytes per-node amount of free hugepages memory
@ mem.numa.util.hugepagesSurpBytes per-node amount of surplus hugepages memory
@ mem.numa.hugepages.pagesize per-node available huge page sizes
@ mem.numa.hugepages.free per-node huge page space not yet allocated
@ mem.numa.hugepages.surplus per-node huge page space in the pool above total size
@ mem.numa.hugepages.totalsize per-node memory consumed by each huge page size

@ mem.vmstat.nr_dirty number of pages in dirty state
Instantaneous number of pages in dirty state, from /proc/vmstat
@ mem.vmstat.nr_dirty_background_threshold background writeback threshold
Expand Down
2 changes: 2 additions & 0 deletions src/pmdas/linux/linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ enum {
CLUSTER_WWID, /* 92 multipath aggregated stats */
CLUSTER_PRESSURE_IRQ, /* 93 /proc/pressure/irq metrics */
CLUSTER_HUGEPAGES, /* 94 /sys/kernel/mm/hugepages metrics */
CLUSTER_NUMA_HUGEPAGES, /* 95 /sys/devices/system/node/nodeN/hugepages metrics */

NUM_CLUSTERS /* one more than highest numbered cluster */
};
Expand Down Expand Up @@ -197,6 +198,7 @@ enum {
SOFTIRQ_CPU_INDOM, /* 41 - per-CPU soft IRQs */
WWID_INDOM, /* 42 - per-WWID multipath device */
HUGEPAGES_INDOM, /* 43 - hugepages (fixed sizes) */
NUMA_HUGEPAGES_INDOM, /* 44 - NUMA hugepages (fixed sizes) */

NUM_INDOMS /* one more than highest numbered cluster */
};
Expand Down
13 changes: 7 additions & 6 deletions src/pmdas/linux/linux_table.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012 Red Hat.
* Copyright (c) 2012,2025 Red Hat.
* Copyright (c) 2004 Silicon Graphics, Inc. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -46,16 +46,17 @@ linux_table_clone(struct linux_table *table)
{
struct linux_table *ret;
struct linux_table *t;
int len;
size_t len, bytes;

if (!table)
return NULL;
for (len=1, t=table; t->field; t++)
len++;
ret = (struct linux_table *)malloc(len * sizeof(struct linux_table));
bytes = len * sizeof(struct linux_table);
ret = (struct linux_table *)malloc(bytes);
if (!ret)
return NULL;
memcpy(ret, table, len * sizeof(struct linux_table));
memcpy(ret, table, bytes);

/* Initialize the table */
for (t=ret; t && t->field; t++) {
Expand All @@ -75,7 +76,7 @@ linux_table_scan(FILE *fp, struct linux_table *table)
char buf[1024];
int ret = 0;

while(fgets(buf, sizeof(buf), fp) != NULL) {
while (fgets(buf, sizeof(buf), fp) != NULL) {
for (t=table; t && t->field; t++) {
if ((p = strstr(buf, t->field)) != NULL) {
/* first digit after the matched field */
Expand All @@ -95,7 +96,7 @@ linux_table_scan(FILE *fp, struct linux_table *table)

/* calculate current value, accounting for counter wrap */
for (t=table; t && t->field; t++) {
if (t->maxval == 0)
if (t->maxval == 0)
/* instantaneous value */
t->val = t->this;
else {
Expand Down
Loading

0 comments on commit bcadaeb

Please sign in to comment.