- How do I determine the block size for ext4 and btrfs filesystems?
- 3 Answers 3
- Blocks, block devices and block sizes
- Contents
- Block sizes
- Disk block sizes
- File system block sizes
- Kernel block size
- Applications
- vmstat
- iostat
- Benchmarking I/O
- How to.
- Find out the size of a block device
- Find out the file system stored on a block device
- Find out the elevator algorithm
- Associated commands
- See also
- How to find block size in Linux and Unix
- Surendra Anne
- Latest posts by Surendra Anne (see all)
- Block devices and block sizes
- Contents
- What is a block device
- Block sizes
- Disk block sizes
- File system block sizes
- Kernel block size
- Associated commands
- See also
- External links
How do I determine the block size for ext4 and btrfs filesystems?
I’m looking for the commands that will tell me the allocation quantum on drives formatted with ext4 vs btrfs. Background: I am using a backup system that allows users to restore individual files. This system just uses rsync and has no server-side software, backups are not compressed. The result is that I have some 3.6TB of files, most of them small. It appears that for my data set storage is much less efficient on a btrfs volume under LVM than it is on a plain old ext4 volume, and I suspect this has to do with the minimum file size, and thus the block size, but I have been unable to figure out how to get those sizes for comparison purposes. The btrfs wiki says that it uses the «page size» but there’s nothing I’ve found on obtaining that number.
Am I the only one that finds it strange that btrfs is under lvm? I’m more used to zfs, but I’m pretty sure btrfs, like zfs, also optimizes if it’s configured full stack (both volume and fs). Anyway, I seem to remember btrfs can provide better volume infrastructure than lvm.
3 Answers 3
You’ll want to look at the data block allocation size, which is the minimum block that any file can allocate. Large files consist of multiple blocks. And there’s always some «waste» at the end of large files (or all small files) where the final block isn’t filled entirely, and therefore unused.
As far as I know, every popular Linux filesystem uses 4K blocks by default because that’s the default pagesize of modern CPUs, which means that there’s an easy mapping between memory-mapped files and disk blocks. I know for a fact that BTRFS and Ext4 default to the page size (which is 4K on most systems).
On ext4, just use tune2fs to check your block size, as follows (change /dev/sda1 to your own device path):
[root@centos8 ~]# tune2fs -l /dev/sda1 |grep "^Block size:" Block size: 4096 [root@centos8 ~]#
On btrfs, use the following command to check your block size (change /dev/mapper/cr_root to your own device path, this example simply uses a typical encrypted BTRFS-on-LUKS path):
sudo btrfs inspect-internal dump-super -f /dev/mapper/cr_root | grep "^sectorsize"
Blocks, block devices and block sizes
A block device is a device you can read blocks from. For example hard disks, cdrom drives and floppies are block devices, but not the keyboard. You can receive data from the keyboard and regard them as blocks, but you cannot seek on the keyboard. You can tell a hard disk «give me block 5433», then block 7707, then block 1807 and you cannot do this with a keyboard, so, a keyboard is no block device.
Contents
Block sizes
It is important to understand the ideas behind the block sizes.
Disk block sizes
Typically, a hard disk cannot read less than 512 bytes, if you want to read less, read 512 bytes and discard the rest. This is why dd reads one block à 512 bytes in the following example:
tweedleburg:~ # dd if=/dev/sda1 of=/dev/null count=1 1+0 records in 1+0 records out 512 bytes (512 B) copied, 1.8977e-05 s, 27.0 MB/s
File system block sizes
On the other hand, every file system needs to split up a partition into blocks to store files and file parts. This is why there is a different block size for a file system as you can see here:
$ stat -f . File: "." ID: 84bc409db75bdd32 Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 2531650 Free: 1704179 Available: 1570650 Inodes: Total: 647168 Free: 567361
So, if you store a file in this file system, it will be stored in a 4096-byte-block, that means, even if your file only contains 6 bytes, it will take away 4096 bytes from your disk’s capacity:
$ df . Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 10126600 3309884 6282600 35% / $ echo hello>world $ ls -l world -rw-r--r-- 1 thorsten_staerk_de thorsten_staerk_de 6 Apr 1 06:17 world $ df . Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 10126600 3309888 6282596 35% / $ du -sch world 4.0K world 4.0K total
Kernel block size
Also the kernel has its own block size. This is relevant e.g. for vmstat. In the vmstat man page you find the statement
All linux blocks are currently 1024 bytes.
So, again another block size when you work with vmstat. This is the block size the Linux kernel uses internally for caching and buffering. It is the most prominent of all block sizes.
Applications
vmstat
iostat
The difference between buffered I/O and direct I/O is that direct I/O does not use the operating system cache. During the open syscall, you can say that you want direct I/O. More info.
The difference between async I/O and sync I/O is that async I/O reads/writes from/to a file without waiting for the data to actually arrive, but rather having the data sent to a network socket. You must use libaio for this. More info.
Benchmarking I/O
How to.
Find out the size of a block device
To find out the size of the block device /dev/sda:
Find out the file system stored on a block device
A file system will typically be stored in a partition, not directly in a block device. To find all partitions on /dev/sda use
To find out what file system is stored on /dev/sda1 use
Find out the elevator algorithm
The elevator algorithm can be found like this:
cat /sys/devices/platform/host7/session1/target7\:0\:0/7\:0\:0\:0/block/sdi/queue/scheduler noop anticipatory [deadline] cfq
In this case, the deadline elevator algorithm is active.
Or it may be found like this:
cat /sys/class/block/sdb/queue/scheduler noop deadline [cfq]
You can switch the scheduler like this:
# cat /sys/class/block/sdb/queue/scheduler noop deadline [cfq] # echo "noop">/sys/class/block/sdb/queue/scheduler # cat /sys/class/block/sdb/queue/scheduler [noop] deadline cfq
Associated commands
- dd
- vmstat
- iostat
- stat
- fdisk
- hwinfo —block
- hwinfo —partition
- file -s /dev/sda : finds out the filesystem type of /dev/sda
See also
How to find block size in Linux and Unix
This a small how-to on getting block size of a file system in your Linux machine. To go in to that info we have to learn bit information about file-system.
In simple, it’s a way we write data on to Disks is called as file-system. There are many File-systems supported by Linux.
What is block size in Linux?
A block is a sequence of bit or Bytes with a fixed length ie 512 bytes, 4kB, 8kB, 16kB, 32kB etc.
blockdev --getbsz partition
# blockdev --getbsz /dev/sda1 4096
So the block size of this file system is 4kB.
Surendra Anne
Mr Surendra Anne is from Vijayawada, Andhra Pradesh, India. He is a Linux/Open source supporter who believes in Hard work, A down to earth person, Likes to share knowledge with others, Loves dogs, Likes photography. He works as Devops Engineer with Taggle systems, an IOT automatic water metering company, Sydney . You can contact him at surendra (@) linuxnix dot com.
Latest posts by Surendra Anne (see all)
- Docker: How to copy files to/from docker container — June 30, 2020
- Anisble: ERROR! unexpected parameter type in action: Fix — June 29, 2020
- FREE: JOIN OUR DEVOPS TELEGRAM GROUPS — August 2, 2019
- Review: Whizlabs Practice Tests for AWS Certified Solutions Architect Professional (CSAP) — August 27, 2018
- How to use ohai/chef-shell to get node attributes — July 19, 2018
Block devices and block sizes
Blocks, block devices and block sizes must be considered together.
Contents
What is a block device
A block device is a device you can read blocks from. For example hard disks, cdrom drives and floppies are block devices, but not the keyboard. You can receive data from the keyboard and regard them as blocks, but you cannot seek on the keyboard. You can tell a hard disk «give me block 5433», then block 7707, then block 1807 and you cannot do this with a keyboard, so, a keyboard is no block device.
Block sizes
It is important to understand the ideas behind the block sizes.
Disk block sizes
Typically, a hard disk cannot read less than 512 bytes, if you want to read less, read 512 bytes and discard the rest. This is why dd reads one block à 512 bytes in the following example:
tweedleburg:~ # dd if=/dev/sda1 of=/dev/null count=1 1+0 records in 1+0 records out 512 bytes (512 B) copied, 1.8977e-05 s, 27.0 MB/s
File system block sizes
On the other hand, every file system needs to split up a partition into blocks to store files and file parts. This is why there is a different block size for a file system as you can see here:
tweedleburg:/mnt/sdb2 # stat -f . File: "." ID: 236d62321492c2ce Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 76899893 Free: 8380419 Available: 4474114 Inodes: Total: 39075840 Free: 38013010
So, if you store a file in this file system, it will be stored in a 4096-byte-block, that means, even if your file only contains 5 bytes, it will take away 4096 bytes from your disk’s capacity:
tweedleburg:/mnt/sdb2 # df . Filesystem 1K-blocks Used Available Use% Mounted on /dev/sdb2 307599572 274077896 17896456 94% /mnt/sdb2 tweedleburg:/mnt/sdb2 # echo hallo>welt tweedleburg:/mnt/sdb2 # df . Filesystem 1K-blocks Used Available Use% Mounted on /dev/sdb2 307599572 274077900 17896452 94% /mnt/sdb2 tweedleburg:/mnt/sdb2 # du -csh welt 4.0K welt 4.0K total
Kernel block size
Also the kernel has its own block size. This is relevant e.g. for vmstat. In the vmstat man page you find the statement
All linux blocks are currently 1024 bytes.
So, again another block size when you work with vmstat. This is the block size the Linux kernel uses internally for caching and buffering. It is the most prominent of all block sizes.