php - 限制每个进程的 mysql 使用

标签 php mysql cron limit query-performance

我有配置了标准 LAMP 的 Debian VPS。 在这台服务器上,只有一个站点(商店)有一些 cron 作业——主要是 PHP 脚本。其中之一是由 Lynx 浏览器执行的更新脚本,它会发送大量查询。 当此脚本运行时(需要 3-4 分钟才能完成),它会消耗所有 MySQL 资源,并且该站点几乎无法运行(页面在 30-60 秒内生成,而不是 1-2 秒)。

如何限制此脚本(即延长其执行时间以限制可用资源)以允许其他服务正常运行?我相信这个问题有一个简单的解决方案,但找不到。似乎我的谷歌 super 大国最近两天是有限的。

最佳答案

您无权修改有问题的脚本,因此修复此问题需要数据库管理员的工作,而不是编程工作。您的任务称为调整 MySQL 数据库。

(我猜你已经向你的供应商寻求帮助,他们拒绝了。)

在脚本运行时运行 top 或 htop。 CPU 是否固定在 100%? RAM 耗尽了吗?

1) 忍受它,在一天中您的网站访问者不多的时候运行更新脚本。相当简单,但不是真正的解决方案。

2) 作为实验,将 RAM 添加到您的 VPS 实例。它可以让 MySQL 做所有在 RAM 中的事情,它目前在临时表中放在硬盘驱动器上。如果有帮助,这可能是解决您的问题的一种方法,只需少量工作并支付更高的服务器租赁费用。

3) 添加一些索引来加速脚本中的查询,因此每个查询都可以更快地完成。问题是,哪些指标会有帮助? (只是随机添加索引通常没有多大帮助。)

首先,找出哪些查询速度慢。在脚本运行时重复输入命令 SHOW FULL PROCESSLIST。该结果中的信息列显示了所有正在运行的查询。将它们复制到文本文件中以保留它们。 (或者你可以使用MySQL的慢查询日志,你可以在线阅读。)

其次,分析最严重的违规查询,看看是否有明显的索引要添加。告诉你如何做到这一点通常超出了 Stack Overflow 答案的范围。您可能会问另一个关于特定查询的问题。在你这样做之前,请 reead this note about asking good SQL questions ,并注意查询性能部分。

3) 您的脚本可能正在从用户访问您的网站时也需要更新的表中选择多行,或使用 SELECT 汇总多行。在那种情况下,您的访问者可能正在等待这些 SELECT 完成。如果您可以更改脚本,则可以将此语句放在长时间运行的 SELECTS 之前。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

这允许它之后的 SELECT 语句进行“脏读”,在这种情况下它可能会获得更新行的早期版本。 See here .

或者,如果您能弄清楚如何将一条语句插入到您的模糊脚本中,请在它打开数据库 session 后立即插入这条语句。

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) 骚扰脚本作者以解决此问题。

关于php - 限制每个进程的 mysql 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244003/

相关文章:

javascript、php、onchange 选择框不起作用

php - Zend Framework - 需要从 View 访问 GET 参数

mysql - 允许 float 在 mySQL 中为空值

ruby-on-rails - 每当 cron 中的 gem 命令不起作用时

linux - 如何在shell脚本中使用ftp制作远程文件夹的镜像

php - Cron 不在 12.0.4 上运行,但在 12.0.5 上运行

php - openssl 加密/解密工作不一致/失败

php - Laravel - 下拉 Pluck 数据无法获取字符串值

java - 为什么这个 mysql 插入在 java JDBC 中失败

mysql - 为什么key_len大于索引长度?