Mysql内存使用率高以及使用交换

Mysql内存使用率高以及使用交换

我有一个 1.6GB 的数据库,每个月都会增加大约 200MB 的大小。我有 12GB 的 RAM(与 apache、mysql 和 os 共享),mysql 总是使用交换空间,一旦达到交换空间限制,我就需要重新启动服务。mysql 进程的典型内存使用量为 3.5GB,当我的 Web 服务器上有大量活动时,内存使用量会增加到 4.5GB。

  1. 我怎样才能避免 mysql 使用 swap?
  2. 对于 1.6GB 大小的数据库,mysql 进程内存使用量为 3.5GB 是否正常?
  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

答案1

最可能的原因是这些设置:

tmp_table_size=1768M
max_heap_table_size=1768M

这意味着您网站上的查询创建的每个单独的临时表可能占用多达 1768 兆字节的内存,即 1.7 GB。

我会将这些减少到 64M。这将减少内存使用量,但也可能导致 MySQL 将查询的临时表数据写入磁盘,从而降低速度。

如果 MySQL 大量使用磁盘来存储临时表,那么您需要分析您的应用程序,找出生成大型临时表的查询的位置,然后重构代码,以便不需要大型临时表。

相关内容