Lustre Progressive File Layout (PFL) with SSD and HDD Pools

Article ID: 680
Last updated: 17 Mar, 2025

Hard disk drives (HDDs) and solid state drives (SSDs) are the two main storage options commonly deployed in data centers. With HDD, data are stored magnetically in spinning disks, and data retrieval is slow; therefore, HDD is practical only for data that does not need to be accessed frequently. SSDs are a newer technology where data is stored in integrated circuits, which dramatically reduces access time. Because SSDs are more expensive than HDDs, a hybrid solution provides a good compromise between price and performance.

The NAS Lustre filesystems (/nobackupp[17–19, 27–29]) are configured using Progressive File Layout (PFL) with HDDs and SSDs configured as different Lustre pools. This article provides information about these filesystems, using /nobackupp17 as an example.

SSD and HDD Pools

To view a list of a filesystem's object storage targets (OSTs) showing whether they are in the HDD pool or the SSD pool, use the lfs pool_list command. The OSTs are shown in hexadecimal format:

pfe% lfs pool_list nbp17.hdd-pool
Pool: nbp17.hdd-pool
nbp17-OST0000_UUID
nbp17-OST0001_UUID
..
nbp17-OST001e_UUID
nbp17-OST001f_UUID

pfe% lfs pool_list nbp17.ssd-pool
Pool: nbp17.ssd-pool
nbp17-OST0064_UUID
nbp17-OST0065_UUID
...
nbp17-OST0082_UUID
nbp17-OST0083_UUID

The available SSD space in each filesystem is much smaller than the HDD space. In the example below, the lfs df command shows that the size of each /nobackupp17 HDD OST is 565.0 terabytes (TB), while each SSD OST is only 30.3 TB. The output also shows both the hexadecimal (far left) and decimal (far right) labels of each OST.

pfe% lfs df -h /nobackupp17 | grep OST
nbp17-OST0000_UUID        565.0T      322.7T      213.8T  61% /nobackupp17[OST:0]
nbp17-OST0001_UUID        565.0T      323.5T      213.0T  61% /nobackupp17[OST:1]
...
nbp17-OST001e_UUID        565.0T      322.9T      213.7T  61% /nobackupp17[OST:30]
nbp17-OST001f_UUID        565.0T      325.1T      211.4T  61% /nobackupp17[OST:31]
nbp17-OST0064_UUID         30.3T       23.5T        6.4T  79% /nobackupp17[OST:100]
nbp17-OST0065_UUID         30.3T       23.5T        6.4T  79% /nobackupp17[OST:101]
...
nbp17-OST0082_UUID         30.3T       23.5T        6.5T  79% /nobackupp17[OST:130]
nbp17-OST0083_UUID         30.3T       23.5T        6.5T  79% /nobackupp17[OST:131]

Configuration of the NAS Lustre Filesystems

The following table summarizes the configurations of /nobackupp[17–19, 27–29].

Filesystem nbp17 nbp18 nbp19 nbp27 nbp28 nbp29
# of OSTs in HDD 32
(OST: 0-31)
32
(OST: 0-31)
16
(OST: 0-15)
32
(OST: 0-31)
32
(OST: 0-31)
16
(OST: 0-15)
Size/OST in HDD 565.0 T 565.0 T 565.0 T 565.0 T 565.0 T 565.0 T
Total Space in HDD 18.6 P 18.6 P 9.3 P 18.6 P 18.6 P 9.3 P
# of OSTs in SSD 32
(OST: 100-131)
16
(OST: 100-115)
16
(OST: 100-115)
32
(OST: 100-131)
16
(OST: 100-115)
16
(OST: 100-115)
Size/OST in SSD 30.3 T 60.5 T 29.6 T 30.3 T 60.5 T 29.6 T
Total Space in SSD ~ 1 P ~ 1 P ~ 0.5 P ~ 1 P ~ 1 P ~ 0.5 P

Progressive File Layout (PFL)

