在过去的一周里,我一直在努力解决一个问题,我希望有人能帮助我朝着正确的方向前进。
我们有一个mysql数据库(5.7.19版)运行在NFS卷上--我们遇到问题的表是使用myisam存储引擎。
正常运行时,它以1000插入/秒30更新/秒0的速度运行,选择/sec 0删除/秒
在这段时间里,我们看到大约1.5-2KIOPS\sec--大约有3 MBps吞吐量--这主要是写的
然后有几天,它突然执行较慢的-and,应用程序插入数据备份到队列中,我们只看到下面的内容
450插入/秒27更新/秒0选择/秒0删除/秒
神秘的是--这段时间的体积显示IOPS在2-2.5k,但吞吐量高达11 MBps -和8-9 MBps的读取。我向IOtop确认正在执行读取的是它的mysql线程。
所以-我想我的问题是-我如何确定mysql的内部到底是什么导致了这些读取?我查看了日志,当我们遇到问题时和没有问题时,活动几乎完全相同,只是插入速度较慢,而且由于某种原因,mysql正在读取10倍的数据量,尽管根本没有选择--而且没有比平常更多的更新,进程列表除了插入和一组休眠连接之外,没有显示任何其他活动。
insert上有一个触发器,但是它的set‘在插入之前’,它只是在一个字段中执行一个字符替换,当我们没有问题时,它还是相同类型的语句。
我查看了性能表,虽然它确实显示正在读取的表是要插入的表,但我不知道为什么(没有选择,进程列表中没有解释它的活动)。另外,从所有表中读取的数据加起来不到1.5GB--而读取时间几乎是在9 MBps --所以它实际上应该更接近250 GB。
我确信我错过了一些显而易见的东西,希望有人能为我指明正确的方向:)
谢谢!
发布于 2021-06-09 22:51:42
MyISAM不允许大量并发。任何对表的写“锁定”整个表,阻止所有其他写和读到同一表。
此外,有时来自不同连接的查询链甚至会造成比上面所解释的更多的阻塞。
换句话说,对MyISAM表的任何类型的写入都会阻止所有其他访问,直到写入完成为止。
我怀疑这个TRIGGER是否会带来麻烦(因为它没有触及其他表)。
切换到InnoDB很可能会导致像你所看到的那样更少的阻塞。InnoDB甚至允许同时写入同一表的不同行(但有一些注意事项)。并且读取通常不会被写入阻止。
回到你的问题..。
MyISAM使用两种缓存方法:
MyISAM索引块(每个1KB)被缓存在key_buffer中。它的大小可以通过key_buffer_size进行配置。建议的设置约为可用RAM的20%。通常,这足以避免读取索引块。
MyISAM数据块(由OS控制的大小)被缓存在剩余内存中。操作系统控制着这些块。
(InnoDB缓存不同;如果切换引擎,则需要在my.cnf中进行更改。)
不知道您有多少RAM,您的设置是什么,您的数据集有多大,以及“工作集大小”有多大,我再详细不过了。
有关进一步调查的全球状态和变量的说明,请参见http://mysql.rjweb.org/doc.php/mysql_analysis#tuning --它将包括对key_buffer有效性的一些分析。它将刺痛导致I/O的原因(自上次重新启动以来)。
https://dba.stackexchange.com/questions/287132
复制相似问题