您如何估计要购买多少内存?


10

我有一个在Windows 2008 R2上运行的自定义服务器应用程序。它是一种用.Net编写的自家Windows服务,支持许多自定义终端。我有一台测试机器,其规格与实时服务器类似,并且有一整套客户端模拟器,可以用来产生与真实系统相当的负载。我需要能够支持其中的12,000个,并且目前服务器内存不足(分页正在快速进行)。

我的计划是只启动100个模拟器,测量内存使用量,然后再启动100个以上的测量内存,并重复进行直到分页开始为止(实际上,我将获取三个以上的数据点。)这应该给我一个数字100个模拟器所需的额外内存量,使我能够计划所需的内存量。我只需要一个大概的+/- 30Gb即可避免购买服务器需要的全部2Tb(价值$ 150,000)。我的问题是,这是否是一种合理的使用方法?如果是,您将监视哪些性能计数器以提供实际使用的内存量?

我在这里专门谈论内存,因为工作集,专用字节,已提交,共享,虚拟和所有其他内存术语之间的差异使我感到困惑。我认为我可以自己监控CPU,IO和网络。我注意到的另一件事是,.Net缓存会根据可用内容来调整其内存使用情况,这使得很难发现趋势。


我会非常谨慎地基于如此紧密的2个数据点来预测内存使用情况。我会非常怀疑内存使用率(和I / O)是否会线性扩展。可能会,但是我怀疑当您移至大量数字时,它将趋向于非线性。我将测试许多数据点,从小到大,直到性能出现问题(分页,I / O饱和等),然后从那里进行投影。如果有可能逐步升级计算机并继续模拟较大的客户数量,我会这样做,直到对曲线的形状感觉良好为止。
埃文·安德森

您还需要更好地了解这是什么。是网络吗?aspx?PHP的?自己种的东西?批处理作业?asp.net的行为不同于在盒子上运行的exe的负载。您需要系统对每个用户使用的基本概念-大约。数字-然后是一个旧信封。如何获得这些数字取决于系统的工作方式。
伊恩·墨菲

@埃文。我总是要取得两个以上的数据点。
马丁·布朗

@Ian:“我正在尝试找出“每个用户使用的系统的一些基本概念”。如果我知道这一点,则无需提出问题。我已更新了问题,以尝试涵盖您的其他观点。
马丁·布朗

Answers:


8

老实说 我
在指定将看到任何实际工作负载的服务器时,我会在合理的范围内尽可能多地填充RAM(系统受RAM约束的可能性要大于CPU或磁盘约束的可能性-唯一可以保证的瓶颈是前端总线)。

如果您想像您所建议的那样找出您的应用程序可以使用基本负载测试的多少RAM是一个好的开始,但是如果您已经在生产中使用了该系统(听起来像您这样做),并且您的生产系统正在交换您的任务比较容易:找出正在使用的交换空间 -> 添加至少2倍的RAM(四舍五入以适应系统的DIMM大小限制)。

如果执行负载测试以获取粗略数字并从那里进行推断,请记住要考虑以下因素:

  1. 内存曲线可能是两个截然不同的部分
    (最初是在缓存框架/共享库时急剧上升,然后是陡峭的曲线,因为每个新应用程序的不可共享代码都在内存中)

  2. 对于磁盘和共享库缓存以及操作系统,您仍然需要可用的RAM。
    (这应至少满足您的应用需求)

  3. 所有软件都会泄漏内存(至少所有实用软件都会泄漏内存),因此请在测试中注意这一点,并确保您有处理泄漏的空间。

  4. 在服务器的整个生命周期中,您的负载可能会增加。 制定相应的计划。
    (如果您没有足够的容量计划数字,则将今天的工作量加倍,并计划处理该数目)。

  5. 今天购买过多的RAM比明天破坏环境便宜。

    • 第一推论:如果您购买的服务器比您的需要大一点,那么您就是使公司运转的有先见之明的管理员。您将在很大程度上被忽略和欣赏。
    • 第二个推论:如果您的机器尺寸不足,并且有问题,那么您就是无能的丑角,他们无法预期500%的增长,每个人都讨厌您。

我赞成这些推论。
mfinni'2


感谢那。尽管我们已经启用了该系统,但它目前仅支持一个很小的试验,这意味着我无法获得很好的数据。
马丁·布朗

0

谢谢,此更新至少为大家提供了一个线索。您正在考虑2Tb的内存,这意味着您要在与通常设置不同的范围内进行比赛。大系统。讨厌想到会散发出多少热量。

鉴于它是一个内部服务器进程,并且您的内存已用完(您不说开始分页的级别),但是我想消除这种可能性:服务器进程在消耗任何内存之前会消耗越来越多的内存进一步。如果发生这种情况,您所做的操作没有任何区别,系统将在某个时刻停止。

我不知道有什么通用工具可以用来为您提供更多信息,而不仅仅是对发生的事情的基本概述... Windows附带的功能。服务流程本身就是一个黑匣子,您的开发团队需要提供监视工具。

快速返回信封计算:

2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session

这不会超出正常.net exe工作范围的范围。

服务是否有多个线程?如果他们为每个连接启动一个线程,那么值得一看的是他们如何做到这一点。Microsoft提供的ProcExp.exe是查看您是否有多个线程以及这些线程在消耗什么的简单方法。它不了解.net,但是会为您提供win32计数器。

您可以指出在开始分页之前进行测试时有多少内存和多少连接吗?

那么,如何确定服务器进程是否存在内存泄漏问题?每个会话连接时,它可能正在累积更多的内存,或者它可能正在累积内存而从未释放它们。

您可以做的是-选择一些不会引起分页的会话并模拟该数量的连接。-运行几个小时的模拟,并使用perfmon观察基本的内存计数器。-对于短暂连接和断开连接的会话重复这些测试。

想法是查看服务在每个会话中是否正在消耗越来越多的内存,或者打开的会话是否激起了越来越大的内存使用率。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.