PHP Gearman 太多 mysql 连接
PHP Gearman too much mysql connections
我在自定义 Joomla 应用程序中使用 Gearman,并使用 Gearman UI 跟踪活跃员工和工作数量。
我遇到了 MYSQL 负载和连接数的问题,我无法跟踪问题,但我有几个问题可能对我有帮助。
1- Gearman Workers 是为每个作业启动一个新的数据库连接,还是共享同一个连接?
2- 如果 Gearman 在每次作业运行时启动一个新连接,我该如何更改它以使所有作业共享相同的连接?
3- 如何平衡多台服务器之间的负载?
4- MYSQL 托管是否有类似 "Pay-as-you-go" 的软件包?如果是,请提及它们。
非常感谢!
我认为最重要的是 MySQL 负载。可能是您有一些非常繁重的查询导致了这种混乱。你检查过MySQL慢查询日志了吗?如果是,你发现了什么?请注意,任何执行时间超过一秒的查询都是慢速查询。
在与工作人员一起使用任何类型的作业队列时,这通常是一个被忽视的问题。 100 个工作人员将分别打开一个单独的数据库连接(它们是单独的 PHP 进程)。如果 MySQL 配置为允许 50 个连接,worker 将开始失败。回答您的问题:
1) 每个工人 运行s 在一个 PHP 进程中,每个进程将打开 1 个数据库连接。工作人员不共享数据库连接。
2) 如果只有一个worker在处理作业,那么只会打开一个数据库连接。如果您有 50 个工作人员 运行ning,则预计有 50 个数据库连接。由于这些不是 Web 请求,持久连接将不起作用,共享将不起作用。
3) 您可以通过添加 READ 从站来平衡负载,并使用 MySQL 代理来分配负载。
4) 我从未见过按需付费的 MySQL 托管解决方案。请您的提供商增加您的连接数。如果他们不愿意,可能是时候 运行 你自己的服务器了。
此外,gearman 服务器进程本身将只使用一个数据库连接来维护队列(如果您启用了 mysql 存储)。
您可以用来尝试使您的工作程序代码与数据库良好配合的策略:
在每个作业之后,终止 worker 并重新启动它。在收到新作业之前不要打开新的数据库连接。使用 supervisor 让您的员工一直 运行ning。
每次查询后关闭数据库连接。如果您看到许多连接处于 'sleep' 状态,这将有助于清理它们并保持数据库连接较低。每次查询后尝试 $pdo = null;
(如果您使用 PDO)。
在结果不变的情况下缓存经常使用的查询,以保持低数据库连接。
确保您的表已正确编入索引,以便尽快查询 运行。
确保在 try/catch 块中捕获数据库异常。添加重试逻辑(while 循环),工作人员将在 10 次尝试后优雅地失败。确保作业在失败后放回队列中。
我在自定义 Joomla 应用程序中使用 Gearman,并使用 Gearman UI 跟踪活跃员工和工作数量。
我遇到了 MYSQL 负载和连接数的问题,我无法跟踪问题,但我有几个问题可能对我有帮助。
1- Gearman Workers 是为每个作业启动一个新的数据库连接,还是共享同一个连接?
2- 如果 Gearman 在每次作业运行时启动一个新连接,我该如何更改它以使所有作业共享相同的连接?
3- 如何平衡多台服务器之间的负载?
4- MYSQL 托管是否有类似 "Pay-as-you-go" 的软件包?如果是,请提及它们。
非常感谢!
我认为最重要的是 MySQL 负载。可能是您有一些非常繁重的查询导致了这种混乱。你检查过MySQL慢查询日志了吗?如果是,你发现了什么?请注意,任何执行时间超过一秒的查询都是慢速查询。
在与工作人员一起使用任何类型的作业队列时,这通常是一个被忽视的问题。 100 个工作人员将分别打开一个单独的数据库连接(它们是单独的 PHP 进程)。如果 MySQL 配置为允许 50 个连接,worker 将开始失败。回答您的问题:
1) 每个工人 运行s 在一个 PHP 进程中,每个进程将打开 1 个数据库连接。工作人员不共享数据库连接。
2) 如果只有一个worker在处理作业,那么只会打开一个数据库连接。如果您有 50 个工作人员 运行ning,则预计有 50 个数据库连接。由于这些不是 Web 请求,持久连接将不起作用,共享将不起作用。
3) 您可以通过添加 READ 从站来平衡负载,并使用 MySQL 代理来分配负载。
4) 我从未见过按需付费的 MySQL 托管解决方案。请您的提供商增加您的连接数。如果他们不愿意,可能是时候 运行 你自己的服务器了。
此外,gearman 服务器进程本身将只使用一个数据库连接来维护队列(如果您启用了 mysql 存储)。
您可以用来尝试使您的工作程序代码与数据库良好配合的策略:
在每个作业之后,终止 worker 并重新启动它。在收到新作业之前不要打开新的数据库连接。使用 supervisor 让您的员工一直 运行ning。
每次查询后关闭数据库连接。如果您看到许多连接处于 'sleep' 状态,这将有助于清理它们并保持数据库连接较低。每次查询后尝试
$pdo = null;
(如果您使用 PDO)。在结果不变的情况下缓存经常使用的查询,以保持低数据库连接。
确保您的表已正确编入索引,以便尽快查询 运行。
确保在 try/catch 块中捕获数据库异常。添加重试逻辑(while 循环),工作人员将在 10 次尝试后优雅地失败。确保作业在失败后放回队列中。