我有配置有标准LAMP的Debian VPS。 在此服务器上,只有一个站点(商店)具有一些cron作业-大多数是PHP脚本。其中之一是Lynx浏览器执行的更新脚本,该脚本发送大量查询。 当该脚本运行时(需要3-4分钟完成),它将消耗所有MySQL资源,并且该站点几乎无法正常工作(页面生成时间为30-60秒,而不是1-2秒)。
如何限制此脚本(即延长其执行时间以限制可用资源)以允许其他服务正常运行?我相信有一个简单的解决方案,但是找不到。看来我的Google超级大国在过去两天内受到限制。
答案 0 :(得分:1)
您无权修改有问题的脚本,因此解决此问题需要数据库管理员的工作,而不是编程工作。您的任务称为调整MySQL数据库。
(我想您已经向您的供应商寻求帮助了,他们说不。)
脚本运行时,按top或htop键。 CPU是否固定为100%? RAM耗尽了吗?
1)刚好使用它,并在您的网站没有很多访问者的一天中的某个时间运行更新脚本。相当简单,但不是真正的解决方案。
2)作为实验,将RAM添加到您的VPS实例。它可以让MySQL在当前临时表中放在硬盘上的所有RAM中进行处理。如果有帮助,这可能是解决您的问题的一种方法,只需少量的工作和较高的服务器租金。
3)添加一些索引以加快脚本中的查询速度,从而使每个查询的执行速度更快。问题是,哪些索引会有所帮助? (仅随机添加索引通常无济于事。)
首先,找出哪些查询速度很慢。在脚本运行时,重复输入命令SHOW FULL PROCESSLIST。该结果中的“信息”列显示所有正在运行的查询。将它们复制到文本文件中以保留它们。 (或者您可以使用MySQL的慢速查询日志,您可以在线阅读有关该日志的信息。)
第二,分析最糟糕的查询,以查看是否有明显的索引要添加。告诉您如何执行此操作通常不在堆栈溢出答案的范围内。您可能会问另一个有关特定查询的问题。在做之前,请 reead this note about asking good SQL questions,并注意有关查询性能的部分。
3)您的脚本可能是从用户访问您的网站时也需要更新的表中选择许多行,或使用SELECT总结许多行。在这种情况下,您的访客可能正在等待这些选择完成。如果可以更改脚本,则可以将该语句放在长时间运行的SELECTS之前。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
这允许SELECT语句后面执行“脏读”操作,在该语句中,它可能会获得更新行的较早版本。 See here。
或者,如果您能弄清楚如何在模糊的脚本中插入一条语句,请在打开数据库会话后立即添加该语句。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
但是,如果无法访问源代码,则只有一种方法可以查看这是否是问题所在。也就是说,在脚本运行之前,从特权帐户访问MySQL服务器,并提供这些SQL命令。
SHOW VARIABLES LIKE 'tx_isolation';
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITED;
然后查看性能问题是否得到改善。脚本完成后将其重新设置,可能是这样(取决于上面获取的tx_isolation值)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITED;
警告,如果永久依赖隔离级别进行全局更改,则可能会干扰您的应用程序(如果它依赖事务一致性)。这只是一个实验。
4)骚扰脚本作者以解决此问题。
答案 1 :(得分:-1)
查询速度慢?高CPU?高I / O?然后,您必须查看查询。您不能“摆脱性能问题”。调整可能会给您带来百分之几的改善;修复索引和查询的可能性 可以给您带来很多改进。
请参见this,以查找“最差”查询;然后返回SELECTs
,EXPLAINs
和SHOW CREATE TABLEs
寻求帮助。