Apache-2.2
Mysql高記憶體使用和使用交換
我有一個 1.6GB 的數據庫,每個月會增加大約 200MB 的大小。我有一個 12GB 的 RAM(與 apache、mysql 和 os 共享),mysql 總是使用交換,一旦達到交換空間限制,我需要重新啟動服務。mysql 程序的典型記憶體使用量為 3.5GB,當我的 Web 伺服器上有大量活動時,它會增加到 4.5GB。
- 如何避免使用交換的mysql?
- 1.6GB 數據庫大小的 3.5GB mysql 程序記憶體使用是否正常?
- 我的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 大量使用磁碟儲存臨時表,您需要分析您的應用程序並找出生成大型臨時表的查詢在哪裡,然後重構程式碼以便不需要大型臨時表。