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

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

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

我已经用mysqltuner调整了MySQLconfiguration, 并将 插入设置为低优先级 。

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

我想到的可能的解决scheme,但他们似乎并不完美,或从源头上真正解决问题:

  • 使用cpulimit进行cron作业(获取内容的速度会更慢,但在大量插入过程中,MySQL仍然会挂起)
  • 人为地减慢插入速率(可能在有限的范围内,必须快速插入2k行)。 我认为一个大插入应该比2kprimefaces插入更好。
  • 在同一台服务器上运行两个MySQL代理(起初这似乎是一个坏主意,但也许可以缓解争用)
  • 切换到InnobDB(使用misam),甚至完全切换到PostgreSQL?
  • 完全caching前端,以避免任何MySQL相关挂起(不可能在所有页面上,已经有很多caching的数据,但它们必须经常在crons获取新的数据运行后更新)

我build议用足够的空行预填充表,以获得一整天的数据。 因为不需要分配,所以应该使插入更快。

我认为innodb是你最好的select。 MyISAM执行表级locking,这将在更新期间阻塞。 MySQLlocking细节文档

我也有与m1.small实例混合的结果。 他们是部分CPU拆分,如果你的VM室友很忙,必须得到。 (检查vmstat for cpu steal)您可以尝试简单升级到c1.medium。 EC2实例types它具有与小型CPU相同的RAM占用空间,但CPU资源是5X。 (成本的两倍)

在一个小的两个MySQL实例可能是一个坏主意。 (只有一个虚拟CPU)

如果你想保持低廉的价格,试着把那些在2000分钟内写出来的15分钟的窗口。 (〜200分钟)

你也没有给出有关你的内存或MySQL设置的任何细节。 你的myisam_block_size是4k吗? 什么是你的MyISAM key_buffer? 你看过MyISAM concurrent_insert设置吗?

干杯。