oom_killer由于 mysql 在插入longblob列时大量消耗内存,我的 MySQL 实例被 Linux 杀死。还原包含非常大longblob列的 mysqldump 时会发生这种情况。
我已经浏览过类似这个博客的内容,它建议将各种读/写缓冲区设置为不同的大小以限制内存消耗。但是,尽管提到的脚本在调整后输出了 350MB 的“TOTAL (MAX)”内存,mysql 在最终被杀死之前仍然会很高兴地吞噬千兆字节的内存。
这是通过 Docker 的复制:
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=foobar -d --name mysql-longblob mysql:5.7
mysql -h 127.0.0.1 -P 3306 -u root --password -e "CREATE DATABASE blobs; USE blobs; CREATE TABLE longblob_test (bigcol LONGBLOB NOT NULL) ENGINE = InnoDB;"
mysql -h 127.0.0.1 -P 3306 -u root --password -e \
"SET GLOBAL max_allowed_packet=536870912;" # 512MB
mysql -h 127.0.0.1 -P 3306 -u root …Run Code Online (Sandbox Code Playgroud) 我们有一台专用的 SQL Server 2008 R2 机器,它遇到了一些奇怪的内存问题。机器本身有很多资源,包括两个四核处理器、16GB 内存和 64 位 Windows Server 2008 R2 Enterprise(它是戴尔 PowerEdge 2950) .
奇怪的问题是系统报告 82% 的内存在使用中,而 sqlservr.exe 仅报告 155mb 正在使用中。我怀疑 SQL Server 是问题的原因是,如果我重新启动 sqlservr.exe 进程,内存消耗会在一段时间内恢复正常。
有没有人对我如何开始追踪这个问题有任何想法?
谢谢,杰森
我在 Ubuntu 服务器上运行 Postgresql,需要能够监视其内存使用情况。目前,我有脚本在一分钟的 cron 作业中运行,用于监视/记录各种统计信息,并且还需要监视/记录 Postgresql 的当前内存使用情况。除了 Postgresql 很好地利用了共享内存,因此诸如“top”之类的程序给出的值不准确之外,我四处搜索并没有找到太多东西。
如何在任何给定时间监控 Postgresql 的总内存使用量?此数据稍后将用于创建用于分析的图表。
我正在开发一个涉及大量数据库写入的应用程序,大约 70% 的插入和 30% 的读取。这个比率还包括我认为是一次读取和一次写入的更新。通过插入语句,多个客户端通过下面的插入语句在数据库中插入数据:
$mysqli->prepare("INSERT INTO `track` (user, uniq_name, ad_name, ad_delay_time ) values (?, ?, ?, ?)");
Run Code Online (Sandbox Code Playgroud)
问题是我应该使用insert_delay还是使用mysqli_multi_query机制,因为 insert 语句在服务器上使用 ~100% cpu。我在我的数据库上使用 InnoDB 引擎,所以插入延迟是不可能的。服务器上的插入是 ~36k/hr 和 99.89% 读取,我也在使用 select 语句在单个查询中检索数据七次,这个查询在服务器上执行需要 150 秒。我可以使用什么样的技术或机制来完成这项任务?我的服务器内存是 2 GB,我应该扩展内存吗?。看看这个问题,任何建议将不胜感激。
表的结构:
+-----------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user | varchar(100) | NO | | NULL | …Run Code Online (Sandbox Code Playgroud) 我们有许多具有相同配置的系统
每天晚上 SQL Server 会做大约 2-3 小时的处理,然后是 2-3 小时的 AS 处理。然后全天只查询 AS。
假设这是一个专用服务器,没有其他应用程序值得关注,并且两组处理是完全同步的 - 没有重叠总是一个接一个 - 我怎样才能最好地设置 SQL 和 AS 服务器内存限制。
询问的原因是,如果我不为 SQL 设置限制,它将抢占它所能获取的所有内存。但是 - 我的理解是,如果出现以下情况,SQL 将很乐意放弃此内存:
它没有使用它并且
另一个服务/程序请求它。
所以从逻辑的角度来看,我相信允许 SQL 根据需要使用尽可能多的东西,但我不太确定 AS' TotalMemoryLimit。我不确定 AS 是否会放弃它的记忆。事实上,阅读更多让我相信让它承担一切是错误的。
这是否意味着我实际上需要为两者设置限制?我对最佳实践应该是什么以及考虑到流程不重叠我们需要衡量什么感到困惑。
希望这是有道理的。
我有一个 SQL Server 2012 实例使用了更多的 RAM。
SQL Server 进程使用大约 22.5GB RAM:
该实例配置为最大使用 10GB:
这比预期的要多得多。(这将导致服务器崩溃,我们必须重新启动才能恢复)。
我用这个查询检查了内存使用情况(职员):
select type, name, pages_kb/1024.0/1024.0 "size Gb" from sys.dm_os_memory_clerks
order by pages_kb desc
Run Code Online (Sandbox Code Playgroud)
SQL Server 似乎只使用了大约 7GB RAM:
我知道它是 SQL Server 的旧版本(遗憾的是它没有修补到最新版本),但我无法找到有关 SQL Server 2012 SP2 中内存泄漏的任何明确文档。
我应该在哪里查找为什么 SQL Server 使用了大约 200% 的资源?
此实例上有一个链接服务器。很多使用 SQL 驱动程序(SQLNCLI 和 SQLNCLI11),但也有一些使用我以前从未见过的“HFSQL 的 PC SOFT OLE DB 提供程序”。
有什么方法可以“证明”这个驱动程序有问题吗?客户端可能不会同意基于假设更改设置,因此如果有任何方法(除了禁用之外)可以清楚地显示链接服务器正在使用多少 RAM,那将是无价的。
我将MEMORY Engine用于与特定 MYSQL 查询关联的所有表,因为访问速度对我的项目至关重要。
出于某种原因,我注意到仍然会发生大量磁盘写入。
这是因为 Windows 将 RAM 交换到磁盘吗?我怎样才能防止这种情况发生?
编辑:这是我的全局变量:
mysql> show global variables;
+---------------------------------------------------+--------------------------------------------------------------------------------
------------------------------+
| Variable_name | Value
|
+---------------------------------------------------+--------------------------------------------------------------------------------
------------------------------+
| auto_increment_increment | 1
|
| auto_increment_offset | 1
|
| autocommit | ON
|
| automatic_sp_privileges | ON
|
| back_log | 50
|
| basedir | C:/Program Files/MySQL/MySQL Server 5.5/
|
| big_tables | OFF
|
| binlog_cache_size | 32768
|
| binlog_direct_non_transactional_updates | OFF
|
| binlog_format | STATEMENT
|
| …Run Code Online (Sandbox Code Playgroud) 我正在考虑将当前的 PostgreSQL 数据仓库迁移到具有 SSD 存储和 RAM 作为主要大小变量之一的云主机。我们目前处理的最庞大的数据将存在于每月分区表中。每个月大约有 70GB 的索引(40-ish w/o)。数据可能主要是定期批量加载,然后由 5 名研究人员组成的小团队访问。
我一直在尝试在此站点上搜索有关规范 RAM 的建议,我发现的所有内容是:
是否应该有足够的 RAM 来至少将整个索引 (16GB) 加载到 RAM?我还需要提供其他详细信息吗?
我的问题是 SQL Server 如何处理需要将比可用空间更多的数据量拉入缓冲区缓存的查询?此查询将包含多个连接,因此磁盘上不存在此格式的结果集,它需要编译结果。但即使在编译之后,它仍然需要比缓冲区缓存中的可用空间更多的空间。
我举一个例子。假设您有一个 SQL Server 实例,它有 6GB 的可用缓冲区缓存空间。我运行具有多个连接的查询,读取 7GB 的数据,SQL Server 如何能够响应此请求?它是否将数据临时存储在 tempdb 中?它失败了吗?它是否只从磁盘读取数据并一次编译段?
此外,如果我尝试返回 7GB 的总数据会发生什么,这是否会改变 SQL Server 处理它的方式?
我已经知道有几种方法可以解决这个问题,我只是好奇 SQL Server 在按规定运行时如何在内部处理此请求。
此外,我确信该信息存在于某处,但我一直没有找到它。
sql-server memory database-internals sql-server-2012 buffer-pool
我在 Windows Server 2012 R2 上运行 SQL Server 2017,并将内存从 256 GB 增加到 512 GB。我注意到虚拟内存的以下配置:
有很多关于将大小设置为已安装内存大小的 1.5 或 2 倍的建议。我读得对还是我误读了这些文章并且它们适用于其他东西?
也有文章建议不要担心虚拟内存,因为SQL应该只使用RAM而不是虚拟内存,而操作系统只需要2GB的虚拟内存?
memory ×10
sql-server ×4
mysql ×3
postgresql ×2
buffer-pool ×1
docker ×1
innodb ×1
linux ×1
monitoring ×1
php ×1
process ×1
ssas ×1
ubuntu ×1