雲計算讓我們在互聯網上擁有自己的私有虛擬服務器非常實惠。Digital Ocean提供每月5美元的入門級Droplet,而亞馬遜在EC2平台上擁有微型實例層,第一年是免費的。如果您想測試一些新技術(多源複製?)或將其概念放在一起,這些實例是非常有用的。然而,這些服務器具有非常低的內存,通常在半個GB到1GB之間。而現在,通常能看到生產級數據庫服務器的內存是上述的100倍。 100MB的內存使用對這些打內存服務器來說不會有顯著差異,但是對512MB的虛擬機絕對非常可觀。我最近遇到了一個MySQL不能啟動的問題。有趣的是MySQL缺乏任何錯誤提示:
140521 08:26:40 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140521 08:26:41 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid
但是,如果我們檢查我們的內核消息,我們清楚地看到內存不足的事件:
May 21 08:26:41 aes2 kernel: Out of memory: Kill process 24774 (mysqld) score 842 or sacrifice child
May 21 08:26:41 aes2 kernel: Killed process 24774, UID 0, (mysqld) total-vm:549180kB, anon-rss:437324kB, file-rss:44kB
或者在其他情況下,我們看到InnoDB無法分配緩衝池的錯誤:
2014-05-21 08:33:23 25042 [Note] InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap(137363456 bytes) failed; errno 12
2014-05-21 08:33:23 25042 [ERROR] InnoDB: Cannot allocate memory for the buffer pool
但是我們確實有RAM可用:
[root@aes2 ~]# free -m total used free shared buffers cached Mem: 490 86 403 0 7 32 -/+ buffers/cache: 46 443 Swap: 0 0 0
[root@aes2 ~]#
那麽這裏的問題是性能機製,所以不是很明顯。MySQL啟動時,它會分配所需的所有RAM。默認情況下,它將使用大約400MB的RAM,這對於具有64GB RAM的數據庫服務器基本可以無視,但是對於小型虛擬機來說這是非常要命的。如果您添加默認的InnoDB緩衝池設置為128MB,就會輕易地超過512MB RAM分配,這還不包括任何操作係統占用的內存。我們可以通過將下麵的命令放在[mysqld]部分配置下麵,輕鬆地禁用性能優化模式:
performance_schema = off
當然也可以在性能模式(Performance Schema)下自定義使用那些監視器來減少內存占用。雖然內存受限,最好也能使用所有的功能,比如緩存(buffer pool)。有一個MySQL錯誤報告提供了關於性能模式的一個非常好的描述:[http://bugs.mysql.com/bug.php?id=68514]http://bugs.mysql.com/bug.php?id=68514。還有一個功能請求來打印用於性能模式的內存量,這將使整個問題更加可見:[http://bugs.mysql.com/bug.php?id=69665]http://bugs.mysql.com/bug.php?id=69665