我知道这个问题可能已经回答了很多次了,但我需要一个更好的方法来解决它,或者向我的老板证明这是一种正常行为,或者我忽略了一些东西。
我不是 DBA,我是一名开发人员,就像我以前的工作一样,我必须担任 DBA Mantle,因为我们现场没有正式的 DBA,或者没有人想认真对待这件事。
我有三个 SQL Server 实例,一个使用 SQL 2008 R2,两个使用 SQL 2016。全部来自生产环境。
SQL 2008 R2 来自我们的主系统,它托管在 Hyper-V 中的虚拟服务器中,并且是专用数据库服务器。该服务器上没有分配其他应用程序,它是一个纯数据库服务器。
问题是服务器配置了 30 GB 的 RAM,而 SQL Server 配置为使用从最小 4 GB 到最大 22 GB。
如果我重新启动,显然服务器内存使用量在服务器性能管理器上趋于平缓,从使用的内存中释放内存到配置的最小值。
我需要帮助理解这种情况,因为所有文档都指向一个无可辩驳的事实,即这在 SQL Server 中是正常的,我已经对此进行了记录,但是我的老板和同事表示这不是数据库的正常行为。如果我做数字,我认为服务器正在请求更多内存。他们说这不是 SQL Server 的正常行为,而且我们忽略了一些东西(工作和其他东西)。为了监控或尝试确定服务器行为,我开始每两个小时发送一次数据库健康报告,以尝试检查发生了什么。对于他们来说,预期的行为是 SQL Server RAM 应该在性能图中上升和下降,而不是一直保持在顶部,据我了解,这是预期行为或 SQL Server 的设计。
但是在不同的时间点,作业上升到执行,并且它们正常完成,一些长时间运行的事务正在运行,但是当我在生成报告后为它们运行查询时,它们消失了。
有什么我忽略的吗?这是正常的吗?有没有办法在不重启实例的情况下释放内存?我已经尝试了很多解决方案
当我在 SQL Server 中使用大对象 (LOB) 数据类型的变量时,整个变量是否始终保存在内存中?即使是2GB大小?
从 MySQL 5.1 开始,数据不再需要完全在内存中。
我读过索引列(我认为整个索引结构)必须仍在内存中(MySQL High Availability,2010,第 533 页,“MySQL Cluster 将所有索引列保留在主内存中”)。
鉴于此,如果没有足够的内存(即,一个巨大的数据库(> 100GB 或 1TB),在具有低内存配置的服务器上运行(例如,2 个数据节点,每个节点具有 1GB 的 RAM))会发生什么情况?
我需要进行大量的统计分析才能向用户提供一些数据。目前,我从 mysql 捕获数据并通过PHP数组处理它们。但是,mysql 临时表要好得多(比 PHP 数组效率更高、速度更快;显然是由于它们的机制)。
我的暂定解决方案是在每次请求(即连接)时形成一个临时表来导入和处理数据。但是,我不确定同时创建多个临时表是否有缺点?
这会给mysql服务器带来问题吗?或者我可以在众多同时请求中使用它作为 PHP 数组的替代方案?
我们有一个混合 OLAP/OLTP 工作负载的数据库。查询是非常临时的,并且是在中间层应用服务器中动态创建的。当我们启动服务器时,性能还算可以接受,但是内存消耗会越来越多,直到所有可用内存(30GB)耗尽。之后,系统变得越来越慢。
命令之类的Dbcc freeproccache无效。
没有多少交易select * from sys.dm_tran_session_transactions(不超过系统正常时),有时这个列表是空的。
第一个结果dbcc memorystatus是
VM Reserved 42136628
VM Committed 1487176
Locked Pages Allocated 24994048
Reserved Memory 1024
Reserved Memory In Use 0
Run Code Online (Sandbox Code Playgroud)
重新启动 SQL Server 可以暂时解决问题。
服务器在专用硬件(不是虚拟机)上运行。我们有一些预定的工作,但我们暂时禁用了它们,没有任何变化。在同一台服务器上还有其他中层应用程序运行,但它们使用的内存不超过 2GB,CPU 可以忽略不计,并且几乎没有 I/O。我们重新启动了所有此类应用程序,没有任何更改。
我正在使用 MongoDB-2.6.1。有没有办法限制RAM内存使用?
例如:在 4 GB RAM 中,让 MongoDB 使用到 3 GB (<= 3 GB)。
我已经阅读了几篇关于 SQL Server 的页面预期寿命以及它的含义以及您可以从中收集到哪些信息的文章。在我读过的大多数文章中,一个常见的、健康的 PLE 值大约是 1000-2000 秒。我已经读过,下降到大约 300 秒可能意味着您的 RAM 可能不足。
我最近刚刚升级了我们的硬件,从 14GB 增加到 64GB 的 RAM。在 14GB 上,我的 PLE 大约是 300 秒,而且我每秒有很多 5-6 次内存授予待处理。所以,这很糟糕,我增加了 RAM。现在,我的 PLE 在 5000 秒左右要高得多,而且没有更多未决的内存授予。如果我记得的话,我已经看过 7000 秒了。这比我读过的任何东西都要高得多。
高 PLE 会是坏事吗?还是越高越好?
编辑:对不起,我的 PLE 不是 7000 秒,而是70,000秒!虽然,目前它已降至 7000 左右。

