23

我最近开始了一个PoC项目,其中我们正在开发一个小型Web应用程序。最初的设置是在AWS的微型实例上完成的。我们在rails + mysql堆栈上。在ubuntu @ aws微实例上减少mysql的内存消耗

安装/运行MySQL后,我发现大约有500多MB的RAM已经被使用;剩下的系统只剩下少量的620 MB RAM(微型实例)。

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

欣赏帮助。

+0

你如何定义内存消耗?有很多控制内存大小的MySQL设置。 –

+0

我不是mysql管理员,但我看到在系统上,除了操作系统本身和mysql服务器以外,没有别的东西在运行,并且消耗了超过500M的... – Gyan

+0

优化您的查询!查看慢速查询日志以查看确切的查询。可能很多内存浪费在临时表中 –

回答

32

更改此设置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 
+0

帮了很多..感谢提示。 – Gyan

+3

另请参见马恩的答案,这是非常激进和有效的。 –

+0

我去了1.5G到0.5G。非常感谢 – Wistar

1

只需添加到其他的答案。我最近在亚马逊微型实例(而不是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中添加:

swapon命令/mnt/swapfile.swap

为了节省内存在Ruby中,你可能需要使用Ruby企业:

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 
+0

感谢my.cfg上的提示。 我目前使用从源代码构建的红宝石。 REE页面表示,它会降低大约30%的内存使用量。然而,另一个问题,我无法找到答案,轨道3.2.2将工作正常与红宝石1.8.7(稀土是基于/兼容红宝石1.8.7)... – Gyan

+0

此外,我无法获得交换机制开始.. – Gyan

+0

在安装ree后安装带有gem的导轨时,您将得到3.2.3。 – EivinGS

54

在你的my.cnf文件:

performance_schema = 0 

并重新启动mysql。如果您以前使用过内存,应该会显着减少内存使用量。


2016编辑:从MySQL 5.7.8起,上面是不够的,释放你的性能架构数据的存储器:

在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 
+0

削减一半的矿井 –

+2

将矿山从400MB切割为25MB。 – Isaac

+4

我希望我可以投票这十倍... –

1

我只有500MB RAM的服务器,发现MySQL的使用大量的RAM作为我的表有较大的启动。在玩了一大堆设置之后,对我来说减少了内存使用量就是将我所有的表格转换为MyISAM。 如果你不需要innodb转换表的功能,MyISAM可以帮助很多。 您可以转换表是这样的:

ALTER TABLE test.mytable ENGINE=MyISAM; 

这种变化我发现,内存使用量减少了20%之后。 为了进一步减少内存使用量,您可以将所有表格转换为MyISAM,然后关闭MySQL中的innodb支持。 这减少了50%的记忆体使用量。

您可以通过添加做到这一点:

[mysqld] 
default_storage_engine=myisam 
innodb=OFF 

,然后重新启动mysql的。