The Lustre filesystems take advantage of the Lustre PFL feature, which increases the stripe count of each file in a step-wise manner as the file grows in size. Specifically, PFL is built using composite layouts described by a series of components. Each component covers a non-overlapping portion of the file and has its own stripe setting in size, count, index and pool.

Default PFL Configurations

For each filesystem, a NAS-created default layout provides reasonable performance for a variety of file I/O patterns—and relieves users of the need to determine and set striping.

To find the default layout of each filesystem, use the lfs getstripe command as follows:

pfe% lfs getstripe -d /nobackupp17
lcm_layout_gen:    0
...
 lcme_extent.e_start: 0
 lcme_extent.e_end:   268435456
  stripe_count:  1    stripe_size: 16777216   pattern:   raid0   stripe_offset: -1  pool:  ssd-pool

 ...
 lcme_extent.e_start: 268435456
 lcme_extent.e_end:   5368709120
  stripe_count:  16   stripe_size: 16777216   pattern:   raid0   stripe_offset: -1  pool:  ssd-pool

 ...
 lcme_extent.e_start: 5368709120
 lcme_extent.e_end:   EOF
  stripe_count:  16   stripe_size: 16777216   pattern:   raid0   stripe_offset: -1  pool:  hdd-pool

The output shows that /nobackupp17 is configured with three components:

  • The first component setting applies to the file segment from the beginning up to 268435456 B (256 MB), with a stripe count of 1 and stripe size of 16 MB; this component uses ssd-pool.
  • The second component setting applies to the file segment from 256 MB to 5 GB with a stripe count of 16 and stripe size of 16 MB; this component uses ssd-pool.
  • The last component setting applies to the file segment from 5 GB to the end of the file with a stripe count of 16 and stripe size of 16 MB; this component uses hdd-pool.

With this composite layout, I/O to and from the first 5 GB of files will benefit from the higher performance of SSDs.

Note: The default component layouts may be adjusted by NAS system administrators as needed.

Customized PFL Configurations

If you have experience using the PFL feature, and you want to have more control of your application's I/O, you can choose your own composite layouts using the lfs setstripe command with various options, such as --component-end (or -E), --stripe-size (or -S), --stripe-count (or -c), --overstripe-count (or -C), --pool (or -p). For example:

lfs setstripe \
   -E 256M -C 1  -S 1M -p ssd-pool \
   -E 4G   -C 4  -S 1M -p ssd-pool \
   -E EOF  -C 16 -S 1M -p hdd-pool \
directory_name_or_filename

Note: If not explicitly set, files inherit layouts from their parent directory.

WARNING: SSD space is limited. Therefore, do not set striping for very large files to use only the SSD pool.

Mirroring and Migration of Data from SSD to HDD

As the limited SSD space fills up, data that is stored in SSDs is migrated over to HDDs to free up SSD space for I/O by new jobs. This automatic migration is accomplished through a mirroring mechanism.

After a file is closed, SSD data is queued to be mirrored to the HDD. The data will be in dual state—stored on both the SSD and the HDD—until SSD usage reaches a certain point; then, the SSD copy will be removed to free up space. Typically, the oldest files are removed first when SSD usage reaches 80%, and other files are removed more aggressively when usage reaches 90%. The mirroring and migration settings may be adjusted by NAS system administrators as needed.

Note: Mirrored data that exists in both SSDs and HDDs are counted twice against your quota.

To find out if a file is in dual state or has been migrated completely to HDDs, use the lfs getstripe filename command, as shown in the next two examples.

Output Showing Data in Dual State

If the lfs getstripe filename output shows entries with different values for lcme_mirror_id, the data is in dual state, as illustrated in this example:

