Direct I/O Invalid Argument
When trying to write Direct I/O to a particular block device, I ran into this ugly error:
# dd if=/dev/zero of=/dev/sdb oflag=direct dd: writing to ‘/dev/sdb’: Invalid argument 1+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000202393 s, 0.0 kB/s
After some investigation, it turns out the cause was the device was actually configured and low level formatted to the newer 4K Native Sector Size (aka 4Kn Advanced Format). Older devices are all 512 byte sector size.
The problem is that the default block size for many applications is still 512 bytes. The solution is easy, once you know the cause. You just simply write blocks in 4K byte size.
# dd if=/dev/zero of=/dev/sdb oflag=direct bs=4k ^C 73063+0 records in 73063+0 records out 299266048 bytes (299 MB) copied, 4.83917 s, 61.8 MB/s
Is My Device 4K Sector Size?
1) fdisk will tell you:
# fdisk /dev/sdb Note: sector size is 4096 (not 512) ...
2) blockdev can tell you:
# blockdev --help --getss get logical block (sector) size --getpbsz get physical block (sector) size # ## 512 mode: # blockdev --getss /dev/sda 512 # blockdev --getpbsz /dev/sda 512 # ## 4Kn mode: # blockdev --getss /dev/sdb 4096 # blockdev --getpbsz /dev/sdb 4096 # ## 512e mode: # blockdev --getss /dev/sdc 512 # blockdev --getpbsz /dev/sdc 4096
3) Your storage vendor's tools should tell you. Many times the storage vendor will also provide tools to low level format to either 512, 512e or 4K
Why 4Kn?
"Larger sectors use the storage surface area more efficiently for large files but less efficiently for smaller files, and enable the integration of stronger error correction algorithms to maintain data integrity at higher storage densities." (source)
Summary:
- Greater storage efficiency for larger files (but less efficient for smaller files)
- Better bandwidth performance (large block read/writes), but IOPS (small block read/writes) will suffer
- Improved error correction algorithms to maintain data integrity at higher storage densities
512e Alternative?
The Operating System would hand down a 512 byte request as usual, but then the storage controller would convert the request to a 4K byte request. This provides the efficiency and data integrity benefits for the physical storage, but may come with a performance hit, due to the emulation and conversion required (especially if not aligned properly).
This mode also allows a stepping stone for storage vendors to move forward with 4K technology, while still supporting older Operating Systems and applications.
You'll also come across the 'Invalid argument' error if you try and make an ISO image of a CD/DVD, since they commonly have block sizes of 2KB (https://www.thomas-krenn.com/en/wiki/Create_an_ISO_Image_from_a_source_CD_or_DVD_under_Linux).
ReplyDeleteSuch descriptions are important.
ReplyDeleteThe article is very easy to understand, I also read many other articles and I found your article has helped a lot of information for me, thank you for sharing.
ReplyDeleteHey friends try sound troubleshooting its best way to fix sound for free.
ReplyDeleteCheck out more interesting facts on https://metrosaga.com/10-english-words-which-are-of-indian-origin/
ReplyDeleteThe article is very easy to understand, I also მაცივრის ხელოსანი read many other articles and I found your article has helped a lot of information for me, thank you for sharing.
ReplyDeleteHi great reading your blog
ReplyDelete