哪个更贵(以美元计):数据库内存还是处理能力?

Posted

技术标签:

【中文标题】哪个更贵(以美元计):数据库内存还是处理能力?【英文标题】:Which is more expensive (in $): database memory or processing power? 【发布时间】:2012-08-02 03:36:18 【问题描述】:

这是一个相当抽象的问题,我希望它在范围内。

我的 Web 开发编码职业生涯大约有 5 个月。我发现 CPU 和存储资源之间经常存在紧张关系。简而言之,您可以少用一种,多用另一种,反之亦然(然后考虑速度)。我现在要部署我的第一个应用程序进行生产,所以这个平衡现在是真正的美元和美分的问题。事情是这样的:我真的不知道我应该寻找什么样的平衡。

这里有一些突出的例子可以说明在不同情况下要达到的平衡。

背景

我正在开发一个在文本之间有很多差异的应用程序。用户将调用包含以 html 显示的差异的页面。很多。

第一个案例

我应该在每次显示页面时运行 diff,还是应该运行 diff 一次、存储它并在每次显示页面时调用它?

第二种情况

我编写了一个总结差异的算法。它大约有 110 行代码,它使用 4 或 5 个循环和子循环。同样,我应该运行一次并存储结果,以便以后可以调用它们,还是应该在每次显示页面时运行算法?

也很想听听您对用于量化余额的最佳工具的看法。

【问题讨论】:

这是一个不可能肯定回答的问题。在测试服务器上部署您的应用程序并运行大量常见用例。查看您使用了多少空间与多少 CPU 时间并进行计算。我的直觉认为 CPU 时间比存储更昂贵,但直觉无法替代分析。 听起来它会受 CPU 限制,即它将使用比任何其他资源更多的 CPU。如果可以的话,减少你必须做的嵌套循环的数量和你通常执行的循环的数量。另外,我想说只在必要时生成差异,例如,当文本更改时。最后,存储非常便宜。从 Amazon S3 开始,它是每 GB 12.5 美分。您的里程可能会因 CPU 和内存成本而异 为什么很难将“很多”写成两个不同的词? 在编写实现之前不要担心这个问题的答案。编写一个实现,然后对其进行测试。或者,在你编写了一个实现之后,将 memcache 放在它前面。 我鼓励您也阅读 Greg Smith 的书 PostgreSQL 9.0 High Performance,因为它被广泛推荐给做出扩展选择和调整服务器的人们。 【参考方案1】:

不经过测试就很难回答,但您可能想回答以下问题:

1) diff 操作的成本是多少?运行测试或计算复杂度。如果 diff 操作是针对非常大的文件或快速更改的文件,您可能需要修改算法。如果文件很大、变化很小或随时间变化很快,那么存储差异似乎不是一个很好的解决方案。

2) 您需要多少次使用相同的文件生成相同的差异?是否有与此相关的时间限制? - 如果在短时间内反复生成相同的差异,您可能希望将其缓存而不是将其写入数据库。如果随着时间的推移(几天、几个月)偶尔访问差异,您可能希望在分析上述 1 之后存储它。

您可以使用 Amazon Web Services 上的成本进行基准测试。你再次在那里有选择。您可以只使用单个 EC2 实例来处理所有事情,也可以针对 RDS、EC2 和 S3 拆分工作流,然后分析成本。取决于您想要的规模级别。

【讨论】:

感谢您的支持 - 所有这些考虑因素都是相关的。很好的研究起点。【参考方案2】:

你问的基本上是你应该缓存还是不应该缓存。在大多数情况下缓存是可取的,但您应该限制缓存大小。当缓存已满时,应从缓存中删除最近访问过的项目,以便为最近访问的项目腾出位置。

少量的缓存通常可以大大降低 CPU 负载。

你不妨看看memcache

Memcache 为您实现了自动删除旧项目以支持新项目。您所要做的就是在生成数据时将其放入缓存中,当您需要数据时首先检查 memcache 是否还有,如果没有,则生成它。

【讨论】:

换一种说法,在不购买更多硬件的情况下尽可能多地扩展缓存。有时你买不到,不得不购买更多,但至少这是一个初步的近似值。【参考方案3】:

我的建议是将缓存存储在数据库表中,而不是内存中。如果条目被大量引用,它们在内存中(在磁盘缓冲区中)。这种方法的优点是差异将与其他数据库表竞争核心位置,这总是比预分配(和管理)XXX 字节的内存更智能。

另外一个好处是维护缓存条目的hitcount,date of access, ...相对容易,并且它的管理都可以在SQL中完成。

请记住:磁盘空间是免费的。在磁盘上拥有 XXX GB 缓存非常容易,并且有效地只使用其中的 XXX MB。 hard hitters 将在内存中,而 long tail 将位于磁盘上。并且总是可以扩大或缩小缓存。

未缓存版本的成本估算:

I/O + 2 个文件的缓冲内存开销 diff 操作的 CPU + 内存成本 为结果缓冲内存。

缓存版本的成本估算:

I/O + 获取差异 用于查询的 CPU + 内存 结果的缓冲内存

如果你比较两者:

未缓存的版本具有更大的 I/O 成本(假设 diff 小于两个文件的总和) 未缓存的版本总是占用更大的内存 查询成本可能小于差异执行成本。或者它可能更大......

【讨论】:

以上是关于哪个更贵(以美元计):数据库内存还是处理能力?的主要内容,如果未能解决你的问题,请参考以下文章

Provider 和 setstate 哪个更贵?

在Oracle中使用REGEXP_LIKE和使用LIKE的性能哪个好

sas和python的区别

海信电视买哪个型号好 2023海信电视系列机型选购推荐

重磅!F5以6.7亿美元收购开源服务器Nginx

架构|如何以1美元使用NettyAkka和Cassandra将服务器性能提高到每小时处理1亿条消息