我有一个 1.6GB 的数据库,每个月都会增加大约 200MB 的大小。我有 12GB 的 RAM(与 apache、mysql 和 os 共享),mysql 总是使用交换空间,一旦达到交换空间限制,我就需要重新启动服务。mysql 进程的典型内存使用量为 3.5GB,当我的 Web 服务器上有大量活动时,内存使用量会增加到 4.5GB。
- 我怎样才能避免 mysql 使用 swap?
- 对于 1.6GB 大小的数据库,mysql 进程内存使用量为 3.5GB 是否正常?
- 我的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 大量使用磁盘来存储临时表,那么您需要分析您的应用程序,找出生成大型临时表的查询的位置,然后重构代码,以便不需要大型临时表。