max_server_memory 设置为 2147483647。每隔几天就会遇到一些问题,postgres 崩溃并进入恢复模式。postgres 的日志看起来像这样
... Lots of this for 5-10minutes
2015-09-24 10:07:27 GMT LOG: could not fork autovacuum worker process: Cannot allocate memory
2015-09-24 10:07:28 GMT LOG: could not fork autovacuum worker process: Cannot allocate memory
2015-09-24 10:07:29 GMT LOG: could not fork autovacuum worker process: Cannot allocate memory
2015-09-24 10:07:30 GMT LOG: could not fork autovacuum worker process: Cannot allocate memory
2015-09-24 10:07:32 GMT LOG: server process (PID 16244) was terminated by signal 9: Killed
2015-09-24 10:07:32 GMT DETAIL: Failed …Run Code Online (Sandbox Code Playgroud) 我在 amazon RDS 上使用 postgresql 9.5.4 和来自 rails 4.2 的约 1300 个持久连接,并带有“prepared_statements: false”。在数小时和数天的过程中,“可释放内存”RDS 统计数据继续无限期地下降,但每次我们重新连接(重新启动我们的服务器)时都会跳回到一个相对较小的工作集。如果我们让它持续太长时间,它会一直为零,并且数据库实例确实开始进入交换并最终失败。从我们重新启动时的峰值中减去几天内的可用内存,我们看到每个连接平均有 10 MB。
从增强监控中挖掘每个 pid RSS,我们看到示例连接 pid 的增长同样缓慢,但总 RSS 似乎只是每个连接实际内存使用量的代理(https://www.depesz.com/2012/ 06/09/how-much-ram-is-postgresql-using/)。
我怎样才能:
我一直有定期的 SQL Server OOM 错误,有一次 SQL Server 自行关闭并且总是在夜间发生,当时没有人使用它,并且当时没有运行 SQL 代理作业:
这是典型的错误:
08/17/2017 19:31:17,spid100,Unknown,资源池“内部”中的系统内存不足,无法运行此查询。
08/17/2017 19:31:17,spid100,未知,错误:701 严重性:17 状态:123。
08/17/2017 19:31:17,spid112,未知,错误:18056 严重性:20 状态:29。(参数:)。错误以简洁模式打印,因为格式化过程中出现错误。跟踪 ETW 通知等将被跳过。
这是服务器信息:
版本:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)
Oct 20 2015 15:36:27
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)我检查了多个项目:
快速统计: …
memory ×10
sql-server ×5
mysql ×2
postgresql ×2
blob ×1
mongodb ×1
mysql-5.5 ×1
ndbcluster ×1
performance ×1