allocators.rst 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. .. SPDX-License-Identifier: GPL-2.0
  2. Block and Inode Allocation Policy
  3. ---------------------------------
  4. ext4 recognizes (better than ext3, anyway) that data locality is
  5. generally a desirably quality of a filesystem. On a spinning disk,
  6. keeping related blocks near each other reduces the amount of movement
  7. that the head actuator and disk must perform to access a data block,
  8. thus speeding up disk IO. On an SSD there of course are no moving parts,
  9. but locality can increase the size of each transfer request while
  10. reducing the total number of requests. This locality may also have the
  11. effect of concentrating writes on a single erase block, which can speed
  12. up file rewrites significantly. Therefore, it is useful to reduce
  13. fragmentation whenever possible.
  14. The first tool that ext4 uses to combat fragmentation is the multi-block
  15. allocator. When a file is first created, the block allocator
  16. speculatively allocates 8KiB of disk space to the file on the assumption
  17. that the space will get written soon. When the file is closed, the
  18. unused speculative allocations are of course freed, but if the
  19. speculation is correct (typically the case for full writes of small
  20. files) then the file data gets written out in a single multi-block
  21. extent. A second related trick that ext4 uses is delayed allocation.
  22. Under this scheme, when a file needs more blocks to absorb file writes,
  23. the filesystem defers deciding the exact placement on the disk until all
  24. the dirty buffers are being written out to disk. By not committing to a
  25. particular placement until it's absolutely necessary (the commit timeout
  26. is hit, or sync() is called, or the kernel runs out of memory), the hope
  27. is that the filesystem can make better location decisions.
  28. The third trick that ext4 (and ext3) uses is that it tries to keep a
  29. file's data blocks in the same block group as its inode. This cuts down
  30. on the seek penalty when the filesystem first has to read a file's inode
  31. to learn where the file's data blocks live and then seek over to the
  32. file's data blocks to begin I/O operations.
  33. The fourth trick is that all the inodes in a directory are placed in the
  34. same block group as the directory, when feasible. The working assumption
  35. here is that all the files in a directory might be related, therefore it
  36. is useful to try to keep them all together.
  37. The fifth trick is that the disk volume is cut up into 128MB block
  38. groups; these mini-containers are used as outlined above to try to
  39. maintain data locality. However, there is a deliberate quirk -- when a
  40. directory is created in the root directory, the inode allocator scans
  41. the block groups and puts that directory into the least heavily loaded
  42. block group that it can find. This encourages directories to spread out
  43. over a disk; as the top-level directory/file blobs fill up one block
  44. group, the allocators simply move on to the next block group. Allegedly
  45. this scheme evens out the loading on the block groups, though the author
  46. suspects that the directories which are so unlucky as to land towards
  47. the end of a spinning drive get a raw deal performance-wise.
  48. Of course if all of these mechanisms fail, one can always use e4defrag
  49. to defragment files.