【问题标题】:MySQL preventing dual loadingMySQL防止双重加载
【发布时间】:2009-07-07 03:36:14
【问题描述】:

对的人,

我有一个 MySQL 数据库,在表上使用 InnoDB,我必须经常执行一个大型 cron 作业来执行大量查询和插入。当我运行这个 cron 作业时,它运行了 5 分钟左右,没有其他页面能够加载。一旦完成,就会执行查询并加载页面。

实际上添加了所有这些数据的表甚至没有被主站点查询。很简单,当 MySQL 工作量很大时,站点的其余部分就无法触及。这肯定是不对的,是什么导致了这种情况发生? MySQLD 的 CPU 使用率飙升至 120% (!!!!!) 之类的巨大数字,并且所有 MySQL 查询都被锁定。

什么可能导致/解决这个问题?

【问题讨论】:

  • myslqd 是多线程的,因此如果您有多个内核,则可以轻松超过 100%。例如,对于 8 核机器来说,120% 听起来一点也不大。
  • 我从来不知道,非常感谢。

标签: php mysql


【解决方案1】:

不,这显然是错误的。这可能与错误的配置有关。看一下innodb缓冲池的大小,看看能不能增加。这听起来像是一个典型的 ram 短缺案例。健康的设置几乎从不受限于 CPU,在进行批量插入时当然也不会。

【讨论】:

    【解决方案2】:

    使用 InnoDB,其他东西应该仍然能够访问数据库。您准备好展示架构(或其相关部分)和应用程序的相关部分了吗?

    也许是硬件争用。

    您的“cron”作业正在使用的事务有多大?使用微小的事务会不必要地产生大量的 IO。

    您的数据库服务器是否有电池支持的 RAID 控制器(假设您的服务器使用硬盘而不是 SSD)?如果没有,提交会很慢。

    您的数据库服务器中有多少内存?如果可能,请确保它比您的数据库大一点并将 innodb_buffer_pool 设置为 > 数据大小 - 这意味着读取工作负载无论如何都来自 ram,这应该会使它们变得更快。

    您能否在生产级硬件的测试系统中重现该问题?

    【讨论】:

      【解决方案3】:

      我认为您可能需要重新考虑如何构建查询。 InnoDB 有页面级锁,但是通过大量更新,您仍然可以锁定相当多的查询。

      发布您的实际查询,然后再试一次。我认为没有针对此类通用问题的通用解决方案,因此请考虑优化您今天正在做的事情。

      【讨论】:

        【解决方案4】:

        您可以在每个查询之间有 1/10 秒左右的脚本延迟。这需要更长的时间,但允许在后台进行活动。

        sleep( 0.1 );
        

        您可能只需要为写入执行此操作,读取非常便宜。

        【讨论】:

        • 这是不可取的,因为一次可能发生大约 30,000 次写入,这会使执行时间非常长。
        猜你喜欢
        • 1970-01-01
        • 2019-03-21
        • 2013-03-23
        • 1970-01-01
        • 2020-02-08
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 2020-06-06
        相关资源
        最近更新 更多