在amazon ec2实例中处理I / O请求
学习节点后,JavaScript和所有其余的困难的方式,我终于要释放我的第一个Web应用程序。 所以我订阅了amazon web services,并创build了一个微型实例,计划在第一年的免费层 ,让我的应用程序提供给世界。
我更关心隐藏成本。 我知道,免费层每月为Amazon EC2 EBS提供100万次I / O请求。
事情是,我开始testing我的应用程序一个EC2实例来检查一切运行正常; 而且我已经有超过10万个I / O请求 。 我基本上是迄今为止唯一使用它的实例 ( 实例运行37小时 )。
所以我很担心如果我的应用程序获得一些stream量会发生什么事情,而且我不想在本月底结束一个巨大的意外账单。
我觉得很奇怪,因为我主要服务于静态的东西,而我的服务器端代码包括:
- 从客户端接收search请求
- 1个http请求到一个网站
- 1 https请求的YouTube的API
- 将数据保存到mongoDB
- 将结果发送给客户端
你有什么build议,如何大幅度减less我的IO? 我目前还没有使用其他亚马逊服务,也许我错过了什么?
或者,也许亚马逊免费层在我的情况下不够,但那么它可以足够呢? 我的意思是,我的应用程序毕竟是非常简单的。
我很乐意为您提供任何帮助
谢谢!
您没有提及您的应用的总访问次数。 所以我假设你有相当less的访问。
什么是I / O请求? 单个I / O请求是到达EBS卷的读取/写入指令。 谨防! 大量读/写的执行被分成多个小块,这是卷的块大小。
高I / O的可能原因:
- 你的应用程序使用大量的RAM。 达到限制后,操作系统会不断从磁盘交换区开始交换内存。
- 这很可能是mongoDBsearch的问题。 mongoDBsearch可以是内部冗长的复杂查询。 从这个问题的答案之一,这个人正在使用mySQL,并在24天内,他造成了10亿I / O请求。 所以1数据库search可以是很多的I / O请求。
- caching被禁用,或者你写/修改大量的文件。 你提到你正在testing。 免费teir是不适合开发的东西。
你应该阅读这个 ,以防你想知道自由层到期后会发生什么。
我最近遇到类似的情况,logging非常高的I / O请求率的网站几乎没有stream量。 罪魁祸首似乎是@prajwalkman发现在微型实例上testingChef部署的一个变种。
我没有使用厨师,但我一直在使用boto3,Docker和Git在微型实例内自动“构build”testing图像。 每次我通过我的testing脚本时,都会创build一个新的映像,我不小心在boto3 run_instance命令的VolumeType参数上读取有关默认设置的详细信息 。 每个testing图像都是用“标准”卷types构build的,根据目前的EBS定价 ,按照0.05美元/百万个I / O的速率进行计费 。 而'gp2'通用存储器每个月每GB的平均成本为0.10美元,不需要额外的I / O费用。
随着less数精简docker集装箱总共2GB,在1.3GB的亚马逊ecs优化ami之上,我的存储是在免费层使用。 因此,一旦我将脚本的blockdevicemappings设置中的volumetype属性修改为“gp2”,我的服务器就不再有I / O问题。
在此之前,在不到一周的时间里,不断下载Docker镜像和git repos产生了近10万个I / O。
微型实例和免费层是为了testing他们的产品,而不是一个自由的方式来承载您的网站/ Web应用程序。
您可能需要在月底付钱,但是我真的怀疑您是否可以通过使用其他公司进行托pipe而减less支付。 AFAIK AWS真的是价格图表的底部。
至于IO请求本身,很难给出通用的build议。 我曾经处于一个微观实例嘲讽IO请求荒谬的境地。 原来testing在EC2上的厨师部署是一个坏主意。
I / O请求必须与EBS卷的读写块有关。 你可以通过在内存中使用尽可能多的caching来减less这一点。 微型实例只有大约613 MB的可用内存,所以在这里你可能无法做很多事情。
好吧,所以看起来I / O请求与EBS卷相关,并且caching可能会减less它。
我没有考虑的事情,但我所做的所有的操作让我的应用程序运行。 我更新了linux映像,安装了节点和npm,几个模块,mongodb,…
这可能是I / O的主要原因。 在过去的几天中,服务器的闲置数量一直没有增长。