在单个专用服务器架构上处理 cron 作业和 MySQL/CPU 争用

在单个专用服务器架构上处理 cron 作业和 MySQL/CPU 争用

我们有一个小型 EC2 实例,我们在其中运行前端服务器(php5-fpm/nginx),但也有很多获取 cron php 脚本,插入大量数据(每 15 分钟 2k+ 行),这似乎会完全挂起 MySQL 服务器 1-2 分钟,导致前端网站崩溃(超时)。

我认为使用一个主服务器和一个从属服务器(只读,用于前端) MySQL 服务器可以解决这个问题(?),但是对于这个项目我只能使用 1 个实例。

我已经调整了 MySQL 配置mysqltuner将插入内容设置为低优先级

在使用 EC2 之前,我们使用的是共享主机,并没有遇到这个问题,可能是因为与我们的小型 EC2 实例相比,共享服务器的整体硬件更好?

我想到过可能的解决方案,但它们似乎并不完美,或者不能真正从源头上解决问题:

  • 使用 cpulimit 执行 cron 任务(获取内容的速度会更慢,但 MySQL 在大量插入时仍会挂起)
  • 人为地降低插入速率(可能,但在有限的范围内,必须快速插入 2k 行)。我认为一次大插入应该比 2k 次原子插入更好。
  • 在同一台服务器上运行两个 MySQL 守护进程(乍一看这似乎是个坏主意,但也许可以缓解争用)
  • 切换到 InnobDB(使用 misam)还是甚至完全切换到 PostgreSQL?
  • 完全缓存前端以避免任何与 MySQL 相关的挂起(并非在所有页面上都可行,已经有很多缓存数据,但必须在 cron 获取新数据运行后经常更新它们)

答案1

我建议预先在表中填充足够多的空行,以容纳一整天的数据。由于不需要分配,因此插入速度会更快。

答案2

我认为 innodb 是您的最佳选择。MyISAM 执行表级锁定,这会在更新期间阻塞。 MySQL 锁定详细信息文档

我也曾使用 m1.small 实例获得过好坏参半的结果。它们是部分 CPU 分割,如果您的 VM 室友很忙,则必须让步。(检查 vmstat 是否存在 CPU 窃取)您可以尝试短暂升级到 c1.medium。EC2 实例类型它具有与小型计算机相同的 RAM 占用空间,但 CPU 资源却是小型计算机的 5 倍。(成本却是小型计算机的两倍)

在小型服务器上运行两个 MySQL 实例可能不是一个好主意。(只有一个虚拟 CPU)

如果您想要节省成本,请尝试将这 2000 次写入分散到 15 分钟内。(约 200 分钟)

您也没有提供有关内存或 mysql 设置的任何详细信息。您的 myisam_block_size 是 4k 吗?您的 MyISAM key_buffer 是什么?您看过 MyISAM concurrent_insert 设置吗?

干杯。

相关内容