减少 ubuntu@aws 微实例上 mysql 的内存消耗

Posted

技术标签:

【中文标题】减少 ubuntu@aws 微实例上 mysql 的内存消耗【英文标题】:Reducing memory consumption of mysql on ubuntu@aws micro instance 【发布时间】:2012-05-27 10:50:48 【问题描述】:

我最近开始了一个 PoC 项目,我们正在开发一个小型网络应用程序。初始设置是在 AWS 的微型实例上完成的。我们在 rails+mysql 堆栈上。

安装/运行 MySQL 后,我看到已经消耗了大约 500+ MB RAM;剩下的系统就少得多了(微型实例只有 620 MB RAM)。

在这个阶段,我们的应用程序相当简单。我可以做些什么来减少 MySQL 服务器消耗的内存吗?

感谢您的帮助。

【问题讨论】:

你是如何定义内存消耗的?有很多 MySQL 设置可以控制内存大小。 我不是mysql管理员,但是我看到系统上,除了操作系统本身和mysql服务器外,没有其他东西在运行,并且消耗了超过500M... 优化您的查询!查看慢查询日志以查看确切的查询。可能很多内存浪费在临时表中 【参考方案1】:

在您的/etc/my.cnf 文件中:

performance_schema = 0

然后重新启动 MySQL。如果您以前启用它,这应该会显着减少内存使用量。


编辑:对于介于 5.7.8 和 8.0.1 (not required from 8.0.1 onwards) 之间的 MySQL 版本,以上内容不足以释放性能架构数据的内存:

从 MySQL 5.7.8 开始,即使禁用了性能架构,它也会继续填充 global_variables、session_variables、global_status 和 session_status 表。

(source)

为了防止这种行为,除了performance_schema 之外,将show_compatibility_56 设置为1。也就是说,您的 my.cnf 更改应如下所示:

performance_schema = 0
show_compatibility_56 = 1

【讨论】:

将我的从 400MB 减少到 25MB。 这对于低内存服务器非常有帮助。谢谢 !仅供参考,show_compatibility_56 = 1 已删除 MySQL 8.0.1 以上dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html 仅供参考 这两个是在 AWS Aurora RDS 5.7 上默认设置的 我不需要在 MySQL 8.0.19 上使用 show_compatibility_56 = 1 从 400MB 到 95MB。 在我的系统(Ubuntu 20.04,mysql 8.0.22)上,我在/etc/mysql/my.cnf 找到了配置文件,并且必须在performance_schema = 0 之前添加一行[mysqld]。将内存使用量从约 350MB 减少到 130MB。【参考方案2】:

在 MySQL 配置文件 (my.cnf) 中更改此设置

key_buffer              = 8M 
max_connections         = 30 # Limit connections
query_cache_size        = 8M # try 4m if not enough 
query_cache_limit       = 512K
thread_stack            = 128K

【讨论】:

另见 Mahn 的回答,它更加激进和高效。 我选择了 1.5G 到 0.5G。非常感谢 这个答案与 Mahn 相结合,将 t2.micro 上 RAM 的使用率从 21% 降低到 0.2%!!!它从 200M 变为 2M key_buffer 在 mysql 5.7 上给了我错误。我正在使用 key_buffer_size 代替 运行 MySQL 8.0.17。除了按照 Ivan 的建议将 key_buffer 替换为 key_buffer_size 之外,我还必须删除 query_cache_sizequery_cache_limit 行。 MySQL 文档说“查询缓存自 MySQL 5.7.20 起已弃用,并在 MySQL 8.0 中被删除。”【参考方案3】:

我有一台只有 500mb 内存的服务器,发现随着我的表变大,mysql 开始使用大量内存。在玩了一堆设置之后,对我来说减少内存使用的是将我所有的表都转换为 MyISAM。 如果您不需要 innodb 将表转换为 MyISAM 的功能,会很有帮助。 您可以像这样转换表格:

ALTER TABLE test.mytable ENGINE=MyISAM;

进行此更改后,我发现内存使用量减少了 20%。 为了进一步减少内存使用,您可以将所有表转换为 MyISAM,然后完全关闭 mysql 中的 innodb 支持。 这将我的内存使用量减少了 50%。

您可以通过添加:

[mysqld]
default_storage_engine=myisam
innodb=OFF

然后重启mysql。

【讨论】:

我会根据我看到的导致数据损坏的不正常关机次数建议不要使用 MyISAM。请参阅可靠性部分“MyISAM 不提供数据完整性 - 硬件故障、不干净的关闭和取消的操作可能导致数据损坏。” ***.com/questions/20148/myisam-versus-innodb 是的,如果 MyISAM 适合你,你应该考虑 NoSQL。您显然不需要 ACID 事务。【参考方案4】:

只是添加到另一个答案。我最近在使用 Amazon 微型实例(不是 Ubuntu)时遇到了这个问题。 my.cnf 文件几乎是空的,所以我所做的是:

cp /etc/my.cnf /etc/my.cnf.orig
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

编辑 my.cnf 并启用 innodb 行(如果适用)。重启mysqld。

微实例也没有交换,这可能是个问题..

SWAPFILE=/mnt/swapfile.swap
dd if=/dev/zero of=$SWAPFILE bs=1M count=512
mkswap $SWAPFILE
swapon $SWAPFILE

然后在/etc/rc.local中添加:

交换 /mnt/swapfile.swap

要在 ruby​​ 中节省内存,您可能需要使用 ruby​​ enterprise:

bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
gpasswd -a root rvm
source /etc/profile.d/rvm.sh
rvm get head
rvm reload
rvm install ree
rvm --default use ree

【讨论】:

感谢有关 my.cfg 的提示。我目前正在使用从源代码构建的 ruby​​。 REE 页面说它会降低大约 30% 的内存使用量。但是,另一个我找不到答案的问题是 rails 3.2.2 可以与 ruby​​ 1.8.7 一起正常工作(REE 基于/与 ruby​​ 1.8.7 兼容)... 在安装 ree 后使用 gem 安装 rails 时,您会得到 3.2.3。 在执行 swapon /mnt/swapfile.swap 时交换是否正常工作,但在启动时没有启动?如果您的 rc.local 文件顶部有这个:#!/bin/sh -e,您可以尝试删除 -e。 启用交换文件是对我数月来使用 Amazon micro 的麻烦的最有价值的回应。与摆弄 my.cnf 相比,这非常有帮助,坦率地说,只有 600KB 的 RAM 没有任何区别。

以上是关于减少 ubuntu@aws 微实例上 mysql 的内存消耗的主要内容,如果未能解决你的问题,请参考以下文章

让您轻松理解分布式事务产生的场景

RDS for MySQL 删除数据后空间没有减少处理方法

用户实例|TNO:CI/CD与微服务架构

Ubuntu 上托管的 LAMP 应用程序的 AWS SSL 证书

SpringCloud微服务开发如何协同

MySQL性能优化2---数据类型和实例的优化