Apache-2.2

Mysql高記憶體使用和使用交換

  • February 25, 2014

我有一個 1.6GB 的數據庫,每個月會增加大約 200MB 的大小。我有一個 12GB 的 RAM(與 apache、mysql 和 os 共享),mysql 總是使用交換,一旦達到交換空間限制,我需要重新啟動服務。mysql 程序的典型記憶體使用量為 3.5GB,當我的 Web 伺服器上有大量活動時,它會增加到 4.5GB。

  1. 如何避免使用交換的mysql?
  2. 1.6GB 數據庫大小的 3.5GB mysql 程序記憶體使用是否正常?
  3. 我的mysql配置是這樣的,我的配置優化了嗎?
[mysqld]
innodb_file_per_table
datadir=/var/lib/mysql
tmpdir=/var/lib/mysqltmp
socket=/var/lib/mysql/mysql.sock
skip-locking
skip-name-resolve
table_cache=3072
thread_cache_size=16
back_log=100
max_connect_errors=10000
open-files-limit=20000
interactive_timeout=30
wait_timeout=40
max_connections=100
skip-name-resolve
max_allowed_packet=16M
tmp_table_size=1768M
max_heap_table_size=1768M
query_cache_size=64M
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=8M
join_buffer_size=32M
key_buffer_size=64M
myisam_sort_buffer_size=64M
innodb_log_file_size=100M
innodb_buffer_pool_size=1512M

最可能的罪魁禍首是這些設置:

tmp_table_size=1768M
max_heap_table_size=1768M

這意味著在您的網站上通過查詢創建的每個臨時表可能會佔用多達 1768 MB 的記憶體,即 1.7 GB。

我會將這些減少到 64M。這將減少記憶體使用,但也可能導致 MySQL 將查詢的臨時表數據寫入磁碟,這會減慢速度。

如果 MySQL 大量使用磁碟儲存臨時表,您需要分析您的應用程序並找出生成大型臨時表的查詢在哪裡,然後重構程式碼以便不需要大型臨時表。

引用自:https://serverfault.com/questions/578179