提高 NFS Azure 文件共享性能

本文内容

  1. 适用于
  2. 增加预读大小以提高读取吞吐量
  3. Nconnect
  4. 另请参阅

本文介绍如何提高 NFS Azure 文件共享的性能。

适用于

展开表

文件共享类型SMBNFS
标准文件共享 (GPv2)、LRS/ZRS

No, this article doesn't apply to standard SMB Azure file shares LRS/ZRS.

NFS shares are only available in premium Azure file shares.

标准文件共享 (GPv2)、GRS/GZRS

No, this article doesn't apply to standard SMB Azure file shares GRS/GZRS.

NFS is only available in premium Azure file shares.

高级文件共享 (FileStorage)、LRS/ZRS

No, this article doesn't apply to premium SMB Azure file shares.

Yes, this article applies to premium NFS Azure file shares.

增加预读大小以提高读取吞吐量

Linux 中的 read_ahead_kb 内核参数表示应在顺序读取操作期间“预读”或预提取的数据量。 5.4 之前的 Linux 内核版本将预读值设置为装载的文件系统 rsize(读取缓冲区大小的客户端装载选项)的等效值 15 倍。 这会将预读值设置为足够高,以便在大多数情况下提高客户端顺序读取吞吐量。

但是,从 Linux 内核版本 5.4 开始,Linux NFS 客户端使用默认 read_ahead_kb 值 128 KiB。 此小值可能会减少大型文件的读取吞吐量。 从具有较大预读值的 Linux 版本升级到具有 128 KiB 默认值的版本的客户可能会遇到顺序读取性能下降的问题。

对于 Linux 内核 5.4 或更高版本,建议将 read_ahead_kb 设置为 15 MiB 以提高性能。

若要更改此值,请在 Linux 内核设备管理器 udev 中添加规则来设置预读大小。 执行以下步骤:

  1. 在文本编辑器中,通过输入并保存以下文本来创建 /etc/udev/rules.d/99-nfs.rules 文件:

    输出复制

    SUBSYSTEM=="bdi" \
    , ACTION=="add" \
    , PROGRAM="/usr/bin/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4 == bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes" \
    , ATTR{read_ahead_kb}="15360"
    
  2. 在控制台中,通过以超级用户身份运行 udevadm 命令并重新加载规则文件和其他数据库来应用 udev 规则。 只需运行此命令一次,即可了解新文件。

    Bash复制

    sudo udevadm control --reload
    

Nconnect

Nconnect 是客户端 Linux 装载选项,通过允许在客户端与 NFSv4.1 的 Azure 高级文件服务之间使用更多 TCP 连接来大规模提高性能,同时保持平台即服务 (PaaS) 的复原能力。

nconnect 的优势

借助 nconnect,可以使用更少的客户端计算机大规模提高性能,以降低总拥有成本 (TCO)。 Nconnect 通过在一个或多个 NIC 上使用多个 TCP 通道或者使用一个或多个客户端来提高性能。 如果没有 nconnect,则需要大约 20 台客户端计算机,才能达到最大高级 Azure 文件共享预配大小提供的带宽规模限制 (10 GiB/s)。 使用 nconnect,只需使用 6-7 个客户端即可达到这些限制。 这几乎减少了 70% 的计算成本,同时大规模地提高了 IOPS 和吞吐量,(请参阅表)。

展开表

指标(操作)I/O 大小性能提升
IOPS(写入)64K、1024K3x
IOPS(读取)所有 I/O 大小2-4x
吞吐量(写入)64K、1024K3x
吞吐量(读取)所有 I/O 大小2-4x

先决条件

  • 最新的 Linux 发行版完全支持 nconnect。 对于较旧的 Linux 分发版,请确保 Linux 内核版本为 5.3 或更高版本。
  • 仅当每个存储帐户通过专用终结点使用单个文件共享时,才支持按装载配置。

nconnect 的性能影响

在 Linux 客户端上将 nconnect 装载选项与 NFS Azure 文件共享大规模配合使用时,我们实现了以下性能结果。 有关如何实现这些结果的详细信息,请参阅性能测试配置。

Screenshot showing average improvement in IOPS when using nconnect with NFS Azure file shares.

Screenshot showing average improvement in throughput when using nconnect with NFS Azure file shares.

有关 nconnect 的建议

遵循这些建议,从 nconnect 中获得最佳结果。

