在 Linux 系统中,prefetch(预取)相关的参数主要涉及文件系统预读(readahead)和 CPU 预取优化。以下是主要的 prefetch 相关参数及其调整方法:
# 查看当前预读值(单位为扇区,通常512字节/扇区)
cat /sys/block/sdX/queue/read_ahead_kb
# 设置预读值(例如设置为1024KB)
echo 1024 > /sys/block/sdX/queue/read_ahead_kb
# 查看当前预读设置(单位为文件系统块)
tune2fs -l /dev/sdX | grep 'Read ahead'
# 设置预读块数
tune2fs -O readahead /dev/sdX
tune2fs -r 256 /dev/sdX # 设置预读256个块
# 查看当前硬件预取设置
cat /sys/devices/system/cpu/cpu0/cpuidle/state*/disable
# 禁用/启用硬件预取(需要内核支持)
wrmsr 0x1a4 0xf # 禁用所有硬件预取
wrmsr 0x1a4 0x0 # 启用所有硬件预取
在编程时可以使用GCC内置函数添加预取提示:
__builtin_prefetch(const void *addr, int rw, int locality);
# 查看透明大页(THP)设置(影响预取行为)
cat /sys/kernel/mm/transparent_hugepage/enabled
# 调整内存预取策略
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
# 查看vm内核参数(部分影响预读行为)
sysctl vm | grep read
对于MySQL等数据库,可以调整:
# InnoDB预读参数
innodb_read_ahead_threshold=56
innodb_random_read_ahead=OFF
您是否需要针对特定场景的预取优化建议?