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的。