我有一个客户端,该客户端在微型实例上运行 MVC v1 (.NET) 应用程序。在此实例上,我运行了 .NET、IIS 7.5 和 MS SQL Server 2008 来处理该应用程序。客户端报告说,处理每个请求需要将近 10 秒钟。即使加载初始登录页面也需要这么长时间,然后登录也需要这么长时间,等等。
目前运行的实例规格如下:
- 615 MB 内存
- 英特尔至强 CPU E5430 @ 2.66GHz 2.78 GHz
- 64 位
问题在于内存可用性吗?还是处理能力?
我预见到两种选择:
- 更改为最大的实例
- 设置具有两个微实例的 2 层架构
哪一个能给应用程序带来更好的性能?
提前致谢。
答案1
在该实例上运行所有这些肯定会导致一些问题。“小型”实例与“2 微型”实例哪个效果更好是一个成本效益问题。
要找出您的瓶颈,您应该能够从控制面板->管理工具->性能监视器启动性能监视器,并查看哪些资源达到上限 - 很有可能是内存。
如果我没记错的话,除非您想要超过三个全职微型实例,否则“小型”实例不会具有成本效益。
答案2
我不指望有 IO,因为微实例仅在 EBS 上运行,速度很快。据说实例存储比 EBS 慢。但请按照另一个答案中的建议检查性能计数器。
我确实会期待 RAM,因为 615 MB 对于 64 位系统来说并不多。此外,如果您的机器开始交换,您将需要为 EBS 的额外 IO 请求付费,这在经济意义上使情况更加糟糕。
最后请记住,微型实例具有可突发的 CPU,它可以在非常短的突发时间内达到 2 ECU,但平均速度要低得多。我见过一些基准测试,这些基准表明,在长期运行中,微型实例的速度大约是标准小型实例的一半。但我认为这在很大程度上取决于它拥有的邻居服务器有多忙。
因此,对于“其中哪一个将为应用程序提供更好的性能?”这个问题,我认为没有明确的答案,它始终是特定于应用程序的 - 检查它。尝试两个选项,然后决定。对于按小时收费的实例,这样的测试不会花费您太多。
答案3
您没有提到任何有关 IO 子系统的信息,这可能没有帮助,但从您所说的内容来看,我认为这是内存问题,因为 615MB 远远低于该软件堆栈的最低建议内存要求。您应该能够从最基本的任务管理器统计数据中看到这一点。修复它,然后查看 IO,因为它们在低端 VPS/VM 实例上通常也相当差。
答案4
优化查询以尽可能少地使用磁盘。数据库在很大程度上受磁盘访问和缓存内容的控制。通过尽可能多地调整查询(包括添加索引和规范化数据库),您将减少资源占用。
人们忘记了这些机器是在虚拟化环境中运行的。您的虚拟机和物理磁盘访问之间有一个代理。这个代理在这里和那里增加一微秒的机会越少,您的性能就越好。您的应用程序完全有可能在物理主机上运行得非常好,但一旦将其移动到这个虚拟化模型,您就会遇到性能问题。主机的混乱使用效率掩盖了应用程序设计和查询设计中的任何低效率。在移动到虚拟模型时发现这些低效率的情况很常见,尤其是整个数据库系统都虚拟化的模型。
查询优化和数据库规范化将为您带来额外的经济效益。AWS 是一种公用计算环境。您每次访问资源时都需付费。访问磁盘的次数越少,您每月节省的钱就越多。
如果数据库无法修改/规范化或添加索引,我还会考虑为您的 SQL Server 实例提供物理托管。这将修复您的数据库实例的成本模型并提高性能,因为现在您将可以访问一个专用的 DB 主机。您可能需要为 AWS 和 DB 的物理托管提供商之间的字节输入/输出付费。您可能还有其他选择,可以选择同时提供虚拟和物理托管的供应商,例如 Rackspace,这样您就不会受到提供商云的字节输入/输出的影响。