我有一个在Windows 2008 R2上运行的自定义服务器应用程序。 这是一个用.Net编写的本地Windows服务,支持多种自定义terminal。 我有一个testing机器,它和现场服务器有类似的规格,我有一套客户机模拟器,可以用来产生一个合理的真实系统的近似值。 我需要能够支持其中的12,000个,目前服务器内存不足(Paging正在通过屋顶)。
我的计划是只启动100个模拟器,测量内存使用情况,然后再次启动100多个测量内存,并重复,直到分页开始上升(实际上,我将采取超过三个数据点。)这应该给我一个数字100个模拟器所需的额外内存量,并使我能够预测需要多less内存。 我只需要一个大概的+/- 30Gb,以避免购买服务器将采取的完整的2TB(价值$ 150,000)。 我的问题是,这是一个合理的方法来使用,如果是这样的性能计数器,你会监视给实际使用的内存量?
我在此专门讨论内存,因为“工作集”,“私人字节”,“承诺”,“共享”,“虚拟”以及所有其他内存条款之间的区别让我感到困惑。 我想我可以自己pipe理CPU,IO和networking。 我注意到的另一件事是.Netcaching调整其内存使用情况取决于什么是可用的,这使得发现一个趋势很难看到。
说实话? 我不知道
当指望看到任何一种实际工作负载的服务器时,我都会在内存中占用尽可能多的内存(系统更可能会受到RAM限制,而不是受CPU或磁盘约束 – 唯一的另一个保证瓶颈是前端总线)。
如果你想弄清楚你的应用程序可以使用一个基本的负载testing,如你所提出的是一个好的开始,但如果你已经有这个系统在生产(听起来像你),你的生产系统是交换任务更简单: 找出您正在使用多less交换空间 – > 添加至less2倍的RAM (向上舍入以适应系统的DIMM大小限制)。
如果您执行负载testing来获取粗略的数字并从中推断,请记住以下几点:
记忆曲线可能是两个不同的部分
(随着框架/共享库被caching,最初的急剧增长,然后是一个稍微不那么陡峭的曲线,因为每个新的应用程序的不可共享的代码被放在内存中)
您仍然需要用于磁盘和共享库caching以及操作系统的可用RAM。
(这应该至less在你的应用程序需要什么)
所有的软件都会泄漏内存(至less所有实际的软件都是这样),所以在testing中注意这一点,确保你有足够的空间来处理泄漏。
您的负载可能会增加服务器的整个生命周期。 计划相应。
(如果你没有很好的容量规划数字,那么现在的工作量翻倍,并计划处理)。
今天购买太多的RAM比明天你的环境要更便宜。
谢谢,这个更新至less给了大家一个线索。 你正在考虑2TB的记忆意味着你在一个不同的平台上进行比赛。 大系统。 讨厌想到将会散发出多less热量。
考虑到它是一个内部服务器进程,并且内存不足(你不会说在什么级别上开始分页),但是我想要消除服务器进程在进入任何内存之前消耗更多内存的可能性进一步。 如果发生这种情况,你所做的没有任何区别,系统将在某个时刻停止。
我不知道任何通用的工具,你可以用来给你不仅仅是对正在发生什么的基本概述…什么是Windows。 服务stream程本身就是一个黑匣子,开发团队需要提供监控工具。
快速的信封计算:
2Tb of memory = 1024Gb = 1024*1024Mb = 1048576Mb 1048576Mb / 13000 connections = around 80mb per session
这不会超出正常的.net exe的工作集的范围。
服务是否有多个线程? 如果他们为每个连接启动一个线程,那么值得看看他们是如何做到的。 从Microsoft的ProcExp.exe是一个简单的方法,看看你是否有多个线程,这些线程正在消耗什么。 它不知道.net,但会给你win32计数器。
在开始分页之前,您能够指出在进行testing时您有多less内存和多less个连接?
那么,如何确定服务器进程是否有内存泄漏问题呢? 它可以在每个会话连接时积累更多的内存,也可以积累内存而不是释放它们。
你可以做的是 – select一些不会激发分页的会话,并模拟这个连接的数量。 – 在几个小时内运行模拟,并使用perfmon来观察基本的记忆计数器。 – 重复这些testing,连接短暂和断开的会话。
我们的想法是查看服务是否在每个会话中消耗越来越多的内存,或者如果打开的会话会引起不断增加的内存使用量。