我有一个在 Windows 2008 R2 上运行的自定义服务器应用程序。它是一个用 .Net 编写的自产 Windows 服务,支持许多自定义终端。我有一台与实时服务器规格相似的测试机,还有一组客户端模拟器,可以用来产生与真实系统相当的负载。我需要能够支持 12,000 个这样的模拟器,目前服务器内存不足(分页正在飙升)。
我的计划是只启动 100 个模拟器,测量内存使用情况,然后再启动 100 个模拟器再次测量内存并重复,直到分页开始上升(实际上我将获取超过三个数据点。)这应该会给我一个 100 个模拟器所需的额外内存量数字,并使我能够预测需要多少内存。我只需要一个 +/-30Gb 的粗略估计,以避免购买服务器将占用的全部 2Tb(价值 150,000 美元)。我的问题是这是否是一种合理的方法,如果是,您将监视哪些性能计数器来提供实际使用的内存量?
我在这里特别谈论的是内存,因为工作集、专用字节、已提交、共享、虚拟和所有其他内存术语之间的区别让我感到困惑。我想我可以自己设法监控 CPU、IO 和网络。我注意到的另一件事是,.Net Cache 根据可用资源调整其内存使用情况,这使得很难发现趋势。
答案1
说实话?我不。
当指定一台能够处理任何实际工作负载的服务器时,我会在合理承受范围内塞入尽可能多的 RAM(系统最终更有可能受到 RAM 限制而不是 CPU 或磁盘限制 - 唯一其他必然存在的瓶颈是前端总线)。
如果你想知道你的应用程序可以使用多少内存,那么像你建议的那样进行基本的负载测试是一个好的开始,但如果你已经有这个系统在生产中(听起来你就是这样做的)并且你的生产系统正在交换你的任务更容易:计算你使用的交换空间大小-->添加至少 2 倍的 RAM(四舍五入以适合您系统的 DIMM 大小限制)。
如果您执行负载测试以获取粗略数字并从中推断,请记住考虑以下几点:
内存曲线可能会分为两个不同的部分
(最初,随着框架/共享库被缓存,曲线会急剧上升;然后,随着每个新应用程序的不可共享代码被放入内存,曲线会变得平缓一些)您仍然需要空闲的 RAM 用于磁盘和共享库缓存,以及操作系统。
(这应该至少比您的应用所需的内存多几 GB)所有软件都会泄漏内存(至少所有实用软件都会),因此请在测试中注意这一点,并确保有足够的空间来处理泄漏。
您的负载可能会在服务器的整个生命周期内增加。 制定相应计划。
(如果您没有良好的容量规划数字,请将今天的工作量增加一倍并计划处理该工作量)。今天购买过多的 RAM 总比明天环境崩溃要便宜。
- 第一个推论:如果你购买的服务器比你实际需要的稍大一些,那么你就是让公司正常运转的有远见的管理员。但你将被大多数人忽视和不被重视。
- 第二个推论:如果您的机器尺寸太小并且出现问题,那么您就是无法预期 500% 增长的无能笨蛋,每个人都会讨厌您。
答案2
谢谢,更新至少给了大家一个线索。你正在考虑 2Tb 内存,这意味着你正在使用与通常设置不同的配置。大系统。真不敢想象这会散发出多少热量。
假设它是一个内部服务器进程,并且内存不足(您没有说明从哪个级别开始分页),但我希望在继续之前消除服务器进程消耗大量内存的可能性。如果发生这种情况,无论您做什么都没有区别,系统都会在某个时候停止。
我不知道有什么通用工具可以让你了解除了 Windows 附带的内容之外的更多内容。服务进程本身是一个黑匣子,你的开发团队需要提供监控工具。
快速计算:
2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb
1048576Mb / 13000 connections = around 80mb per session
这不会超出正常.net exe工作集的范围。
该服务是否有多个线程?如果他们为每个连接启动一个线程,那么值得看看他们是如何做到这一点的。微软的 ProcExp.exe 是一种简单的方法,可以查看您是否有多个线程以及这些线程消耗了多少资源。它不了解 .net,但会为您提供 win32 计数器。
在开始分页之前进行测试时,您能否指出有多少内存和多少个连接?
那么,如何确定服务器进程是否存在内存泄漏问题?它可能随着每个会话的连接而积累更多内存,或者它可能一直在积累内存并且永远不会释放它们。
您可以做的是 - 选择一些不会引发分页的会话并模拟该数量的连接。 - 运行模拟几个小时并使用 perfmon 来监视基本内存计数器。 - 使用短暂连接并断开连接的会话重复这些测试。
这样做的目的是查看服务是否在每个会话中消耗越来越多的内存,或者打开的会话是否会引起内存使用量的不断增加。