首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql服务占用太多内存。

mysql服务占用太多内存。
EN

Database Administration用户
提问于 2014-10-01 10:45:57
回答 2查看 11.1K关注 0票数 3

我在linux服务器上有一个mysql 5.6.19,它需要大约8GB的内存。这远远超出了我的预期。

大约有150分贝,每个有700个表。他们都是无辜的。我们不关心他们的安全。

显示引擎INNODB状态-分配的内存总数为4395630592。所以我不明白为什么mysql需要额外的3.5GB,有什么建议吗?

代码语言:javascript
复制
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  
EN

回答 2

Database Administration用户

发布于 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统计信息,这并不令人担忧,但我可以从中推断出您正在执行的查询不是最理想的查询。

因此,我的建议是:

  • 关闭大部分与内存相关的、仅会话变量或查询变量(例如tmp_table_size)。
  • 关闭与表缓存相关的变量
  • 通过设置连接池(或重新配置当前连接)来降低并发性。这将允许您在不影响应用程序吞吐量的情况下拒绝max_connections。

这些延迟会增加延迟,但为了增加并发性,这是必要的。如果您想要具有相同内存资源的更多并发性,则必须在多个服务器上拆分您的表(又名分片)。一般来说,从您的配置文件中有很多我不喜欢的东西,但是我没有勇气告诉您在不亲自评估的情况下修改它们。

  • 关闭performance_schema (它将为您配置的连接数节省1GB内存)
  • 修复您的查询并开始使用索引。或者创建适当的索引。这可能是第一步。
  • 避免使用MySQL- -在没有看到查询的情况下,有些东西告诉我,大多数查询可以很容易地缓存在应用程序或中间件层。5.6甚至有一个免费的memcached服务器!
  • 注意正在执行的回滚(在统计数据收集时正在运行1)。回滚是非常昂贵的资源(内存和CPU)。

有关更详细的信息,我需要执行查询审核。

票数 4
EN

Database Administration用户

发布于 2014-10-01 15:06:12

Performance根据设置的值在启动时分配内存。它占用了监控所需的所有内存。这意味着,如果有5或50个连接并不重要,只是允许400个连接。

如果不使用/需要性能架构,请禁用它:

代码语言:javascript
复制
performance_schema = off

关于性能模式的文档:http://dev.mysql.com/doc/refman/5.6/en/performance-schema.html

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/78138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档