Which linux filesystem works best with SSD

141,517

Solution 1

Short answer

  • Choose ext4, and use FITRIM (see below). Also use the noatime option if you fear "SSD wear".

  • Don't change your default I/O scheduler (CFQ) on multi-applications servers, as it provides fairness between processes and has automatic SSD support. However, use Deadline on desktops to get better responsiveness under load.

  • To easily guarantee proper data alignment, the starting sector of each partition must be a multiple of 2048 (= 1 MiB). You can use fdisk -cu /dev/sdX to create them. On recent distributions, it will automatically take care of this for you.

  • Think twice before using swap on SSD. It will probably be much faster compared to swap on HDD, but it will also wear the disk faster (which may not be relevant, see below).

Long answer

  • Filesystems:

Ext4 is the most common Linux filesystem (well maintained). It provides good performance with SSD and supports the TRIM (and FITRIM) feature to keep good SSD performance over time (this clears unused memory blocks for quick later write access). NILFS is especially designed for flash memory drives, but does not really perform better than ext4 on benchmarks. Btrfs is still considered experimental (and does not really perform better either).

  • SSD performance & TRIM:

The TRIM feature clears SSD blocks that are not used anymore by the filesystem. This will optimize long-term write performance and is recommended on SSD due to their design. It means that the filesystem must be able to tell the drive about those blocks. The discard mount option of ext4 will issue such TRIM commands when filesystem blocks are freed. This is online discard.

However, this behavior implies a little performance overhead. Since Linux 2.6.37, you may avoid using discard and choose to do occasional batch discard with FITRIM instead (e.g. from the crontab). The fstrim utility does this (online), as well as the -E discard option of fsck.ext4. You will need "recent" (as of writing) versions of these tools however.

  • SSD wear:

You might want to limit writes on your drive as SSD have a limited lifetime in this regard. Don't worry too much however, today's worst 128 GB SSD can support at least 20 GB of written data per day for more than 5 years (1000 write cycles per cell). Better ones (and also bigger ones) can last much longer: you will very probably have replaced it by then.

If you want to use swap on SSD, the kernel will notice a non-rotational disk and will randomize swap usage (kernel level wear levelling): you will then see a SS (Solid State) in the kernel message when swap is enabled:

Adding 2097148k swap on /dev/sda1. Priority:-1 extents:1 across:2097148k SS

  • I/O Schedulers:

Also, I agree with most of aliasgar's answer (even if most of it has been -illegally?- copied from this website), but I must partly disagree on the scheduler part. By default, the deadline scheduler is optimized for rotational disks as it implements the elevator algorithm. So, let's clarify this part.

Long answer on schedulers

Starting from kernel 2.6.29, SSD disks are automatically detected, and you may verify this with:

cat /sys/block/sda/queue/rotational

You should get 1 for hard disks and 0 for a SSD.

Now, the CFQ scheduler can adapt its behavior based on this information. Since linux 3.1, the kernel documentation cfq-iosched.txt file says:

CFQ has some optimizations for SSDs and if it detects a non-rotational media which can support higher queue depth (multiple requests at in flight at a time), [...].

Also, the Deadline scheduler tries to limit unordered head movements on rotational disks, based on the sector number. Quoting kernel doc deadline-iosched.txt, fifo_batch option description:

Requests are grouped into ``batches'' of a particular data direction (read or write) which are serviced in increasing sector order.

However, tuning this parameter to 1 when using a SSD may be interesting:

This parameter tunes the balance between per-request latency and aggregate throughput. When low latency is the primary concern, smaller is better (where a value of 1 yields first-come first-served behaviour). Increasing fifo_batch generally improves throughput, at the cost of latency variation.

Some benchmarks suggest that there is little difference in performance between the different schedulers. Then, why not recommend fairness? when CFQ is rarely bad in the bench.

However, on desktop setups, you will usually experience better responsiveness using Deadline under load, due to its design (probably at a lower throughput cost though).

That said, a better benchmark would try using Deadline with fifo_batch=1.

To use Deadline on SSDs (and NVMe & flash memory drives) by default, you can create a file, say /etc/udev.d/99-ssd.rules as follows:

# all non-rotational block devices use 'deadline' scheduler
# mostly useful for SSDs on desktops systems
SUBSYSTEM=="block", ATTR{queue/rotational}=="0", ACTION=="add|change", ENV{DEVTYPE}=="disk", ATTR{queue/scheduler}="deadline"

Solution 2

Filesystem EXT4 + TRIM:

  • EXT4 with TRIM improves performance by reducing unnecessary write cycles to the SSD drive as they limited write-rewrite cycles.
  • Ubuntu and some other Linux flavors support EXT 4 with TRIM out of the box.

SWAP Partition:

  • Make sure you do not have a SWAP space on the SSD, again to reduce the write cycles.
  • If you have a mechanical drive, then you should create a SWAP space on the mechanical drive, and avoid having it on the SSD.

Partition Alignment:

  • The partition should start on a clean 1MB boundary so that block size of the Filesystem aligns with the block size of the SSD.

So use EXT4 + TRIM with a SWAP on a mechanical hard drive or no SWAP on SSD.

The above can be implemented by referring to the Source: How to Maximize SSD Performance.

Solution 3

The archlinux article Solid State Drives says in the section Choice of Filesystem :

Many options exist for file systems including Ext2/3/4, Btrfs, etc.

