为什么 MySQL 说即使我的服务器只有大约 2GB 的内存也可以使用大约 16GB 的内存?
# ./mysqltuner.pl
>> MySQLTuner 1.2.0 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.34-cll
[OK] Operating on 32-bit architecture with less than 2GB RAM
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM …Run Code Online (Sandbox Code Playgroud) 我一直在查看服务器的内存使用情况,并在深入研究细节时发现了一些奇怪的东西。一个索引占用了大约 15GB 的缓冲池。这恰好是整个索引的大小。关于这个特定索引的更多说明:
引出几个问题:
我是一名试图成为 DBA 的开发人员,所以请耐心等待;)
使用自动内存管理时,SGA_MAX_SIZE 应该是什么值?应该是0吗?这些是我当前的设置,我不确定是保留 SGA_MAX_SIZE 还是将其设置为 0。
memory_max_target 2147483648
memory_target 2147483648
pga_aggregate_target 0
sga_max_size 1610612736
sga_target 0
Run Code Online (Sandbox Code Playgroud)
甲骨文 11gR2
所以我两天来一直在努力解决这个问题,但我找不到解决方案。我正在运行一个脚本来暂存大量数据。这个脚本需要大约 3500 万个锁才能完成;这意味着需要 3.36GB 的内存可用于锁定。我在配置的值中将锁的数量设置为 3700 万,但是在重新启动后,运行值只允许 16,695,296 个锁。
这相当于大约 14% 的可用内存。由于 SQL Server 2012 可以将 40% 的可用内存用于锁定,我应该有足够的空间,但我没有。我的问题是:为什么 SQL Server 不能利用额外的 26% 的可用锁内存?我读过的一切都说它应该能够。
此外,我确实尝试在动态上运行锁,但由于相同的原因和相同的错误代码也失败了:错误 1204,实例无法获得锁资源。我知道这是服务器配置而不是脚本,因为我运行了完全相同的脚本,在旧服务器(SQL Server 2008)上使用完全相同的数据集没有问题。
向数据库管理员求助;帮助我哦伟大的人!
编辑:这是故障转移群集上的 VM,该 VM 分配了 16 GB 内存。我为 SQL Server 提供了 12GB 的空间,并为主机操作系统留下了 4GB 的空间。
我在 db.m2.4xlarge 类的 RDS 实例上遇到内存问题。
以下是RDS实例的规格
实例类:db.m2.4xlarge(68.4 GB RAM)
引擎:mysql (5.5.37)
IOPS:8000
存储空间:805GB(128GB 数据)
多可用区:是
自动备份:已启用(5 天)
mysql 实例在不更改 InnoDB 缓冲区值的情况下进行了调整。
总缓冲区:23.9G 全局 + 每个线程 3.0M(1000 个最大线程)
最大可能内存使用量:26.8G(已安装 RAM 的 42%)
InnoDB 表中的数据:98G
之前,我们曾经有更高的缓冲区值,这是更优化的,但是重新启动的频率使我们将其减少回 RDS 设置的默认缓冲区大小。
我们的应用程序从 4 个 ColdFusion 服务器和 4 个 asp.net 服务器工作,它们都与相关的 MySQL RDS 实例通信。我们正在为应用程序使用连接池。所有的 DML 语句都是使用存储过程完成的,并且它们被非常频繁地执行。
我的问题是 RDS 实例如果单独存在,会慢慢消耗内存并开始交换。当它交换时,我们的应用程序开始一一失败。因此,我们只有重新启动实例的唯一选择。目前,每当内存低于 5 GB 时,我们都会重新启动服务器。
我们采用的另一种方法是重新启动冷融合服务器,重新启动 IIS,然后发出“刷新表”查询。但这有时会产生结果,但有时没有变化。理论上,我相信即使没有刷新表查询,内存也应该被释放,这不会发生。同样,释放的内存通常在 1-7 GB 的范围内。
MySQL 的交互式超时设置为 300 秒,ColdFusion 连接生存期为 300 秒,asp.net 中设置的超时为 270 秒。
我无法追踪正在使用内存的内容并将其保留给自己。理想情况下,内存应该在 MySQL 需要时被释放。但它并没有发生。
我需要一些关于如何追踪内存占用的指导,以便 RDS …
我将 SQL Server 2012 Standard 放在一个虚拟机 (VMWare) 上,该虚拟机具有大约 98GB 的内存。
现在我检查了下面的查询 SQL Server 占用了多少内存。
Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
Run Code Online (Sandbox Code Playgroud)
并且看到他已经吃掉了 81GB 的内存,并且最大内存设置为 ~90GB。
使用:
select (physical_memory_in_use_kb/1024)Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024 ) VAS from sys. dm_os_process_memory
Run Code Online (Sandbox Code Playgroud)
SQL Server 2012 Standard 应仅支持 64GB 内存。
为什么我的 SQL Server 吃的比他能吃的多?还是信息不正确?
任何的想法?这与使用虚拟内存的虚拟机有关吗?
我不知道 VM 主机上是否激活了气球驱动程序...
如果您需要更多信息,我会添加它。
我有一个用于共享点和 ssrs 的 SQL Server 2008 R2。SQL Server 承载两个实例。
有几分钟,两个实例都超时了,没有响应。
CPU 缓慢上升到 100%,两个实例均为 30%,操作系统为 30%(以及一些较小的东西)。
之后,16GB 的内存未从 SQL Server 分配,一些进程使用了几 GB 的内存(在 esxi 上不知道是哪个)。
此后,SQL Server 再次拥有最大内存量,PLE 大约为 15000。
我想知道的是,如何跟踪 SQL Server 被迫放弃内存的原因?
跟踪文件中某处的历史记录,还是 Windows 事件?(到目前为止我都击中了)
我试过:
DECLARE @log NVARCHAR(100)
SELECT @log = Substring(PATH, 1, Len(PATH) - Charindex('\', Reverse(PATH))) + '\log.trc'
FROM sys.traces
WHERE id = 1
SELECT
g.DatabaseID,
g.LoginName,
g.StartTime,
g.EndTime,
g.DatabaseName,
g.FileName,
e.name
FROM ::fn_trace_gettable(@log, 0) as g
inner join sys.trace_events e on g.eventclass = e.trace_event_id
inner join …Run Code Online (Sandbox Code Playgroud) 最近我们的 SQL 服务器出现了问题。服务器似乎会耗尽内存然后崩溃。出于某种原因,sql 服务不会重新启动。我将不得不去手动重新启动它,然后就可以了。
我仍在试图找出内存问题。我们使用的是 SQL Server 2012 SP1 企业版。这是在 Windows 2012 服务器上。在服务器崩溃之前,我在服务器上看到了很多 701 内存不足错误,我仍在尝试找出导致内存错误的原因。
为什么 SQL 服务不会自动重启?是不是因为内存问题?
此外,服务器有 20GB 内存,最大服务器内存设置为 16.5GB。我注意到 MEMORYCLERK_SQLOPTIMIZER 非常高,在服务器崩溃之前大约 11.5 GB。
有谁知道为什么会这么高?那是导致内存错误的原因吗?
任何帮助将不胜感激。谢谢。
我以前从未见过这种情况,尽管这可能很常见。我正在查看虚拟化 (VMWare 5.5) SQL Server(Windows 2008 R2 上的 2008R2)。我看到的是,在任务管理器 * 中,sqlserver.exe使用了大约 163 MB 的 RAM,如果我使用procexp,则相同的服务显示使用的 RAM 不到 500 MB。
VM 有 32GB 的 RAM,任务管理器显示正在使用该 RAM 的 31.7GB。VMWare Perfmon 计数器似乎没有指示任何膨胀(也许我读错了一些东西)。
想法/指导表示赞赏。我正在尝试调整新 SQL VM 的大小。此时,我还没有获得对 vSphere 或 vCenter 数据库的访问权限。
* 使用任务管理器是因为我正在查看整体内存利用率,而不仅仅是 SQL Server。一位性能敏感的管理员警告我要让我的脚步保持非常轻松。
我对 SQL 非常非常陌生,并且无法正确配置服务器。我现在要做的只是一份我工作的公司的数据库模式的小副本,其中包含随机数据。运行一个只有几个表的小型服务器,我只是偶尔查询以测试应用程序,我可以将 SQL 配置为“按需”使用资源(可能是一个侦听查询的代理,并且仅执行此操作,而不是在内存中缓存数据)还是使用最少的系统资源?
我发现,即使只有 15 个表,总共 250MB 的存储空间,SQL 总是在只有 8GB 可用空间的机器上使用至少 2GB 的内存。
我确实在 StackExchange 上寻找过类似的问题,但只发现了关于将多少内存用于操作系统而不是服务器计算机上的数据库的争论。
memory ×10
sql-server ×5
mysql ×2
vmware ×2
amazon-rds ×1
index ×1
innodb ×1
locking ×1
mysql-5.5 ×1
optimization ×1
oracle ×1