减少 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_size
和 query_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 的内存消耗的主要内容,如果未能解决你的问题,请参考以下文章