记一次解决 AWS EBS Volume 访问慢的问题

news/2024/11/5 22:29:45/文章来源:https://www.cnblogs.com/LexLuc/p/18528998

问题缘起

最近在 AWS 上部署深度学习模型时,遇到了一个让人困惑的现象:明明是配置很高的 EC2 实例,为什么从AMI Launch之后,首次加载模型的速度出奇地慢(花了我半个多小时,一般整个推理也不到1分钟)?更奇怪的是,第二次加载时速度就恢复正常了。这个问题困扰了我好一阵子,直到深入研究 AWS 的技术文档才恍然大悟。

问题排查

通过查阅 AWS EBS 的技术文档,终于找到了问题的症结所在。原来,当我们从 Snapshot 创建新的 Volume 时,AWS 采用了一种"延迟加载"的机制:存储块并不会立即从 Amazon S3 完整下载到 Volume,而是在首次访问时才会触发下载。这种机制虽然能让 Volume 创建过程变快,但代价就是首次访问时会遇到明显的延迟。

正如 AWS 文档所说:

对于从 Snapshot 创建的 Volume,存储块必须从 Amazon S3 拉取并写入到 Volume 中,然后才能访问它们。这个预加载动作需要时间,会导致首次访问时 I/O 操作的延迟显著增加。
参考

解决方案

既然找到了原因,解决方案就很明确了:我们需要提前预热(Pre-warm)这个 Volume。说白了,就是在正式使用之前,先触发一次完整的数据读取,让所有数据块都预先加载到位。

这里介绍两种预热方法:

方案一:使用 dd 命令(简单但稍慢)

这是 Linux 系统自带的命令,用起来直截了当:

sudo dd if=/dev/nvme0n1 of=/dev/null bs=1M

方案二:使用 fio 工具(推荐,更快更强大)

fio 需要先安装,但功能更强大:

sudo fio --filename=/dev/nvme0n1 --rw=read --bs=1M --iodepth=32 --ioengine=libaio --direct=1 --name=volume-initialize

安装方法:

  • Amazon Linux:sudo yum install -y fio
  • Ubuntu:sudo apt-get install -y fio

fio 命令看起来参数不少,我们来一一解读:

  • --filename=/dev/nvme0n1:指定要预热的设备
  • --rw=read:只读模式
  • --bs=1M:每次读取block size为 1MB
  • --iodepth=32:并行处理 32 个请求
  • --ioengine=libaio:使用异步 I/O
  • --direct=1:直接读取,绕过系统缓存

如何监控预热进度?

预热过程可能持续几分钟到几小时不等。这里分享两个监控方法:

  1. fio 命令中加入 --status-interval=1 参数,每秒显示进度:
sudo fio --filename=/dev/nvme0n1 --rw=read --bs=1M --iodepth=32 --ioengine=libaio --direct=1 --name=volume-initialize --status-interval=1
  1. 另开一个终端窗口,用 iostat 命令监控:
sudo iostat -x nvme0n1 1

注意事项

在动手操作前,有几点需要特别注意:

  1. 确认设备名称:使用 lsblkdf -h 仔细核对设备名,就像确认钥匙是否对应正确的锁。

  2. 谨慎处理 Root Volume:如果是根目录所在的 Volume(/),要格外小心,确保只执行读取操作。

  3. 耐心等待:预热时间取决于几个因素:

    • EC2 的网络带宽
    • Volume 的 IOPS 配置
    • Volume 的大小

知识要点总结

  1. 为什么选 fio

    • 支持多线程,速度更快
    • 异步 I/O,效率更高
    • 进度监控更直观
    • 可配置项更丰富
  2. 最佳实践

    • 从 Snapshot 创建新 Volume 后,最好立即进行预热
    • 选择业务低峰期进行预热
    • 可以将预热步骤加入系统初始化脚本
  3. 收益

    • 消除首次访问的性能延迟
    • 提供稳定一致的 I/O 性能
    • 改善用户体验

结语

这个问题的解决过程,让我对 AWS EB预热这个解决方案虽然简单,却能带来立竿见影的效果。

希望这篇文章能帮助遇到类似问题的同学。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SPSS 26 下载与安装教程

SPSS(Statistical Product and Service Solutions),即“统计产品与服务解决方案”,是社会科学研究领域内的翘楚。本教程提供了丰富的数据管理、描述统计、推断统计以及回归分析等功能介绍,界面友好,易学易用; 1、安装包 SPSS 26: 链接:https://pan.quark.cn/s/87f4464…

20222414 2024-2025-1 《网络与系统攻防技术》实验四实验报告

一、实验内容 1.恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用…

[极客大挑战 2019]EasySQL 1 -Xxiaoma解题

0X01:先上解题过程 1:遇到这种题,第一个想到的就是sql注入,直接万能密码就得到flag了。 账户名为:1 or 1=1 # 密码随便输入 即可得到flag0X02:sql注入万能密码原理 SQL注入是一种安全漏洞,攻击者通过在应用程序的输入中插入或者操作SQL命令来改变原有SQL语句的结构,从而…

RISK ANALYSIS

人类健康和安全风险,微生物风险工程,数学建模,风险表征,风险沟通,风险管理和决策,风险感知,可接受性和伦理法律和监管政策,生态风险。@目录一、征稿简介二、重要信息三、服务简述四、投稿须知 一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述 …

20222303 2024-2025-1 《网络与系统攻防技术》实验四实验报告

一、实验内容 (一)恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)…

20222417 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 1.1恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用超…

Molecular Cellular Biomechanics

主要涉及生物力学领域,包括生物分子、细胞、组织和器官的力学研究。@目录一、征稿简介二、重要信息三、服务简述四、投稿须知 一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述 主要涉及生物力学领域,包括生物分子、细胞、组织和器官的力学研究。 四、…

.NET周刊【11月第1期 2024-11-03】

国内文章 .NET 9 AOT的突破 - 支持老旧Win7与XP环境 https://www.cnblogs.com/lsq6/p/18519287 .NET 9 引入了 AOT 支持,使得应用程序能够在编译时优化,以在老旧 Windows 系统上运行。这项技术通过静态编译,消除运行时的 JIT 编译,加速程序执行。尽管 Windows 7 和 XP 已不…

认识鸿蒙Context

Context是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用文件路径)、area(文件分区)等,以及应用的一些基本方法,例如createBundleContext()、getApplicationContext()等。UIAbility组件和…

鸿蒙项目实战(一):实现首页动态Tab

需求:存在n个tab页,支持动态设置显示指定某几个tab实现如下: 一、定义一个类,定义所有的tab页数据 知识点: 1、类使用export修饰,可以让其他模块引入 2、类内字段 设置 static readonly ,只读静态字段 3、图标文件存于src->main->resources->base->media目录…

关于注册登录注销的jsp实现

这是效果图 代码实现中的数据库建表连接,参考之前的博客, 这里写几个关键点的实现方法这里是添加了点击事件,有两个好处其一是两个图标一直了都是按钮,ui更加美观一点、其二是可以在函数部分添加弹窗比如先弹出登录成功的窗口再提交表单,在期中考试中有地方会用到这里是判…

用户注册案例--mvc架构的实现

用户注册案例--浅谈servlet 本案例为用户注册案例,同时介绍一部分之前经常用得到servlet的知识.servlet是javaEE的技术规范之一. 基于MCV架构的分析 1.dao层在mapper代理文件中写入insert的操作,对于成功注册的用户直接写入数据库,以及查询操作判断用户名是否已经存在User getU…