pfe% lfs getstripe file1
file1
  lcm_layout_gen:    5
  lcm_mirror_count:  2
  lcm_entry_count:   4
    lcme_id:             65537
    lcme_mirror_id:      1     <-------
    lcme_flags:          init,prefer
    lcme_extent.e_start: 0
    lcme_extent.e_end:   268435456
      lmm_stripe_count:  1
      lmm_stripe_size:   16777216
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: 128
      lmm_pool:          ssd-pool
      lmm_objects:
      - 0: { l_ost_idx: 128, l_fid: [0x800000409:0x413e0a:0x0] }

    lcme_id:             65538
    lcme_mirror_id:      1   <--------
    lcme_flags:          init,prefer
    lcme_extent.e_start: 268435456
    lcme_extent.e_end:   5368709120
      lmm_stripe_count:  16
      lmm_stripe_size:   16777216
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: 103
      lmm_pool:          ssd-pool
      lmm_objects:
      - 0: { l_ost_idx: 103, l_fid: [0x340000409:0x4305bb:0x0] }
      - 1: { l_ost_idx: 131, l_fid: [0x500000409:0x449f9f:0x0] }
      .....
      - 14: { l_ost_idx: 120, l_fid: [0x9c000040a:0x415384:0x0] }
      - 15: { l_ost_idx: 127, l_fid: [0x7c0000409:0x4100a6:0x0] }

    lcme_id:             65539
    lcme_mirror_id:      1  <---------
    lcme_flags:          init
    lcme_extent.e_start: 5368709120
    lcme_extent.e_end:   EOF
      lmm_stripe_count:  16
      lmm_stripe_size:   16777216
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: 27
      lmm_pool:          hdd-pool
      lmm_objects:
      - 0: { l_ost_idx: 27, l_fid: [0xfc0000400:0xd887b2:0x0] }
      - 1: { l_ost_idx: 26, l_fid: [0xb00000404:0xd8ed7c:0x0] }
      ....
      - 14: { l_ost_idx: 23, l_fid: [0xe40000400:0xd97afb:0x0] }
      - 15: { l_ost_idx: 9, l_fid: [0xe00000400:0x36d9a4:0x0] }

    lcme_id:             131073
    lcme_mirror_id:      2  <--------
    lcme_flags:          init
    lcme_extent.e_start: 0
    lcme_extent.e_end:   EOF
      lmm_stripe_count:  16
      lmm_stripe_size:   1048576
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: 9
      lmm_pool:          hdd-pool
      lmm_objects:
      - 0: { l_ost_idx: 9, l_fid: [0xe00000400:0x36d9bd:0x0] }
      - 1: { l_ost_idx: 19, l_fid: [0x120000040d:0xdaa1a0:0x0] }
      ....
      - 14: { l_ost_idx: 28, l_fid: [0xf40000400:0xd7c343:0x0] }
      - 15: { l_ost_idx: 11, l_fid: [0xc00000402:0x36d1eb:0x0] }

Output Showing Data Completely Migrated to HDDs

This example shows an older file that has been completely migrated to HDDs:

pfe% lfs getstripe file2          
file2          
  lcm_layout_gen:    2
  lcm_mirror_count:  1
  lcm_entry_count:   1
    lcme_id:             131073
    lcme_mirror_id:      2
    lcme_flags:          init
    lcme_extent.e_start: 0        <-----
    lcme_extent.e_end:   EOF      <-----
      lmm_stripe_count:  16
      lmm_stripe_size:   1048576
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: 24
      lmm_pool:          hdd-pool
      lmm_objects:
      - 0: { l_ost_idx: 24, l_fid: [0xd8000040e:0x475b02:0x0] }
      - 1: { l_ost_idx: 3, l_fid: [0x130000040e:0x4733cd:0x0] } 
      ....
      - 14: { l_ost_idx: 20, l_fid: [0xc8000040e:0x482bcc:0x0] }
      - 15: { l_ost_idx: 18, l_fid: [0xe8000040e:0x47cc62:0x0] }

Note: When your file is completely migrated to HDD (removed from SDD), the (ctime) of the file will change to the creation time of the mirrored copy on HDD, as described below.

Change Time (ctime) Example

