我目前正在优化我们的 mysql 生产服务器,我注意到该服务器上的 RAM 使用量只增不减。我从几个网站上看到,这可能是由于打开太多连接造成的。但是我们的服务器在任何给定时间内的连接数都很少(每个查询最多 15 个睡眠)。一段时间后,查询变得非常慢,我认为这是因为服务器的交换文件被占用,因为 RAM 内存已满。
这是正常行为吗?还是有内存泄漏?我如何才能最好地识别问题?
下面只是为了完成我们的服务器配置和my.ini配置文件。
服务器配置:
- Windows 2008 SBS 服务器
- Mysql 社区服务器 5.1
- 4 个四核处理器
- 32 GB 内存
- 142 GB 内存(Raid 1)
我的配置文件
[client]
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir="E:/MySQL/MySQL Server 5.1/"
datadir="E:/MySQL/Data/"
default-character-set=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
table_cache=256
tmp_table_size = 2G
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=410M
key_buffer_size=354M
read_buffer_size = 64
read_rnd_buffer_size=256K
sort_buffer_size = 10M
innodb_additional_mem_pool_size=15M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=7M
innodb_buffer_pool_size = 7G
innodb_log_file_size=343M
innodb_thread_concurrency=18
max_allowed_packet=16M
wait_timeout = 4800
ft_min_word_len = 2
ft_stopword_file = ""
max_heap_table_size = 2G
tmpdir = "E:/mysql/MySqlTmp/"
log-slow-queries = "F:/log/slow.log"
long_query_time = 2
init-file=E:\mysql\MySQL Server 5.1\my_OnStartup.txt
答案1
随着缓存的建立,内存使用量也会增加。简而言之,这就像记住查询的点点滴滴以及查询的结果,以便可以更快地获取类似或相同的查询。这就是为什么有 tmp_table_size 等设置的原因。
这是正常现象,但是,不可能说你没有内存泄漏或某种问题,因为以上是一个一般答案。
如果您认为自己遇到了问题,您可以尝试更新(如果还没有更新的话)(5.1 分支中,5.1.73 现在是最新稳定版本。或者您可以进一步升级到 5.5/5.6 分支)。
您还可以调整配置,使其更有能力处理容易出错的情况。这些包括但不限于:
- 降低 wait_timeout。坦白说,降低很多...您真的遇到需要等待 80 分钟的情况吗?!
myisam_max_sort_file_size=100G
- 你真的需要这么大吗?你甚至没有足够的内存来处理它。- 配置您的配置,以使内存使用量不能大于可用内存(您指定的是 32GB)。这是为了防止交换使用量导致性能下降。
答案2
在现代操作系统中,物理 RAM 使用量减少的情况很少见。空闲 RAM 完全被浪费了。如果操作系统可以将任何可能有用的东西放入该 RAM 中,那么这比将其空闲要好。因此,物理 RAM 使用量经常增加而很少减少是完全正常的。
考虑从磁盘读取的数据。当不再需要该数据时,系统有两种选择。它可以释放内存,也可以不释放内存。让我们首先考虑是否释放内存:
这需要付出努力,必须将内存放在空闲列表中。
如果稍后需要数据,则必须再次从磁盘读取。
如果需要将 RAM 用于其他目的,则必须不再免费使用。
现在,让我们考虑一下它是否可以继续使用:
这不需要任何努力。RAM 已被使用,并且保持原样。
如果稍后需要数据,则不必从磁盘读取。
如果稍后需要将 RAM 用于其他用途,则无需将其从空闲列表中删除。
全面胜利。
如果你在想,“我现在想让 RAM 空闲,以便以后使用”,那就太愚蠢了。你现在就可以使用它和以后再用。无需做出痛苦的权衡。