【问题标题】:Fine tuning MYSQL for best performance微调 MYSQL 以获得最佳性能
【发布时间】:2022-01-20 04:24:54
【问题描述】:

我有一个运行在 128GB RAM、500GB HDD 和 10 核处理器上的数据库服务器。 我已经安装了 mysqltuner 并按照建议调整了所有变量,但 MySQL 性能仅提高了几个小时,然后又回到了缓慢的性能。 根据mytop,我有大约 8 个慢查询,我怀疑这可能是造成这种情况的原因。 请注意,此服务器仅运行 MySQL。

我怎样才能最好地进一步改进/优化 MySQL 性能。下面是mysql.conf文件的sn-p。

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]

user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

key_buffer_size     = 128M
max_allowed_packet  = 400M
thread_stack        = 284K
thread_cache_size       = 64

innodb_buffer_pool_size = 4G
innodb_log_file_size = 576M
innodb_buffer_pool_instances = 4
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
innodb_doublewrite = 0
innodb_support_xa = 0
innodb_checksums = 0

join_buffer_size=500M
sort_buffer_size=4M
read_buffer_size=4M
read_rnd_buffer_size=4M
table_definition_cache=4096
table_open_cache=4096
tmp_table_size=536870912
optimizer_search_depth=12
innodb_adaptive_hash_index=0
max_heap_table_size=1610612736
expire_logs_days    = 10
max_binlog_size   = 100M

【问题讨论】:

  • 请提供更多信息。在 pastebin.com 上发布并分享链接。从您的 SSH 登录根目录中,文本结果为:A) SELECT COUNT(*) FROM information_schema.tables; B) 显示全球状态;至少 24 小时正常运行时间后 C) 显示全局变量; D) 显示完整的处理程序;和 可选的非常有用的信息,如果可用,包括 - htop 或 top 用于大多数活动应用程序,ulimit -a 用于 Linux/Unix 限制列表,iostat -xm 5 3 用于按设备和核心/cpu 计数的 IOPS,用于服务器工作负载调整分析提供建议。
  • 请将您的完整 MySQLTuner.pl 报告(在 24 小时正常运行后生成)和您的 MYTOP 结果以及 HTOP 报告发布到 pastebin.com。
  • 从您的配置中删除这 4 行 join_buffer_size=500M sort_buffer_size=4M read_buffer_size=4M read_rnd_buffer_size=4M 将产生惊人的改进,证明简单的调整可能是有益的,并且允许默认值对您有利。
  • @Wilson,你能帮忙解释一下删除它们会有什么帮助吗?这是粘贴pastebin.com/DTWvzjQz的链接
  • 您对 512M 的请求要求每个 CONNECTION 为特定限制做好准备。默认值分别为 256K、256K、128K 和 256K,每个 CONNECTION 的总准备量小于 1M。具体在read_rnd_buffer_size的情况下,为什么在256K的时候读4M会提高性能呢?您正在强制系统读取完成任务所需数据的 16 倍。分析中。希望在 48 小时内为您提供建议。

标签: mysql


【解决方案1】:

每秒速率 = RPS

建议考虑为您的 my.cnf [mysqld] 部分提高性能

tmp_table_size=1610612736  # from 536870912 to match max_heap_table_size and reduce created_tmp_table RPHr of 218
read_rnd_buffer_size=96K  # from 4M to reduce handler_read_rnd_next RPS of 1,005,923
read_buffer_size=512K  # from 4M to reduce handler_read_next RPS of 2,584,343
net_buffer_length=96K  # from 16K to reduce packet send/receive frequency

观察, opens_tables 在您的状态中计数为每小时 1,261。 从您的操作系统提供 ulimit -a 报告可能会识别对您的工作负载限制过低的打开文件。

请查看个人资料以获取联系信息以及免费提示和实用脚本以帮助进行性能调整。

【讨论】:

  • @Benson Okello 您的实例现在表现如何?
【解决方案2】:

为了建议您更改配置,我们还应该了解当前 MySQL 状态和数据库大小。

尝试查看 Releem - MySQL 性能调优工具。它会从您的服务器收集指标并对您当前的配置进行评分。

它还可以为您推荐性能优化的 MySQL 配置。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
  • @WilsonHauck 请尝试再次发送电子邮件。
  • 我们没有收到您的电子邮件。请尝试向我们发送电子邮件至 hello[at]releem.com。我已经在 Skype 上给你写信了
  • Releem 确实会回复电子邮件。有一些超时问题导致电子邮件无法发送到 releem.com Releem 将与他们的电子邮件托管服务合作,以提高人们尝试联系他们时的可靠性。 Roman,感谢您今天的联系。
【解决方案3】:

您无法解决大多数性能问题。识别“慢”查询,将它们与SHOW CREATE TABLEEXPLAIN 一起显示在此处。

慢日志是发现哪些“最差”的好方法。 http://mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog

同时,您使用的是什么版本?你用什么引擎做桌子? (希望 InnoDB 适用于您的所有表。)

由于您有 128GB 的​​ RAM,缓冲池的 4G 太小了;改变:

innodb_buffer_pool_size = 90G
innodb_log_file_size = 2G
innodb_buffer_pool_instances = 16

您是否将 ENGINE=MEMORY 与一些大表一起使用?如果不是,请更改为:

max_heap_table_size = 500M

【讨论】:

  • 嗨 Rick,我使用的是 5.7 版和 InnoDB。我已经按照建议调整了变量,并且正在监控性能。
  • @RickJames 我相信这个问题只能追溯到 4 天。我可能是错的。
  • Benson,由于您的实例在 7 天内只需读取每个 innodb_data_read (BYTES) 的 4G 数据,因此更合理的 innodb_buffer_pool_size 应该是 8G。此外,如果您将 innodb_change_buffer_max_size 从 25 更改为 50(百分比),您将在需要时加快完成 innodb_pages_created。 innodb_log_buffer_size 从 16M 到 200M 会降低对日志的 WRITE 频率以提高性能。目前 innodb_buffer_pool_instances 可以保持在 4 以使用 8G 缓冲池大小。
猜你喜欢
  • 2022-01-23
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多