Linux核心的檔案預讀readahead,
Linux的檔案預讀readahead,指Linux系統核心將指定檔案的某地區預讀進頁緩衝起來,便於接下來對該地區進行讀取時,不會因缺頁(page fault)而阻塞。因為從記憶體讀取比從磁碟讀取要快很多。預讀可以有效減少磁碟的尋道次數和應用程式的I/O等待時間,是改進磁碟讀I/O效能的重要最佳化手段之一。
維基百科上關於readhead的介紹資料:
readahead is a system call of the Linux kernel that loads a file's contents into the page cache, providing that way a file prefetching technology. When a file is subsequently accessed, its contents are read from the main memory (RAM) rather than from a hard disk drive (HDD), resulting in much lower file access latencies due to much higher performance of the main memory.[1][2]
Many Linux distributions use readahead on a list of commonly used files to speed up booting. In such a setup, if the kernel is booted with the profile boot parameter, it will record all file accesses during bootup and write a new list of files to be read during later boot sequences. This will make additional installed services start faster, because they are not included in the default readahead list.[3]
In Linux distributions that use systemd, readahead binary (as part of the boot sequence) is replaced by systemd-readahead.[4][5] However, support for readahead was removed from systemd in its version 219, being described as unmaintained and unable to provide expected performance benefits.[6]
Certain experimental page-level prefetching systems have been developed to further improve performance.[7]
查看、設定readhead使用命令blockdev。如下所示:
[root@localhost ~]# /sbin/blockdev
Usage:
blockdev -V
blockdev --report [devices]
blockdev [-v|-q] commands devices
Available commands:
--getsz get size in 512-byte sectors
--setro set read-only
--setrw set read-write
--getro get read-only
--getss get logical block (sector) size
--getpbsz get physical block (sector) size
--getiomin get minimum I/O size
--getioopt get optimal I/O size
--getalignoff get alignment offset
--getmaxsect get max sectors per request
--getbsz get blocksize
--setbsz BLOCKSIZE set blocksize on file descriptor opening the block device
--getsize get 32-bit sector count
--getsize64 get size in bytes
--setra READAHEAD set readahead
--getra get readahead
--setfra FSREADAHEAD set filesystem readahead
--getfra get filesystem readahead
--flushbufs flush buffers
--rereadpt reread partition table
查看磁碟的預讀扇區
[root@localhost ~]# /sbin/blockdev --getra /dev/sda
256
[root@localhost ~]# /sbin/blockdev --getra /dev/sdb
256
[root@localhost ~]#
設定磁碟的預讀扇區
[root@localhost ~]# /sbin/blockdev --getra /dev/sda
256
[root@localhost ~]# /sbin/blockdev --setra 2048 /dev/sda
[root@localhost ~]# /sbin/blockdev --getra /dev/sda
2048
[root@localhost ~]# /sbin/blockdev --getra /dev/sdb
256
[root@localhost ~]# /sbin/blockdev --setra 2048 /dev/sdb
[root@localhost ~]# /sbin/blockdev --getra /dev/sdb
2048
[root@localhost ~]#
必須將其寫入設定檔/etc/rc.local,否則重啟就會失效。
[root@localhost ~]# echo '/sbin/blockdev --setra 2048 /dev/sda' >> /etc/rc.local
[root@localhost ~]# more /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/sbin/blockdev --setra 2048 /dev/sda
[root@localhost ~]# echo '/sbin/blockdev --setra 2048 /dev/sdb' >> /etc/rc.local
[root@localhost ~]# more /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/sbin/blockdev --setra 2048 /dev/sda
/sbin/blockdev --setra 2048 /dev/sdb
參考資料:
https://en.wikipedia.org/wiki/Readahead
http://www.hustyx.com/cpp/96/