2020-02-17 08:49:11

by Tobin C. Harding

[permalink] [raw]
Subject: [PATCH 0/2] slabinfo: parse all NUMA attributes

Hi Christoph,

I found a few files in /sys/kernel/slab/foo/ that contain NUMA info that
is not currently being parsed by `slabinfo.c`. I do not know whether
this is intentional or not? Since I did not know this I just printed
the info in the NUMA report section like is done for the per node slabs
and partial slabs info.

Just for your interest; I found these while re-writing slabinfo in Rust,
thanks to the type-system. I guess that if they were unintentionally
missed then this is a small win, if they were intentionally missed then
this series is just noise :)

Patch one is a one line whitespace fix.

To test I comment out the code that inhibits NUMA output for single node
machines and then the output looks like this (relevant bit at the bottom)

$ sudo slabinfo kmem_cache_node
Slabcache: kmem_cache_node Aliases: 0 Order : 0 Objects: 1877
** Hardware cacheline aligned

Sizes (bytes) Slabs Debug Memory
------------------------------------------------------------------------
Object : 64 Total : 34 Sanity Checks : Off Total: 139264
SlabObj: 64 Full : 15 Redzoning : Off Used : 120128
SlabSiz: 4096 Partial: 17 Poisoning : Off Loss : 19136
Loss : 0 CpuSlab: 2 Tracking : Off Lalig: 0
Align : 64 Objects: 64 Tracing : Off Lpadd: 0

kmem_cache_node has no kmem_cache operations

kmem_cache_node: Kernel object allocation
-----------------------------------------------------------------------
No Data

kmem_cache_node: Kernel object freeing
------------------------------------------------------------------------
No Data

NUMA nodes : 0
---------------------------
All slabs 34
Partial slabs 17
CPU slabs 2
Objects 1.8K
Partial objects 789
Total objects 2.1K

Tobin C. Harding (2):
tools: vm: slabinfo: Replace tabs with spaces
tools: vm: slabinfo: Add numa information for objects

tools/vm/slabinfo.c | 69 +++++++++++++++++++++++++++++++++++++++++----
1 file changed, 63 insertions(+), 6 deletions(-)

--
2.17.1


2020-02-17 08:49:18

by Tobin C. Harding

[permalink] [raw]
Subject: [PATCH 1/2] tools: vm: slabinfo: Replace tabs with spaces

We have some rouge tabs within the output string of `slabinfo -h` causing the
description output of the `--partial` option to be incorrectly aligned when
printed.

Replace the tabs with spaces, correctly aligning all option description
strings.

Signed-off-by: Tobin C. Harding <[email protected]>
---
tools/vm/slabinfo.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/vm/slabinfo.c b/tools/vm/slabinfo.c
index 68092d15e12b..29f8ecb59cf6 100644
--- a/tools/vm/slabinfo.c
+++ b/tools/vm/slabinfo.c
@@ -125,7 +125,7 @@ static void usage(void)
"-n|--numa Show NUMA information\n"
"-N|--lines=K Show the first K slabs\n"
"-o|--ops Show kmem_cache_ops\n"
- "-P|--partial Sort by number of partial slabs\n"
+ "-P|--partial Sort by number of partial slabs\n"
"-r|--report Detailed report on single slabs\n"
"-s|--shrink Shrink slabs\n"
"-S|--Size Sort by size\n"
--
2.17.1

2020-02-17 08:50:05

by Tobin C. Harding

[permalink] [raw]
Subject: [PATCH 2/2] tools: vm: slabinfo: Add numa information for objects

Currently we are not handling NUMA information for a bunch of slab
attribute files, files of form `170 N0=170 ...`. These are

objects
objects_partial
total_objects
cpu_slabs

For other attribute files, namely `partial` and `slabs`, we do handle
the NUMA information.

Add a field to the slabinfo struct for the NUMA information and
output it during a NUMA report as is done for `slabs` and `partial`.

reference: /sys/kernel/slab/kmeme_cache_node/

Signed-off-by: Tobin C. Harding <[email protected]>
---
tools/vm/slabinfo.c | 67 +++++++++++++++++++++++++++++++++++++++++----
1 file changed, 62 insertions(+), 5 deletions(-)

diff --git a/tools/vm/slabinfo.c b/tools/vm/slabinfo.c
index 29f8ecb59cf6..65254c051da2 100644
--- a/tools/vm/slabinfo.c
+++ b/tools/vm/slabinfo.c
@@ -46,6 +46,10 @@ struct slabinfo {
unsigned long cpu_partial_alloc, cpu_partial_free;
int numa[MAX_NODES];
int numa_partial[MAX_NODES];
+ int numa_objects[MAX_NODES];
+ int numa_objects_partial[MAX_NODES];
+ int numa_total_objects[MAX_NODES];
+ int numa_cpu_slabs[MAX_NODES];
} slabinfo[MAX_SLABS];

