服务器实际需要多less内存?

我在世界各地部署了不less服务器。 他们正在运行带有6 GB RAM的SQL Server 2005 x64的Windows 2003 x64。 这些盒子没有最好的(甚至是可以接受的)configuration,因为多年前订购的那个人并不知道自己在做什么。

这些盒子一直运行内存不足,最终使用分页文件,一切都变慢了。 通常情况下,提交费用是5.8GB,然后当有人需要做一些密集的工作时(例如运行一个报告),这个数字就会越过顶点。

我一直在试图获得更多记忆的力量,但是我却遭到了巨大的反对(例如,使软件性能更高,所有这些服务器花费太多,或者certificate盒子没有足够的内存等等。 ..)。

是否有一个指导方针(或一个公式)可以给非技术人员提供一个盒子需要多less内存,这样我们才能最终订购更多的内存?

没有任何方法可以轻易说出,因为它完全取决于您的使用情况和应用程序。 你正在使数据库服务器最大化…数据库有多大? 你的交易数据是什么?

在您的情况下,现实世界的限制是显而易见的。 你在6场演出中没有任何问题地运行了一段时间,然后交换和颠簸。因此6个演出是不够的。

如果业绩足够影响业务,那么你的高层应该听到足够的抱怨,认为记忆是谨慎的。 弄清楚你的时间成本,然后弄清楚“调整”服务器和排除调整问题需要花费多less成本,当内存添加到服务器可能很好地解决了内存成本的问题,并且不到半小时的时间停机时间。

在实际部署实际使用情况并开始工作之前,您不会知道所需的确切内存量。

也就是说,您可能想validation您的应用程序是否真的是瓶颈。 运行Windows性能监视器来查看您的磁盘I / O统计信息和networking吞吐量。 看看你的碎片级别是什么( Google在这里是个好朋友 )。 在查询效率非常低的情况下,您也可以尝试对代码进行审核以查找明显的问题( Google再次 )。

但这一切都取决于这是多么严重的影响业务。 是否值得更多投资于调优,还是先把硬件抛在后面,然后试着调整呢?

一个简单的方法来看看你是否需要更多的RAM是绘制页面预期寿命perfmon计数器。 这个计数器告诉你SQL Server认为在需要为其他数据腾出空间之前将数据保存在缓冲池中的时间。 你想这个数字越高越好。 在安装了6G内存的情况下(你应该把SQL设置为最大值,大概是4G),你可能最多只能在内存中保存数据,当有人运行一个大的报告时,你会看到这个数字坦克下降到几秒钟。 您拥有的RAM越多,可以将更长的数据保存在内存中,从磁盘读取的数据就越less。

例如,我现在使用的系统有256G的RAM,我们将数据保存在内存中约12000秒左右。

请不要要求一个目标号码打,你只要尽可能高的数字。 不知道更多关于你的系统,我不能给一个好的数字来拍摄。

Hmmmm。 那么,6演出是一个体面的内存量,即使是一个大的MSSQL安装。 你可能真的想看,并确保你的代码真的是有效的。 一个6 gig的交易有点不同寻常……我曾经在全州范围内的工资系统上工作过,而这个工资系统并没有在1099年底处理过, 我不知道。 你在使用什么样的数据?

话虽如此,你可以在64位的盒子里填充任意数量的内存,而且内存很便宜,所以尽可能在内存中放置尽可能多的内存……内存不能太多数据库服务器。

编辑:这是疯狂过时的现在。 我有MSSQL框与256演出的RAM。

在购买更多的内存(或任何其他组件)之前,我会build议在服务器上运行性能分析。 你可以用perfmon自己做,也可以使用第三方工具。 您应该分析OS和SQL服务器的性能。 恕我直言,我们经常准备好在正确的分析完成之前抛出硬件问题。 在这一点上,您可能知道查询,存储过程,执行计划,磁盘I / O,CPU利用率等问题。内存压力通常可能是系统中另一个瓶颈的症状。

正如“Satanicpuppy”所说,没有太多的内存,但是6GB应该没问题,也许你应该重新考虑一下你的服务器的function,我不认为你有一个“硬件”问题,你应该专注于你的SQL编程…