设置 nconnect=4

虽然 Azure 文件存储支持将 nconnect 设置为最大设置 16,但我们建议使用最佳设置 nconnect=4 配置装载选项。 目前,超出四个通道后,Azure 文件存储使用 nconnect 没有增益。 事实上,由于 TCP 网络饱和,单个客户端中单个 Azure 文件共享连接的通道超过四个可能会对性能产生负面影响。

仔细调整虚拟机大小

根据工作负载要求,请务必正确调整客户端计算机的大小以避免受到预期网络带宽的限制。 无需多个 NIC 也可实现预期的网络吞吐量。 虽然通常使用具有 Azure 文件存储的常规用途 VM,但根据工作负载需求和区域可用性,可以使用各种 VM 类型。 有关详细信息,请参阅 Azure VM 选择器。

将队列深度保持小于或等于 64

队列深度是存储资源可处理的待处理 I/O 请求数。 建议不要超过最佳队列深度 64。 如果这样做,则不会再看到任何性能提升。 有关详细信息,请参阅队列深度。

Nconnect 按装载配置

如果工作负荷需要从单个客户端使用采用不同 nconnect 设置的一个或多个存储帐户装载多个共享,则我们无法保证这些设置在通过公共终结点装载时会保留。 仅当每个存储帐户通过专用终结点使用单个 Azure 文件共享时,才支持按装载配置,如方案 1 中所述。

方案 1:(支持)使用多个存储帐户通过专用终结点进行 nconnect 按装载配置
  • StorageAccount.file.core.windows.net = 10.10.10.10
  • StorageAccount2.file.core.windows.net = 10.10.10.11
    • Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare1 nconnect=4
    • Mount StorageAccount2.file.core.windows.net:/StorageAccount2/FileShare1
方案 2:(不支持)通过公共终结点进行 nconnect 按装载配置
  • StorageAccount.file.core.windows.net = 52.239.238.8
  • StorageAccount2.file.core.windows.net = 52.239.238.7
    • Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare1 nconnect=4
    • Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare2
    • Mount StorageAccount2.file.core.windows.net:/StorageAccount2/FileShare1

 备注

即使存储帐户解析为其他 IP 地址,也不能保证该地址会保留,因为公共终结点不是静态地址。

方案 3:(不支持)在单个存储帐户上使用多个共享通过专业终结点进行 nconnect 按装载配置
  • StorageAccount.file.core.windows.net = 10.10.10.10
    • Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare1 nconnect=4
    • Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare2
    • Mount StorageAccount.file.core.windows.net:/StorageAccount/FileShare3

性能测试配置

