我给了MySQL 5GB内存(我使用了innodb),但是当我插入大量数据(dumpfile是1GB)时,硬盘I/O仍然是一个瓶颈(CPU不忙,硬盘驱动器也不忙)。
是否有可能迫使MySQL不使硬盘成为瓶颈?
发布于 2013-05-05 01:03:50
简单地说,您不能消除对磁盘的写操作,因为InnoDB正在尽最大努力确保服务器崩溃时它能够恢复。
我强烈建议不要迁移到MyISAM --如果服务器崩溃,那么大量写入的MyISAM表极有可能损坏,而且您可能会丢失数据(或者需要从备份恢复)。
但是,在事务处理期间有几点可以在性能和数据安全之间进行权衡。您还可以调优服务器上的磁盘配置。
您可能会发现,更改加载数据的方式将是解决问题的最有效方法。
dumpfile是在另一个MySQL数据库上运行mysqldump的结果吗?如果是这样的话,而且源数据库是MyISAM,您可能会发现导出MyISAM data 按主键顺序会使导入更加顺利(尽管它将导致导出在源系统上花费更长的时间)。
如果数据是通过其他机制加载的,则有几种行为更改可能会有所帮助--更小或更大的事务大小、在加载数据之前对数据进行排序、故意在写入之间添加延迟等等。
如果还没有,您可能希望将InnoDB数据放在与其他磁盘不同的磁盘上,最好是快速的磁盘。
InnoDB/MySQL的不同部分也以不同的方式写入磁盘,如果可以的话,尝试将它们保存在单独的磁盘上是有益的。例如,二进制日志和innodb日志文件通常按顺序写入(位置1,位置2,位置3.),而数据文件被随机地读写(位置200,位置38937,位置2.)。
如果您使用的是本地旋转磁盘(而不是SAN或SSD),那么在不同磁盘上保持随机和顺序的IO可以提供显著的性能改进。
调整硬盘配置也有帮助--如果您使用的是Linux,请考虑像XFS或ext4这样的现代文件系统,或者在挂载您的文件系统时使用noatime等选项,这样数据库每次读取文件时就不必向磁盘写入更新。
最后,如果使用Unix类型的操作系统,磁盘调度程序也将发挥重要作用。如果磁盘配置为使用noop或deadline之类的调度程序,而不是默认的cfq,则数据库的性能通常会更好。关于这一点有一些详细的讨论。
这本书“高性能MySQL”是一本很好的读物,并详细介绍了其中的大部分主题。
默认情况下,在MySQL中关闭二进制日志记录。它由日志_箱子服务器设置控制。
如果是的话,这会带来一些很大的好处。如果没有它,复制是不可能的,如果数据库损坏了,而您所拥有的只是12小时前的备份,那么您将无法进行实时恢复。
但是,写入二进制日志和master.info文件是磁盘要做的另一件事。
如果您不需要二进制日志提供的好处,您可以关闭它。
这通常是大多数写活动发生的地方。
默认行为是:当您向数据库提交更改时,数据库将“写入”发生在innodb日志文件(通常称为ib_logfile*)上的内容,并立即将该更改“刷新”到磁盘。
“写”和“刷新”有区别--将文件写入磁盘意味着MySQL已经告诉操作系统进行更改,但是操作系统可能会选择等待,然后才真正将文件写入磁盘。“刷新”文件意味着MySQL将强制操作系统将其物理写入磁盘。
但是,可以通过MySQL变量诺姆b_同花顺_日志_在…_trx_提交修改这种行为。
如果可能的话,我建议将它保留在缺省值1--这是迄今为止对MySQL最安全的设置。
如果值为2,则在提交事务时,数据库将“写”到磁盘,但每秒“刷新”一次--给操作系统更多的时间来处理对无害数据库日志文件的写入,并且通常会稍微提高性能。
如果值为0,数据库将仅每秒将“写”和“刷新”到磁盘一次。
令人惊讶的是,MySQL通常会尽力延迟将数据写入InnoDB数据文件。根据诺姆b_最大值_脏的_页面_pct的值和MySQL的版本,它可能要等到超过75%甚至90%的数据库发生更改后,才会担心将数据从内存推送到磁盘上的数据文件。
如果日志文件被旋转,InnoDB也会强制向磁盘写入更改( innodb日志文件大小会影响日志文件的大小)。为服务器正确设置此值将是一种尝试和错误--您可能需要较低的值,以便在文件过期时不会减慢服务器的速度,或者您可能需要它很大,以便您可以处理数据导入而不需要MySQL将数据文件刷新到磁盘。
https://dba.stackexchange.com/questions/41413
复制相似问题