Linux内核5.4版本之后客户端的NFSv3文件系统顺序读业务场景性能不符合预期,如何处理?
问题描述
在Linux内核5.4版本之后的客户端上挂载NFSv3协议的文件系统,使用cp或dd等方式触发顺序读业务场景,读带宽与每秒请求数明显不符合预期。
问题原因
预读机制:访问内存的速度比访问硬盘或者网络存储快很多,如果每一次访问文件数据都要从磁盘读取数据,就会导致非常严重的时延及等待问题,因此Linux为了提高读取性能,通过预读机制,将文件数据提前预读缓存到内存中,从而大大加快读取性能。参数“read_ahead_kb”为操作系统读业务可提前读取的最大KB数。
在Linux内核5.4版本前,“read_ahead_kb”被设置为挂载参数中rsize的15倍,如果不另外修改挂载参数,则rsize默认设置为1M,“read_ahead_kb”即为15M;在内核5.4及之后版本“read_ahead_kb”被固定为128 KB,导致顺序读场景下预读机制基本不会触发甚至不触发。
因此可以根据上层业务场景,适当调整参数“read_ahead_kb”,以优化大文件顺序读场景的性能。在小文件读取场景中将该值调整过大,可能会导致预读浪费,进而浪费带宽。
解决方法
- 执行以下命令,查看当前文件系统的预读参数值。
cat /sys/class/bdi/$(mountpoint -d 挂载点)/read_ahead_kb
例如:
cat /sys/class/bdi/$(mountpoint -d /localfolder)/read_ahead_kb
回显结果如下所示:128
- 执行以下命令,评估调整该挂载点的预读量配置。
sudo sh -c 'echo 预读量 > /sys/class/bdi/$(mountpoint -d 挂载点)/read_ahead_kb'
例如:
sudo sh -c 'echo 15360 > /sys/class/bdi/$(mountpoint -d /localfolder)/read_ahead_kb'
- 重新执行步骤1操作,查看当前文件系统的预读参数值是否修改成功。
cat /sys/class/bdi/$(mountpoint -d 挂载点)/read_ahead_kb
例如:cat /sys/class/bdi/$(mountpoint -d /localfolder)/read_ahead_kb
回显结果如下所示:15360
如果您挂载了多个NFSv3文件系统,请重复执行上述步骤修改每一个挂载设置的预读参数。