我们使用以下资源和基准测试工具来实现并衡量本文中概述的结果。

  • 单个客户端:具有单个 NIC 的 Azure 虚拟机(DSv4 系列)
  • OS:Linux (Ubuntu 20.40)
  • NFS 存储:Azure 文件存储高级文件共享(预配 30 TiB,设置nconnect=4

展开表

大小vCPU内存临时存储 (SSD)最大数据磁盘数最大 NIC 数预期网络带宽
Standard_D16_v41664 GiB仅限远程存储32812,500 Mbps

基准测试工具和测试

我们使用了 Flexible I/O Tester (FIO),这是一款免费的开源磁盘 I/O 工具,用于基准和压力/硬件验证。 要安装 FIO,请参照 FIO 自述文件中的“二进制软件包”部分,为所选平台进行安装。

虽然这些测试侧重于随机 I/O 访问模式,但使用顺序 I/O 时会获得类似的结果。

高 IOPS:100% 读取

4k I/O 大小 - 随机读取 - 64 队列深度

Bash复制

fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=4k --iodepth=64 --filesize=4G --rw=randread --group_reporting --ramp_time=300

8k I/O 大小 - 随机读取 - 64 队列深度

Bash复制

fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=8k --iodepth=64 --filesize=4G --rw=randread --group_reporting --ramp_time=300
高吞吐量:100% 读取

64k I/O 大小 - 随机读取 - 64 队列深度

Bash复制

fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=64k --iodepth=64 --filesize=4G --rw=randread --group_reporting --ramp_time=300

1024k I/O 大小 - 100% 随机读取 - 64 队列深度

Bash复制

fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=1024k --iodepth=64 --filesize=4G --rw=randread --group_reporting --ramp_time=300
高 IOPS:100% 写入

4k I/O 大小 - 100% 随机写入 - 64 队列深度

Bash复制

fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=4k --iodepth=64 --filesize=4G --rw=randwrite --group_reporting --ramp_time=300

8k I/O 大小 - 100% 随机写入 - 64 队列深度

Bash复制

fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=8k --iodepth=64 --filesize=4G --rw=randwrite --group_reporting --ramp_time=300
高吞吐量:100% 写入

64k I/O 大小 - 100% 随机写入 - 64 队列深度

Bash复制

fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=64k --iodepth=64 --filesize=4G --rw=randwrite --group_reporting --ramp_time=300

1024k I/O 大小 - 100% 随机写入 - 64 队列深度

Bash复制

fio --ioengine=libaio --direct=1 --nrfiles=4 --numjobs=1 --runtime=1800 --time_based --bs=1024k --iodepth=64 --filesize=4G --rw=randwrite --group_reporting --ramp_time=300

nconnect 的性能注意事项

使用 nconnect 装载选项时,应密切评估具有以下特征的工作负载:

  • 单线程和/或使用低队列深度(小于 16)的延迟敏感型写入工作负载
  • 单线程和/或使用低队列深度与较小 I/O 大小的延迟敏感型读取工作负载

并非所有工作负载都需要大规模 IOPS 或吞吐量性能。 对于规模较小的工作负载,nconnect 可能没有意义。 使用下表来确定 nconnect 是否有益于工作负载。 建议使用绿色突出显示的方案,而红色突出显示的方案则不推荐。 黄色突出显示的方案则介于二者之间。

Screenshot showing various read and write I O scenarios with corresponding latency to indicate when nconnect is advisable.

另请参阅

  • 有关装载说明,请参阅将 NFS 文件共享装载到 Linux。
  • 有关装载选项的完整列表,请参阅 Linux NFS 手册页。
  • 有关延迟、IOPS、吞吐量和其他性能概念的信息,请参阅了解 Azure 文件存储性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/359084.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指针的深入理解(二)

这节主要复习函数指针 函数指针 函数指针的标志就是int (* ) (数据类型), 是储存函数的地址的指针变量。函数名就是的首地址。我们平常使用的函数名就是函数的地址: 由此可以发现,我们可以通过函数的地址来使用函数。 那么我们就可以知道函…

什么是Vue Vue入门案例

一、什么是Vue 概念:Vue (读音 /vjuː/,类似于 view) 是一套 构建用户界面 的 渐进式 框架 Vue2官网:Vue.js 1.什么是构建用户界面 基于数据渲染出用户可以看到的界面 2.什么是渐进式 所谓渐进式就是循序渐进,不一定非得把V…

NC开发客户端(前端)连接启动失败can‘t connect to server, please wait

效果图 解决方法 IP地址和端口要对应 1-IP地址中间启动,肯定是这个127.0.0.1 2-端口号,要对应中间件启动在控制台输出的端口 或者是在home目录-》bin-》sysConfig.bat这里面的服务器, 里面可以看到对应启动ip地址和端口

2023年春秋杯网络安全联赛冬季赛_做题记录

可信计算 基于挑战码的双向认证1 可信计算赛题-双向认证挑战模式.docx 使用命令进行SSH登录上去 ssh player8.147.131.156 -p 18341 # 记得加上-p参数指定端口,不然默认的是22端口看见word文档的提示,先尝试一下 直接获得了flag1 web 魔术方…

Linux:理解信号量以及内核中的三种通信方式

文章目录 共享内存的通信速度消息队列msggetmsgsndmsgrcvmsgctl 信号量semgetsemctl 内核看待ipc资源单独设计的模块ipc资源的维护 理解信号量总结 本篇主要是基于共享内存,延伸出对于消息队列和信号量,再从内核的角度去看这三个模块实现进程间通信 共享…

SpringCloudStream整合MQ

目录 概念 快速搭建SCS环境 一秒切换MQ 组件 1. Binder 2. Binding 3. Message 分组消费 概念 Spring Cloud Stream(SCS) 的主要目标是一套代码,兼容所有MQ, 降低MQ的学习成本,提供一致性的编程模型,让开发者能更…

数据可视化练习

文章目录 试题示例 试题示例 绘制下图所示的表格 根据下表的数据,将班级名称一列作为x轴的刻度标签,将男生和女生两列的数据作为刻度标签对应的数值,使用bar()函数绘制下图所示的柱形图。 方式一 import numpy as np import matplotlib.p…

web自动化搞定文件上传

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

Spring 学习1

1、什么是Spring Spring 是一款主流的 Java EE 轻量级开源框架 ,Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言…

AI算力专题:算力系列之四-各省算力规划建设梳理-绿色低碳高质量发展-部署算力建设AI产业研究

今天分享的是AI算力系列深度研究报告:《AI算力专题:算力系列之四-各省算力规划建设梳理-绿色低碳高质量发展-部署算力建设AI产业研究》。 (报告出品方:中泰证券) 报告共计:40页 数据中心能耗情况 随着越…

java的面向对象编程(oop)——认识接口

前言: 打好基础,daydayup! 接口 接口概述 java提供一个关键字interface,用这个关键字可以定义出特殊结构:接口 接口格式: public interface 接口名{//成员变量(常量)//成员方法(抽…

Dragons

题目链接&#xff1a; Problem - 230A - Codeforces 解题思路&#xff1a; 用结构体排序就好&#xff0c;从最小的开始比较&#xff0c;大于就加上奖励&#xff0c;小于输出NO 下面是c代码&#xff1a; #include<iostream> #include<algorithm> using namespac…

【2024.1.30练习】李白打酒加强版(25分)

题目描述 题目思路 在最多数据的情况下&#xff0c;有100个店100朵花&#xff0c;总情况为的天文数字&#xff0c;暴力枚举已经不可能实现&#xff0c;考虑使用动态规划解决问题。最后遇到的一定是花&#xff0c;所以思路更倾向于倒推。 建立二维数组&#xff0c;容易联想到为…

软件个性化选型:制造企业如何选择适合自身的工单管理系统-亿发

企业制造业是实体经济中非常重要和基础的组成部分&#xff0c;直接关系到国家经济的血脉。然而&#xff0c;传统制造业在生产与管理上所采用的老一套方法和经验已不再适应当下的发展需求。信息化、数字化和智能化被视为制造企业的必然趋势。要想在竞争激烈的市场中永立潮头&…

都2024年了,谁还在逛良品铺子?

作者 | 辰纹 来源 | 洞见新研社 2019年年初&#xff0c;良品铺子举办了一场高端零食战略发布会&#xff0c;当时还花重金请来顶流明星为品牌代言&#xff0c;在强化“高端零食”定位的同时&#xff0c;良品铺子坚定的表示&#xff0c;要“抛弃价格战”。 时任良品铺子董事长杨…

24小时涨粉10w+的AI小游戏-哄哄模拟器

近年来&#xff0c;随着chatGPT的爆火&#xff0c;一系列的AI应用应运而生。比如&#xff1a;AI绘画&#xff0c;AI写作等。今天我们来看看最近很火的一个AI小游戏-哄哄模拟器。 1. 试玩体验 这款游戏名叫“哄哄模拟器”&#xff0c;体验地址为&#xff1a;https://hong.grea…

RGMII接口介绍

RGMII接口概述 RGMII全称为Reduced Gigabit Media Independent Interface&#xff0c;是一种网络接口标准&#xff0c;用于千兆以太网芯片与PHY芯片之间的接口标准。RGMII接口的设计目的是为了减少I/O的数量&#xff0c;尽可能减小网卡PCB占用面积&#xff0c;同时提高数据传输…

Nacos服务注册源码:客户端

入口 我们就拿nacos自己example下的NamingExample来做测试 public class NamingExample {public static void main(String[] args) throws NacosException, InterruptedException {Properties properties new Properties();properties.setProperty("serverAddr", …

如何在DBeaver中重命名数据库

前言 DBeaver是一款强大的开源通用数据库管理和开发工具&#xff0c;支持多种数据库类型。在某些数据库系统中&#xff0c;你可以直接通过DBeaver的图形界面来重命名数据库名称。本文将详细介绍如何在DBeaver中进行数据库重命名操作。 重要提示&#xff1a; 对于不同的数据库…

Leetcode—2396. 严格回文的数字【中等】

2024每日刷题&#xff08;一零六&#xff09; Leetcode—2396. 严格回文的数字 算法思想 实现代码 class Solution { public:bool isStrictlyPalindromic(int n) {return false;} };运行结果 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&…