
# 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
   ```
   ![](https://support.huaweicloud.com/sfs_faq/public_sys-resources/note_3.0-zh-cn.png)
   如果您挂载了多个NFSv3文件系统，请重复执行上述步骤修改每一个挂载设置的预读参数。
   
   
 
