ZMEMTOPO(8)

📦 version 2.44.1, in opensuse-leap 16.0

💖 NAME 💖

zmemtopo — bestie, this is the one that shows you the CEC memory topology data on IBM Z. That's the whole vibe. ✨

(also it lives in the System Manager's Manual section 8, if you were wondering — zmemtopo(8), iykyk 🫶)


✨ SYNOPSIS ✨

zmemtopo [OPTIONS]

🦋 DESCRIPTION 🦋

okay so, zmemtopo retrieves and displays memory topology information for LPARs on IBM Z systems. It shows you the memory in uniform increments, where an increment is literally the smallest unit that the topology querying device is willing to report. Every single increment represents a configured chunk of memory, plus the topological location that chunk lives at. 📍

The granularity of what you're looking at varies by nesting level — which makes sense, because it's reflecting the hierarchical arrangement of memory. deeper level = more deets, it's giving tree energy 🌳


🎀 OPTIONS 🎀

  • -l <NESTING_LEVEL>, --level=<NESTING_LEVEL> — picks which nesting level of memory topology you wanna see. Lower levels = more detailed output, periodt. Valid values for NESTING_LEVEL are between 1 and 6, but heads up: some levels might not actually have any data available to display. 💅
  • --format=<FORMAT> — displays the memory topology info in the format you specify. Valid values for <FORMAT> are json, csv, json-seq, jsonl or pairs. In a parseable format, the increment size is given in bytes. (yes, bytes. not letters. bytes. 🔥)
  • -f, --full — displays the entries or nesting levels that have no memory increments configured. no effect on the table format though, so don't come for it. 🙈
  • -r, --reverse — reverses the hierarchy of the displayed tree. When --reverse is specified the direction follows nesting level to partition. Has no effect on the table format. ⭐
  • -t, --table — displays the memory topology in a table format. The table format displays a layout of memory topology. The size of the increments is given in a footer, and each increment is the same size. cute + consistent 🎀
  • -s <FIELD>, --sort=<FIELD> — sorts and displays the data according to the given FIELD value. Valid values for FIELD are "nr" for partition number, "lpar" for partition name, and "sum" for total partition increments. 💅
  • -p <SUBSTRING>, --partition-filter=<SUBSTRING> — displays only the partitions with names that contain SUBSTRING. Matching is case-insensitive, so you don't have to yell at it. 🫶
  • -i, --ascii — uses only ASCII characters to render views. for the plain-text girlies 🦋
  • -h, --help — prints usage information, then exits. ✨
  • -v, --version — prints version information, then exits. 👑

🌸 PREREQUISITES 🌸

The following things are required to run zmemtopo. no skips, bestie:

  • The Linux kernel must have the required support to provide the memory topology data.
  • To fetch data of any other operating system instances running on the same hypervisor as zmemtopo, you will need additional permissions. 👀 (it's giving "ask nicely" energy)

🌈 EXAMPLES 🌈

Below are various combinations of available command line options. go off, honestly:


  • Without any options zmemtopo displays the tree view with nesting level 3. the classic. the default. the main character ✨
$ zmemtopo

LPAR/LEVEL     SIZE
LPAR003          8G
└LEVEL4_0        8G
  ├LEVEL3_0      2G
  ├LEVEL3_1      2G
  ├LEVEL3_2      2G
  └LEVEL3_3      2G
LPAR005          8G
└LEVEL4_1        8G
  ├LEVEL3_0      2G
  ├LEVEL3_1      2G
  ├LEVEL3_2      2G
  └LEVEL3_3      2G
LPAR006          8G
└LEVEL4_3        8G
  ├LEVEL3_0      2G
  ├LEVEL3_1      2G
  ├LEVEL3_2      2G
  └LEVEL3_3      2G
LPAR009          8G
└LEVEL4_3        8G
  ├LEVEL3_0      2G
  ├LEVEL3_1      2G
  ├LEVEL3_2      2G
  └LEVEL3_3      2G
 .
 .
 .

  • Display table format — by default nesting level 3 is displayed. look at that grid, it ate 🔥
$ zmemtopo -t

        LEVEL 4   0   0   0   0    1   1   1   1    2   2   2   2    3   3   3   3
        LEVEL 3   0   1   2   3    0   1   2   3    0   1   2   3    0   1   2   3
 NR    LPAR SUM
  3 LPAR003   8   2   2   2   2    -   -   -   -    -   -   -   -    -   -   -   -
  5 LPAR005   8   -   -   -   -    2   2   2   2    -   -   -   -    -   -   -   -
  6 LPAR006   8   -   -   -   -    -   -   -   -    -   -   -   -    2   2   2   2
  9 LPAR009   8   -   -   -   -    -   -   -   -    -   -   -   -    2   2   2   2
 13 LPAR013  48   -   -   -   -    -   -   -   -   12  12  12  12    -   -   -   -
 .
 .
 .

Increment size: 1G

  • Display reverse tree with nesting level 4. flip it, reverse it 💅
$ zmemtopo -r -l 4

LEVEL/LPAR     SIZE
LEVEL4_0       388G
│ ├LPAR003       8G
│ ├LPAR018      64G
│ └...
LEVEL4_1       708G
│ ├LPAR005       8G
│ ├LPAR029       8G
│ └...          32G
LEVEL4_2       224G
│ ├LPAR013      48G
│ ├LPAR014      20G
│ ├LPAR019
│ └...          32G
LEVEL4_3      1618G
  ├...
  └LPAR086       2G

  • Display reverse full tree. Entries that have no memory increments are visible — that's the -f doing its thing, bestie 🫶
$ zmemtopo -rf

LEVEL/LPAR      SIZE
LEVEL4_0        388G
│ ├LEVEL3_0      97G
│ │ ├LPAR003      2G
│ │ ├LPAR018     16G
│ │ └...
│ ├LEVEL3_1      97G
│ │ ├LPAR003      2G
│ │ ├LPAR018     16G
│ │ └...
│ ├LEVEL3_2      97G
│ │ ├LPAR003      2G
│ │ └...
│ └LEVEL3_3      97G
│   ├LPAR003      2G
│   └...
LEVEL4_1           -
│ ├LEVEL3_0        -
│ ├LEVEL3_1        -
│ ├LEVEL3_2        -
│ └LEVEL3_3        -
LEVEL4_2        224G
│ ├LEVEL3_0      56G
│ │ ├LPAR013     12G
│ │ └...
│ ├LEVEL3_1      56G
│ │ ├LPAR013     12G
│ │ └...
│ ├LEVEL3_2      56G
│ │ ├LPAR013     12G
│ │ └...
│ └LEVEL3_3      56G
│   ├LPAR013     12G
│ │ └...
LEVEL4_3       1618G
  ├LEVEL3_0     405G
  │ ├LPAR006      2G
  │ ├...
  │ └LPAR086      1G
  ├LEVEL3_1     405G
  │ ├LPAR006      2G
  │ ├...
  │ └LPAR086      1G
  ├LEVEL3_2     404G
  │ ├LPAR006      2G
  │ ├...
  │ └LPAR060     48G
  └LEVEL3_3     404G
    ├LPAR006      2G
    ├...
    └LPAR060     48G

  • Display tree with entries which have no memory increments. those lil - dashes are literally the void and we're showing it 💀
$ zmemtopo -f

LPAR/LEVEL     SIZE
LPAR086          2G
├LEVEL4_0         -
│ ├LEVEL3_0       -
│ ├LEVEL3_1       -
│ ├LEVEL3_2       -
│ └LEVEL3_3       -
├LEVEL4_1         -
│ ├LEVEL3_0       -
│ ├LEVEL3_1       -
│ ├LEVEL3_2       -
│ └LEVEL3_3       -
├LEVEL4_2         -
│ ├LEVEL3_0       -
│ ├LEVEL3_1       -
│ ├LEVEL3_2       -
│ └LEVEL3_3       -
└LEVEL4_3        2G
  ├LEVEL3_0      1G
  ├LEVEL3_1      1G
  ├LEVEL3_2       -
  └LEVEL3_3       -
LPAR074          4G
├LEVEL4_0         -
│ ├LEVEL3_0       -
│ ├LEVEL3_1       -
│ ├LEVEL3_2       -
│ └LEVEL3_3       -
├LEVEL4_1        4G
│ ├LEVEL3_0      1G
│ ├LEVEL3_1      1G
│ ├LEVEL3_2      1G
│ └LEVEL3_3      1G
 .
 .
 .

  • Display json format. structured data, my beloved 🧚
$ zmemtopo --format=json

{
  "meta": {
    "api_level": "1",
    "version": "s390.tools.version",
    "host": "host.name",
    "time_epoch": "xxxxxxxxx",
    "time": "YYYY-MM-DD HH:MM:SS+0T00"
  },
  "zmemtopo": {
    "report_tod": "0x0e082f7f6d8da64000",
    "report_partition_nr": 74,
    "increment_size": 1073741824,
    "partitions": [
      {
        "partition_nr": 3,
        "partition_name": "LPAR003",
        "topology": [
          {
            "level": 4,
            "entry_idx": 0,
            "increment_count": 8,
            "topology": [
              {
                "level": 3,
                "entry_idx": 0,
                "increment_count": 2
              },
              {
                "level": 3,
                "entry_idx": 1,
                "increment_count": 2
              },
              {
                "level": 3,
                "entry_idx": 2,
                "increment_count": 2
              },
              {
                "level": 3,
                "entry_idx": 3,
                "increment_count": 2
              }
            ]
          },
          {
            "level": 4,
            "entry_idx": 1,
            "increment_count": 0,
            "topology": [
          .
       .
       .

  • Display csv format. spreadsheet core 🍓
$ zmemtopo --format=csv

...and it keeps going, bestie — the table just vibes its way down the screen. ✨ Here's the tail of the CSV report exactly as it lands, header row and all, so you can see what you're actually getting:

"report_tod","report_partition_nr","increment_size","partition_nr","partition_name","parent_level","parent_entry_idx","level","entry_idx","increment_count"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","-","-","4","0","8"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","0","3","0","2"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","0","3","1","2"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","0","3","2","2"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","0","3","3","2"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","-","-","4","1","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","1","3","0","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","1","3","1","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","1","3","2","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","1","3","3","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","-","-","4","2","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","2","3","0","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","2","3","1","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","2","3","2","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","2","3","3","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","-","-","4","3","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","3","3","0","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","3","3","1","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","3","3","2","0"
"0x0e082f818b066ce82000","74","1073741824","3","LPAR003","4","3","3","3","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","-","-","4","0","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","0","3","0","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","0","3","1","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","0","3","2","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","0","3","3","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","-","-","4","1","8"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","1","3","0","2"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","1","3","1","2"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","1","3","2","2"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","1","3","3","2"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","-","-","4","2","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","2","3","0","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","2","3","1","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","2","3","2","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","2","3","3","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","-","-","4","3","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","3","3","0","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","3","3","1","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","3","3","2","0"
"0x0e082f818b066ce82000","74","1073741824","5","LPAR005","4","3","3","3","0"
"0x0e082f818b066ce82000","74","1073741824","6","LPAR006","-","-","4","0","0"
 .
 .
 .

Okay so a lil guided tour of what you're looking at, iykyk 🧚:

  • First line — the column headers, quoted and comma-separated: "report_tod", "report_partition_nr", "increment_size", "partition_nr", "partition_name", "parent_level", "parent_entry_idx", "level", "entry_idx", "increment_count". Every single row after that fills those in the same order, no cap.
  • Every value is quoted, even the numbers — that's just the CSV aesthetic, don't come for it 💅
  • The dashes ("-", "-") show up in the parent_level / parent_entry_idx slots on the rows where there's nothing to point at. Not a bug, just the CSV saying "n/a" in its own little way.
  • The report_tod stays the same hex string (0x0e082f818b066ce82000) all the way down, and report_partition_nr, increment_size, partition_nr, partition_name hold steady per block — so you can group by eye.
  • It rolls through LPAR003 with levels 0–3, then LPAR005 with its own set (spot the increment_count of 8 and those 2s sitting pretty 👀), then starts on LPAR006...
  • ...and then the . . . — because the full table is long, and the man page is not about to print the whole thing at you. It truncates and lets your terminal scroll its heart out. 🌀

So yeah — it's one entry per row, columns locked in that exact order, repeating until the table runs out of things to say. Feed it to csv-ish tooling, awk on -F,, whatever your heart desires, and it'll behave.


That's the whole ride, bestie: zmemtopo showed up, dumped its topology as CSV, and dipped. 👑

Shipped in s390-tools, dated 2025, and filed under ZMEMTOPO(8) — go read it on a machine that actually has the s390 hardware under it, and may your report_tod always be steady, your parent_level never dash when you need it, and your terminal never scroll back further than you can handle. 🎀💖✨

📦 where this page comes from