服务器实际需要多少RAM?


12

我在全球部署了很多服务器。他们正在运行Windows 2003 x64和SQL Server 2005 x64,并具有6 GB的RAM。这些盒子没有最好的(甚至是可以接受的)配置,因为几年前订购它们的那个人并不真正知道他在做什么。

这些盒子相当一致地用完了内存,最终使用了页面文件,一切都变慢了。通常,提交费用为5.8GB,然后,当某人需要做一些密集的事情(例如运行报告)时,该数目就会增加。

我一直在尝试获得更多内存的权力,但是我遭到了广泛的反对(例如,使软件性能更高,所有这些服务器的成本都太高,或者证明包装盒没有足够的内存等)。 ..)。

是否有一些准则(或公式)来说明我可以向非技术人员展示一个盒子需要多少RAM,以便我们最终可以订购更多的内存?


系统是内部开发的吗?
Oskar Duveborn

@奥斯卡 是的,我是开发人员,并且代码经过了优化,可以反复使用。仅存在大量数据。
AngryHacker 2011年

然后看我的答案。这是我专门研究的事情
。– mrdenny

Answers:


9

几乎没有任何方法可以轻松分辨,因为它完全取决于您的用法和应用程序。您正在最大化数据库服务器...数据库有多大?您的交易统计数据是什么?

在您的方案中,实际限制很明显。您在6 Gb上运行了一段时间没有问题,然后就开始交换和颠簸,因此6 Gb不够。

如果性能足以影响业务,那么您的上司应该听到足够的抱怨,认为提高内存是谨慎的。弄清楚您花费的时间,然后弄清楚“调整”服务器并进行调试故障所花费的时间,当服务器中添加内存可能很好地解决了内存成本问题,并且不到半小时的时间停机时间。

在实际部署到实际使用环境中并从那里开始工作之前,您将不知道所需的确切内存量。

就是说,您可能想验证您的应用程序确实是瓶颈。运行Windows性能监视器以查看磁盘I / O统计信息和网络吞吐量。看看您的碎片化程度如何(Google是这里的好朋友)。您也可以尝试在代码效率低下的地方审核代码中的明显问题(再次使用Google)。

但这又取决于这对业务的影响有多严重。在调优上投入更多的价值,还是先扔硬件然后再尝试进行调优是否足够糟糕?


需要+1大小和数据
奥斯卡·杜夫伯恩

12

查看是否需要更多RAM的一种简单方法是绘制“页面预期寿命”性能计数器。此计数器告诉您SQL Server认为数据需要腾出空间容纳其他数据之前将其保留在缓冲池中的时间。您希望这个数字尽可能高。安装了6 Gig的RAM(您应该将SQL设置为最大4G),您最多只能将数据保留在内存中几分钟,当有人运行大型报告时,您会看到此数字下降到几秒钟。您拥有的RAM越多,可以在内存中保留的数据就越长,从磁盘读取的内容也就越少。

例如,目前我正在使用的系统具有256 Gig的RAM,我们将数据保留在内存中大约12000秒左右。

请不要要求击中目标号码,而只是希望该号码尽可能高。在不了解您的系统的情况下,我无法为您提供大量建议。


6

嗯 好吧,即使是安装大量的MSSQL,6 gig的内存也是相当不错的。您可能实际上希望查看并确保您的代码确实有效。6笔交易有点不寻常...我在全州范围的薪资系统上工作,在1099年末处理时没有达到最高的笔迹...而且要经常运行?我不知道。您正在处理哪种数据?

话虽这么说,您可以在64位盒子中填充尽可能多的RAM,而ram非常便宜,因此可能会在其中尽可能多地放置它...实际上上没有太多RAM数据库服务器。

编辑:这已经过时了。我有256 GB RAM的MSSQL盒。


1
数据库服务器上真的不能有太多RAM。也许不是,但是您可能会浪费内存,因为它没有被使用。尽管我同意这样的总的想法,即在某些任务上慷慨地付出是有好处的,但我认为这不只是将资源投入系统而不了解其要求。
罗伯·摩尔

2
@robert:这不像我提倡购买刀片服务器。最大化服务器中的RAM非常简单,如果内存不足,为什么不添加更多内存呢?我认为问题可能出在他的代码中,但是如果您可以用几百美元的RAM来解决问题,那么这是金钱的有效利用。
Satanicpuppy

1
@robert:我同意。但是我经常看到人们花费数千美元在编码人员和顾问身上来解决软件问题,而在硬件上投入更多的硬件会花很少一部分钱就能完成同样的事情。
Satanicpuppy

1
6 Gigs是大小合适的SQL Server内存配置吗?您一直在使用一些非常小的服务器。我已经安装了256 Gig的盒子,并且我已经安装了512 Gig的朋友。6演出不算什么。
mrdenny

1
@mdmarra:恩。当然在2012年。在2009年?没那么多。
Satanicpuppy 2012年

4

在决定购买更多内存(或任何其他组件)之前,我建议您在服务器上运行性能分析。您可以使用perfmon自行执行此操作,也可以使用第三方工具进行查看。您应该分析OS和SQL Server的性能。恕我直言,我们经常准备在进行适当的分析之前就将硬件扔到问题上。就目前您所知,查询,存储过程,执行计划,磁盘I / O,CPU利用率等都可能是一个问题。内存压力通常可能是系统中另一个瓶颈的症状。


1

正如“ Satanicpuppy”所说,没有太多的内存,但是6GB应该可以,也许您应该重新考虑服务器的功能,我不认为您遇到了“硬件”问题,应该专注于您的SQL编程...


1

对于数据库服务器,没有“足够”的内存。当然,这取决于他们的实际操作和运行情况,但是如果它是一个经常使用的数据库,其中包含大量数据并执行复杂的查询-6 GB可能很容易造成资源不足。

首先,将一台麻烦的服务器升级到至少32 GB或64 GB,然后看看是否有帮助。如果没有,请转向数据库调优,应用程序故障排除和调试-除非白痴设计了数据库,否则所有这些花费比服务器级存储的花费要多得多(即使白痴设计了东西,也得到了明显的设计)保留支持后修复的错误可能会是很大的挑战)。

就是说,正如其他人所说的那样-除了缺乏磁盘或网络I / O性能外-可能是其他原因(例如软件设计问题)-雇用DBA专业人士仅通过基本的SQL性能监控来进行测试。一天可能会有用。


0

您应该查看构建更多索引。我认为,通常来说,大多数人对数据库的索引不足。

这仍然是空代码,我还没有完全测试过,但是应该可以向正确的方向发展

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
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.