我在linux服务器上有一个mysql 5.6.19,它需要大约8GB的内存。这远远超出了我的预期。
大约有150分贝,每个有700个表。他们都是无辜的。我们不关心他们的安全。
显示引擎INNODB状态-分配的内存总数为4395630592。所以我不明白为什么mysql需要额外的3.5GB,有什么建议吗?
my.cnf
innodb_log_buffer_size = 100M
innodb_log_file_size=1000M
innodb_flush_log_at_trx_commit=0
innodb_open_files=50000
innodb_flush_method=O_DIRECT_NO_FSYNC
innodb_force_recovery=0
innodb_buffer_pool_size=4G
innodb_flush_log_at_timeout=5
innodb_stats_on_metadata=OFF
innodb_checksums=OFF
innodb_thread_concurrency=0
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_file_per_table=0
innodb_sort_buffer_size=2M
max_connections=400
tmp_table_size=20M
max_heap_table_size=20M
innodb_ft_total_cache_size=64000000
innodb_ft_result_cache_limit=100000000
interactive_timeout=1500
wait_timeout = 300
open_files_limit=50000
table_open_cache=20000
table_definition_cache=20000 发布于 2014-10-05 18:13:30
您的配置和运行状态有很多问题:
对于您的配置,在不运行查询之前,您需要分配1.5GB的静态内存--甚至在使用缓冲池之前,都要执行no连接。其中大部分(1GB)被分配到performance_schema,但仍有500 vs被分配(对于默认配置来说是42k )。
您还创建了相当多的临时表(180个表/S),其中一半在内存中,-I打赌其他90个表是在内存中创建的,然后是在磁盘上创建的。在您的设置中,这可以计算为每秒最多1.8GB的临时表。
您的查询具有不可忽略的完整联接和全表扫描,每秒随机读取26K行,每秒排序3K。总之,您最终会在读缓冲区、连接缓冲区和排序缓冲区中浪费大量资源。这是为90个同时连接。对于MySQL来说,90并不是一个很高的数字,但是对于正在执行的查询类型,您需要更多的资源--这会检查很多行。
您说您有100 K表,这通常会影响InnoDB字典大小(146米)和open_table_cache。你增加了一些缓存,但我不同意这是正确的做法。
除此之外,您还可以使用显示状态命令进行大量连接,这在ORM/框架中是典型的。在5.6中,元数据命令不会自动更新InnoDB统计信息,这并不令人担忧,但我可以从中推断出您正在执行的查询不是最理想的查询。
因此,我的建议是:
这些延迟会增加延迟,但为了增加并发性,这是必要的。如果您想要具有相同内存资源的更多并发性,则必须在多个服务器上拆分您的表(又名分片)。一般来说,从您的配置文件中有很多我不喜欢的东西,但是我没有勇气告诉您在不亲自评估的情况下修改它们。
有关更详细的信息,我需要执行查询审核。
发布于 2014-10-01 15:06:12
Performance根据设置的值在启动时分配内存。它占用了监控所需的所有内存。这意味着,如果有5或50个连接并不重要,只是允许400个连接。
如果不使用/需要性能架构,请禁用它:
performance_schema = off关于性能模式的文档:http://dev.mysql.com/doc/refman/5.6/en/performance-schema.html
https://dba.stackexchange.com/questions/78138
复制相似问题