当谈到数据库服务器时,就没有“足够”的内存。 当然,这取决于他们实际上做了些什么,但是如果它是一个经常使用的数据库,包含大量的数据和做复杂的查询 – 6 GB很容易就会严重不足。

我会开始升级一个麻烦的服务器至less32或64 GB,看看是否有帮助。 如果没有,请转到数据库调优,应用程序故障排除和debugging – 除非一个白痴devise了数据库,否则花费比一些服务器级内存更多(即使白痴devise了这个东西,甚至是明显的devise用保留的支持修正的错误可能是相当大的挑战)。

也就是说,正如其他人所说的那样 – 这可能是别的东西(软件devise问题除外),比如缺乏磁盘或networkingI / O性能 – 雇用一名DBA专业人员来完成基本的SQL性能监控一天可能会certificate有用。

你应该看看build立更多的索引。 我认为,一般来说,大多数人索引他们的数据库。

这仍然是空调代码,我还没有完全testing,但它应该让你在正确的方向

http://accessadp.com/2011/08/22/missing-indexes-great-script-for-determining-roi/

Select 'create index IX_' + sys.objects.name + isnull(replace('_' + equality_columns, ',', '_'), ”) + isnull(replace('_' + inequality_columns, ',', '_'), ”) + ' on ' + sys.objects.name + '(' + coalesce(equality_columns + ',' + inequality_columns, equality_columns , inequality_columns ) + ') ' + isnull(' include (' + included_columns + ')', ”) as CreateIndexSql, (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) AS Score, sys.schemas.schema_id, sys.schemas.name AS schema_name, sys.objects.object_id, sys.objects.name AS object_name, sys.objects.type, partitions.Rows, partitions.SizeMB, sys.dm_db_missing_index_details.equality_columns, sys.dm_db_missing_index_details.inequality_columns, sys.dm_db_missing_index_details.included_columns, sys.dm_db_missing_index_group_stats.unique_compiles, sys.dm_db_missing_index_group_stats.user_seeks, sys.dm_db_missing_index_group_stats.user_scans, sys.dm_db_missing_index_group_stats.avg_total_user_cost, sys.dm_db_missing_index_group_stats.avg_user_impact, sys.dm_db_missing_index_group_stats.last_user_seek, sys.dm_db_missing_index_group_stats.last_user_scan, sys.dm_db_missing_index_group_stats.system_seeks, sys.dm_db_missing_index_group_stats.system_scans, sys.dm_db_missing_index_group_stats.avg_total_system_cost, sys.dm_db_missing_index_group_stats.avg_system_impact, sys.dm_db_missing_index_group_stats.last_system_seek, sys.dm_db_missing_index_group_stats.last_system_scan FROM sys.objects JOIN ( SELECT object_id, SUM(CASE WHEN index_id BETWEEN 0 AND 1 THEN row_count ELSE 0 END) AS Rows, CONVERT(numeric(19,3), CONVERT(numeric(19,3), SUM(in_row_reserved_page_count+lob_reserved_page_count+row_overflow_reserved_page_count))/CONVERT(numeric(19,3), 128)) AS SizeMB FROM sys.dm_db_partition_stats WHERE sys.dm_db_partition_stats.index_id BETWEEN 0 AND 1 –0=Heap; 1=Clustered; only 1 per table GROUP BY object_id ) AS partitions ON sys.objects.object_id=partitions.object_id JOIN sys.schemas ON sys.objects.schema_id=sys.schemas.schema_id JOIN sys.dm_db_missing_index_details ON sys.objects.object_id=sys.dm_db_missing_index_details.object_id JOIN sys.dm_db_missing_index_groups ON sys.dm_db_missing_index_details.index_handle=sys.dm_db_missing_index_groups.index_handle JOIN sys.dm_db_missing_index_group_stats ON sys.dm_db_missing_index_groups.index_group_handle=sys.dm_db_missing_index_group_stats.group_handle WHERE sys.dm_db_missing_index_details.database_id=DB_ID() AND (CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.user_seeks)+CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.unique_compiles))*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_total_user_cost)*CONVERT(Numeric(19,6), sys.dm_db_missing_index_group_stats.avg_user_impact/100.0) > 100