[Nottingham] Optimising btrfs for an SSD

Martin martin at ml1.co.uk
Mon Oct 3 12:05:36 UTC 2011


OK... So I have an SSD that has:

Erase block size: 2MByte
Physical to logical translation unit size: 2 pages (16kByte)
Page size: 8kBytes


My reading so far suggests to ensure that partitions are on 2MByte boundaries.

For formatting, mkfs.btrfs offers the parameters:

       -l, --leafsize size
              Specify the leaf size, the least data item in which
btrfs stores data. The default value is the page size.

       -n, --nodesize size
              Specify the nodesize. By default the value is set to the pagesize.

       -s, --sectorsize size
              Specify the sectorsize, the minimum block allocation.

Note that the pagesize for x86 Linux systems (PCs) is 4kBytes.

For SSDs, the pagesize is the smallest unit writeable to the
underlying storage. Anything smaller, or anything misaligned away from
a page boundary, will require a read-modify-write operation to write a
complete page. Pages can be erased for new data only for an entire
erase block at a time (2MBytes). To write new/modified data, a new
page that is already erased must be allocated, the new data written
there, and the physical-to-logical map updated to 'slot' the newly
used page back into the 'right place'.

A complication is that for this SSD, the physical to logical mapping
only works down to chunks of two pages at a time, 16kBytes.

Also, what does btrfs do with the "sectorsize" parameter exactly?


Should I use:

mkfs.btrfs -L my_new_ssd -l 8192 -n 8192 -s 8192 /dev/sdX

to force btrfs to align with the SSD pagesize?


mkfs.btrfs -L my_new_ssd -l 16384 -n 16384 -s 16384 /dev/sdX

to align with the physical-to-logical mapping unit size?

Or something else?

Opinions and reasons on an email to the list please!


More information about the Nottingham mailing list