文档首页/ 弹性文件服务 SFS/ 常见问题/ 其他类/ Linux内核5.4版本之后客户端的NFSv3文件系统顺序读业务场景性能不符合预期,如何处理?
更新时间:2024-10-09 GMT+08:00
分享

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”,以优化大文件顺序读场景的性能。在小文件读取场景中将该值调整过大,可能会导致预读浪费,进而浪费带宽。

解决方法

  1. 执行以下命令,查看当前文件系统的预读参数值。

    cat /sys/class/bdi/$(mountpoint -d 挂载点)/read_ahead_kb

    例如:

    cat /sys/class/bdi/$(mountpoint -d /localfolder)/read_ahead_kb
    回显结果如下所示:
    128

  2. 执行以下命令,评估调整该挂载点的预读量配置。

    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'

  3. 重新执行步骤1操作,查看当前文件系统的预读参数值是否修改成功。

    cat /sys/class/bdi/$(mountpoint -d 挂载点)/read_ahead_kb

    例如:
    cat /sys/class/bdi/$(mountpoint -d /localfolder)/read_ahead_kb
    回显结果如下所示:
    15360

    如果您挂载了多个NFSv3文件系统,请重复执行上述步骤修改每一个挂载设置的预读参数。

相关文档