When a file is mirrored, a second copy of the data is created. The file will retain both sets of data until you break the mirror, or when the filesystem automatically flushes the SSD pool—at which time, the (ctime) will be updated to reflect the time the mirror was created.

In the following example, the stat command is used to show the time metadata of a test file that was created at 15:48:45:

% stat testfile
  File: 'testfile'
  Size: 59535     	Blocks: 120        IO Block: 4194304 regular file
Device: 521e79ech/1377729004d	Inode: 342273918398214817  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-02-14 15:48:45.000000000 -0800
Modify: 2022-02-14 15:48:45.000000000 -0800
Change: 2022-02-14 15:48:45.000000000 -0800

At time 15:50:27, the file is mirrored but the ctime remains unchanged:

% stat testfile
  File: 'testfile'
  Size: 59535     	Blocks: 120        IO Block: 4194304 regular file
Device: 521e79ech/1377729004d	Inode: 342273918398214817  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-02-14 15:48:45.000000000 -0800
Modify: 2022-02-14 15:48:45.000000000 -0800
Change: 2022-02-14 15:48:45.000000000 -0800
 Birth: -

pfe25 /nobackupp18/username % lfs getstripe testfile
testfile
  lcm_layout_gen:    1
  lcm_mirror_count:  2
  lcm_entry_count:   4
    lcme_id:             65537
    lcme_mirror_id:      1
    lcme_flags:          init,prefer
    lcme_extent.e_start: 0
    lcme_extent.e_end:   268435456
      lmm_stripe_count:  1
      lmm_stripe_size:   16777216
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: 109
      lmm_pool:          ssd-pool
      lmm_objects:
      - 0: { l_ost_idx: 109, l_fid: [0x90000040a:0x53990:0x0] }

    lcme_id:             65538
    lcme_mirror_id:      1
    lcme_flags:          prefer
    lcme_extent.e_start: 268435456
    lcme_extent.e_end:   5368709120
      lmm_stripe_count:  -1
      lmm_stripe_size:   16777216
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: -1
      lmm_pool:          ssd-pool

    lcme_id:             65539
    lcme_mirror_id:      1
    lcme_flags:          0
    lcme_extent.e_start: 5368709120
    lcme_extent.e_end:   EOF
      lmm_stripe_count:  16
      lmm_stripe_size:   16777216
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: -1
      lmm_pool:          hdd-pool

    lcme_id:             131073
    lcme_mirror_id:      2
    lcme_flags:          init
    lcme_extent.e_start: 0
    lcme_extent.e_end:   EOF
      lmm_stripe_count:  1
      lmm_stripe_size:   1048576
      lmm_pattern:       raid0
      lmm_layout_gen:    0
      lmm_stripe_offset: 0
      lmm_pool:          hdd-pool
      lmm_objects:
      - 0: { l_ost_idx: 0, l_fid: [0x2c0000409:0x30c3e:0x0] }

Later, the file is flushed from the SSD. At that time, the file's ctime is updated to reflect the creation time of the copy on HDD:

% stat testfile
  File: 'testfile'
  Size: 59535     	Blocks: 120        IO Block: 4194304 regular file
Device: 521e79ech/1377729004d	Inode: 342273918398214817  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-02-14 15:50:27.000000000 -0800
Modify: 2022-02-14 15:48:45.000000000 -0800
Change: 2022-02-14 15:50:27.000000000 -0800
 Birth: -

References

Also read

Contact Us

General User Assistance

Security

  • Report security issues 24x7x365
  • Toll-free: 1-877-NASA-SEC (1-877-627-2732)
  • E-mail: soc@nasa.gov

User Documentation

High-End Computing Capability (HECC) Portfolio Office

NASA High-End Computing Program

Tell Us About It

Our goal is furnish all the information you need to efficiently and effectively use the HECC resources needed for your NASA computational projects.

We welcome your input on features and topics that you would like to see included on this website.

Please send us email with your wish list and other feedback.