Btrfs
Btrfs support has been included with the mainline 2.6.29 release of the Linux kernel. Some feel that it is not mature enough for production use while there are also early adopters of this potential successor to ext4. Users are encouraged to read the Btrfs article for more info.

Ext4
Ext4 is another filesystem that has support for SSD. It is considered as stable since 2.6.28 and is mature enough for daily use. Contrary to Btrfs, ext4 does not automatically detect the disk nature; users must explicitly enable the TRIM command support using the discard mount option in fstab (or with tune2fs -o discard /dev/sdaX).

Both Btrfs and Ext4 fulfill the two major requirements for efficient use of the SSD :

  • The filesystem has to be able to issue ATA_TRIM commands to the underlying SSD
  • The filesystem must not perform unneeded writes to the disk

For performance, there are two other requirements :

  • Partitions need to be aligned to the block size of the SSD
  • TRIM must be explicitly enabled for each Ext4 formatted partition

The first one is nowadays automatic with most Linux installers. fdisk will also create partitions at the 1024KB border if started with the "-cu" flags.

The second is automatic for Btrfs, but for Ext4 this is done manually by adding "discard" to the list of mount options for each Ext4 partition in the "/etc/fstab" file. For more details see this howto.

In my opinion, this required little fiddling with fstab for Ext4 is no reason not to use this mature and excellent filesystem.

Share:
141,517

Related videos on Youtube

hbt
Author by

hbt

Updated on September 17, 2022

Comments

  • hbt
    hbt over 1 year

    From wiki:

    The vital TRIM function is supported by the Linux OS starting with 2.6.33 kernel (available early 2010). However, support amongst various filesystems is still inconsistent or not present. Proper partition alignment is also not carried out by installation software.

    So, which filesystem works best for SSD and supports TRIM + partition alignment during install and is available on Ubuntu?

  • aliasgar
    aliasgar over 11 years
    GPT is the modern method using gdisk & grub 2.0.x, (I guess someone mentioned it below in an answer) and MBR is the legacy method using the old grub 0.9.7 and fdisk.. you can find more here : wiki.archlinux.org/index.php/Solid_State_Drives
  • Redsandro
    Redsandro almost 11 years
    It is unnecessary to specify nodiratime when you also specify noatime. Agreed, it looks cool and advanced to fellow nerds, but since noatime disables atime on inodes, and directories are inodes too, it's like saying "wash your hands, and wash your thumbs too". :)
  • drumfire
    drumfire almost 11 years
    Out of experience I can say that no scheduler ("noop") works faster than deadline.
  • phuclv
    phuclv about 9 years
    No, "Linux swap partitions are by default performing TRIM operations when the underlying block device supports TRIM, with the possibility to turn them off, or to select between one-time or continuous TRIM operations." so swap partition should be placed on an SSD to take advantage of the fast access time, which will incur a lot of time each page swap occurs
  • jarno
    jarno over 8 years
    What do you mean by that partitioning alignment is automatically taken care of on recent distributions? Does it apply also when you use manual partitioning during e.g. ubuntu installation or when doing partitioning by gparted?
  • killermist
    killermist over 8 years
    @jarno in most recent distributions (for several years now), partitioning tools, from fdisk on up through the graphical things, tend to auto-default to creating partition alignments at multiples of 1Mb from the device start. This preemptively aligns with 512byte, 4k, 8k, and half a bazillion other block/cluster sizes that are 2^n in nature. It makes it almost impossible to mis-align a partition unless you make significant effort to do so.
  • Totor
    Totor over 8 years
    @slhck IMHO you should delete the history as well. The probably illegal plagiarism is still visible there. They do this kind of history deletion/hiding) on Wikipedia every day just well.
  • slhck
    slhck over 8 years
    @Totor It's not common for Stack Exchange though, unless there's a DMCA complaint or there is personally identifying information in a post's history.
  • Tcll
    Tcll over 5 years
    what about auto-defrag, pretty sure you'd want that to be disabled if using an SSD
  • SebMa
    SebMa over 5 years
    @aliasgar Is F2FS a good choice vs ext4 ?
  • aliasgar
    aliasgar over 5 years
    @SebMa: F2FS has some major problems with Ubuntu in specific. Haven't had a chance to try it on any other flavors yet. Also, there is this thread you might want to read on it's issues with Ubuntu 16.04: ubuntuforums.org/showthread.php?t=2326934
  • SebMa
    SebMa over 5 years
    @aliasgar Ok, I see. How about nilfs2 ?
  • Admin
    Admin almost 2 years
    For udev .rules file you can also set rotational ATTR to 0 at the same time, if the command above: cat /sys/block/sda/queue/rotational returns 1, even for connected SSD. You should use this rule line: SUBSYSTEM=="block", KERNEL=="sd[a-z]", ATTR{queue/rotational}="0", ACTION=="add|change", ENV{DEVTYPE}=="disk", ATTR{queue/scheduler}="deadline". Credits to this page and Debian wiki.
  • Admin
    Admin almost 2 years
    @hotenov I'm afraid, if you do that, every disk will be using the deadline scheduler, and will have their rotational flag set to 0, regardless of their real status. This may be what you want... or not.
  • Admin
    Admin almost 2 years
    @Totor Yes, I noticed [a-z] and Yes, this is what I want :). But, sure, good remark for users who have several sdX devices (some of them might be rotational). Choose carefully for your system and needs.