我目前正在优化我们的MySQL生产服务器,我注意到这个服务器上的内存使用率只会增加。 它永远不会减less。 我在几个网站上看到,这可能是由于许多开放的连接造成的。 然而,我们的服务器在任何给定的时间都有很less的连接(最多15个睡眠/查询)。 经过一段时间的查询变得非常慢,我认为这是因为使用服务器的交换文件,因为内存已满。
这是正常的行为还是内存泄漏,我怎么才能最好地确定问题?
只需在我们的服务器configuration和my.iniconfiguration文件下面完成即可。
服务器configuration:
的my.ini
[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
随着caching的build立,内存使用量会增加。 简而言之,就像记住什么查询以及结果是什么,以便相似或相同的查询可以更快地获取。 这就是为什么你有像tmp_table_size等设置
这是正常的行为,但是,不可能说你没有内存泄漏或某种问题,因为上面是一般性的答案。
如果你认为你有问题,你可以尝试更新,如果你还没有(5.1分支,5.1.73现在是最新的稳定,或者你可以进一步5.5 / 5.6分支)。
您还可以调整您的configuration,使其更能够处理容易出错的情况。 这些包括但不限于:
myisam_max_sort_file_size=100G – 你真的需要这个大吗? 你甚至没有内存来处理这个问题。 在现代操作系统上,减less物理内存的使用是罕见的。 免费的RAM是完全浪费的。 如果有什么操作系统可能放在那个可能有用的RAM中,那就比让它自由。 所以看到物理RAM的使用经常增加而且很less减less是完全正常的。
考虑从磁盘读入的数据。 当这些数据不再需要时,系统有两种select。 它可以使内存免费或不使其免费。 让我们先考虑一下,如果它让它自由:
这需要努力,内存必须放在空闲列表中。
如果稍后需要数据,则必须再次从磁盘读取数据。
如果RAM需要用于某些其他目的,则必须使其不再有空。
现在,让我们考虑一下是否继续使用它:
这不费力气。 内存已经在使用,并保持这种状态。
如果稍后需要数据,则不必从磁盘读取数据。
如果以后需要将RAM用于其他目的,则不需要从空闲列表中删除。
赢得所有。
如果你在想,“我想RAM现在是免费的,所以我可以使用它”,这是愚蠢的。 您现在可以使用它, 并在以后使用它。 没有任何痛苦的折衷。