最近server很常因為InnoDB的分配記憶體給Buffer pool出錯導致mysql自動關閉,而使wordpress毀滅,找了很多方式還是沒個頭緒知道錯誤源頭是在哪。最後決定用最笨的方法,每天固定一個時段release memory,使每次InnoDB有需求時都能有空間分配。

大致上的mysql錯誤訊息如下:
120514 23:31:37 InnoDB: Initializing buffer pool, size = 128.0M InnoDB: mmap(137363456 bytes) failed; errno 12 120514 23:31:37 InnoDB: Completed initialization of buffer pool 120514 23:31:37 InnoDB: Fatal error: cannot allocate memory for the buffer pool
網路上另有解法是建一InnoDB的設定檔在/etc/mysql/conf.d/innodb_mysql.cnf ,減少buffer pool的size分配,但發現server運行一段時間還是會導致memory滿的情況發生(沒辦法,筆者太窮只能用最便宜的aws ec2 micro instance),內容如下:
[mysqld] # innodb settings innodb_additional_mem_pool_size = 12M innodb_buffer_pool_size = 64M innodb_file_per_table = 1 innodb_flush_log_at_trx_commit = 2 innodb_lock_wait_timeout = 180 innodb_log_buffer_size = 16M innodb_open_files = 512 innodb_thread_concurrency = 0

Ubuntu釋放記憶體

```

sudo su

echo 1 > /proc/sys/vm/drop_caches   # To free pagecache

echo 2 > /proc/sys/vm/drop_caches   # To free dentries and inodes

echo 3 > /proc/sys/vm/drop_caches   # To free pagecache, dentries and inodes

sync # 完全釋放cache memory


接著將這些指令寫成一個.sh檔放到crontab內執行即可。

sudo su

vi /scripts/free_mem.sh

crontab -e


在設定檔中加入"0 0 * * * /scripts/free_mem.sh",使每天00:00自動執行free memory的script。OK, Done.
<h2><span style="color: #3366ff;">Reference</span></h2>
<ul>
	<li><span style="line-height: 22px;"><a href="http://blog.yesican.tw/?p=912">http://blog.yesican.tw/?p=912</a>
</span></li>
	<li><a href="http://kevin.vanzonneveld.net/techblog/article/schedule_tasks_on_linux_using_crontab/">http://kevin.vanzonneveld.net/techblog/article/schedule_tasks_on_linux_using_crontab/</a></li>
</ul>