struct aliasinfo {
@@ -394,13 +398,49 @@ static void slab_numa(struct slabinfo *s, int mode)
printf("\n");
if (mode) {
printf("%-21s ", "Partial slabs");
- for(node = 0; node <= highest_node; node++) {
+ for (node = 0; node <= highest_node; node++) {
char b[20];

store_size(b, s->numa_partial[node]);
printf(" %4s", b);
}
printf("\n");
+
+ printf("%-21s ", "CPU slabs");
+ for (node = 0; node <= highest_node; node++) {
+ char b[20];
+
+ store_size(b, s->numa_cpu_slabs[node]);
+ printf(" %4s", b);
+ }
+ printf("\n");
+
+ printf("%-21s ", "Objects");
+ for (node = 0; node <= highest_node; node++) {
+ char b[20];
+
+ store_size(b, s->numa_objects[node]);
+ printf(" %4s", b);
+ }
+ printf("\n");
+
+ printf("%-21s ", "Partial objects");
+ for (node = 0; node <= highest_node; node++) {
+ char b[20];
+
+ store_size(b, s->numa_objects_partial[node]);
+ printf(" %4s", b);
+ }
+ printf("\n");
+
+ printf("%-21s ", "Total objects");
+ for (node = 0; node <= highest_node; node++) {
+ char b[20];
+
+ store_size(b, s->numa_total_objects[node]);
+ printf(" %4s", b);
+ }
+ printf("\n");
}
line++;
}
@@ -1205,6 +1245,7 @@ static void read_slab_dir(void)
alias->ref = strdup(p);
alias++;
break;
+
case DT_DIR:
if (chdir(de->d_name))
fatal("Unable to access slab %s\n", slab->name);
@@ -1214,13 +1255,27 @@ static void read_slab_dir(void)
slab->aliases = get_obj("aliases");
slab->align = get_obj("align");
slab->cache_dma = get_obj("cache_dma");
- slab->cpu_slabs = get_obj("cpu_slabs");
+
+ slab->cpu_slabs = get_obj_and_str("cpu_slabs", &t);
+ decode_numa_list(slab->numa_cpu_slabs, t);
+ free(t);
+
slab->destroy_by_rcu = get_obj("destroy_by_rcu");
slab->hwcache_align = get_obj("hwcache_align");
slab->object_size = get_obj("object_size");
- slab->objects = get_obj("objects");
- slab->objects_partial = get_obj("objects_partial");
- slab->objects_total = get_obj("objects_total");
+
+ slab->objects = get_obj_and_str("objects", &t);
+ decode_numa_list(slab->numa_objects, t);
+ free(t);
+
+ slab->objects_partial = get_obj_and_str("objects_partial", &t);
+ decode_numa_list(slab->numa_objects_partial, t);
+ free(t);
+
+ slab->objects_total = get_obj_and_str("total_objects", &t);
+ decode_numa_list(slab->numa_total_objects, t);
+ free(t);
+
slab->objs_per_slab = get_obj("objs_per_slab");
slab->order = get_obj("order");
slab->partial = get_obj("partial");
@@ -1232,9 +1287,11 @@ static void read_slab_dir(void)
slab->red_zone = get_obj("red_zone");
slab->sanity_checks = get_obj("sanity_checks");
slab->slab_size = get_obj("slab_size");
+
slab->slabs = get_obj_and_str("slabs", &t);
decode_numa_list(slab->numa, t);
free(t);
+
slab->store_user = get_obj("store_user");
slab->trace = get_obj("trace");
slab->alloc_fastpath = get_obj("alloc_fastpath");
--
2.17.1

Subject: Re: [PATCH 0/2] slabinfo: parse all NUMA attributes

On Mon, 17 Feb 2020, Tobin C. Harding wrote:

> I found a few files in /sys/kernel/slab/foo/ that contain NUMA info that
> is not currently being parsed by `slabinfo.c`. I do not know whether
> this is intentional or not? Since I did not know this I just printed
> the info in the NUMA report section like is done for the per node slabs
> and partial slabs info.
>
> Just for your interest; I found these while re-writing slabinfo in Rust,
> thanks to the type-system. I guess that if they were unintentionally
> missed then this is a small win, if they were intentionally missed then
> this series is just noise :)

It was just to make the display simpler and I did not get around to the
full implementation (by adding some sort of NUMA option) since other
things kept coming up.

Subject: Re: [PATCH 1/2] tools: vm: slabinfo: Replace tabs with spaces

On Mon, 17 Feb 2020, Tobin C. Harding wrote:

> Replace the tabs with spaces, correctly aligning all option description
> strings.

Acked-by: Christoph Lameter <[email protected]>

Subject: Re: [PATCH 2/2] tools: vm: slabinfo: Add numa information for objects

On Mon, 17 Feb 2020, Tobin C. Harding wrote:

> Add a field to the slabinfo struct for the NUMA information and
> output it during a NUMA report as is done for `slabs` and `partial`.

How will this look? Note that there are boxes now with potentially huge
NUMA nodes (AMD Rome can already do 32 with an optimal BIOS layout for
minimal latency).

Maybe make it optional with a --numa switch or so?

2020-02-19 20:27:19

by Tobin C. Harding

[permalink] [raw]
Subject: Re: [PATCH 2/2] tools: vm: slabinfo: Add numa information for objects

On Tue, Feb 18, 2020 at 04:24:54PM +0000, Christopher Lameter wrote:
> On Mon, 17 Feb 2020, Tobin C. Harding wrote:
>
> > Add a field to the slabinfo struct for the NUMA information and
> > output it during a NUMA report as is done for `slabs` and `partial`.
>
> How will this look? Note that there are boxes now with potentially huge
> NUMA nodes (AMD Rome can already do 32 with an optimal BIOS layout for
> minimal latency).
>
> Maybe make it optional with a --numa switch or so?


Cool, can do. Thanks for the review.

Tobin