【发布时间】:2010-07-31 15:38:41
【问题描述】:
我有许多齿轮工客户发送一份工作,比如 job1。
$client = new GearmanClient();
$client->addServer();
$client->doBackground('job1', 'workload');
处理此作业需要 10 秒。 我想跟踪在任何给定时间有多少“job1”工作正在等待工人处理。我该怎么做?
【问题讨论】:
我有许多齿轮工客户发送一份工作,比如 job1。
$client = new GearmanClient();
$client->addServer();
$client->doBackground('job1', 'workload');
处理此作业需要 10 秒。 我想跟踪在任何给定时间有多少“job1”工作正在等待工人处理。我该怎么做?
【问题讨论】:
为了快速检查,我使用这个 bash one-liner:
(echo status ; sleep 0.1) | netcat 127.0.0.1 4730
这会打开到在 localhost 上运行的 gearman 实例的连接,并发送 status 查询。这包含该实例上作业的名称和数量。然后可以使用grep/awk/wc 等处理信息以进行报告和警报。
我也对显示所有已连接工作人员的 workers 查询执行相同操作。
(echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
睡眠是为了保持连接打开足够长的时间来回复。
管理命令的完整列表以及输出的含义位于http://gearman.org/protocol/。只需搜索“管理协议”即可。
【讨论】:
要扩展 d5ve 的答案,请添加 -w 参数以“超时”您的 netcat 连接,否则您将永远无法返回命令提示符。
$ (echo status ; sleep 0.1) | sudo netcat 127.0.0.1 4730 -w 1
【讨论】:
telnet localhost 4730
status
worker_name total_queue currently_running number_of_workers
job1 1 1 9
【讨论】:
我使用gearman_top,它是mod-gearman 的一部分。
来自网站的示例输出:
+-----------------------+--------+-------+-------+---------+
| Name | Worker | Avail | Queue | Running |
+-----------------------+--------+-------+-------+---------+
| check_results | 1 | 1 | 0 | 0 |
| host | 3 | 3 | 0 | 0 |
| service | 3 | 3 | 0 | 0 |
| eventhandler | 3 | 3 | 0 | 0 |
| servicegroup_jmx4perl | 3 | 3 | 0 | 0 |
| hostgroup_japan | 3 | 3 | 0 | 0 |
+-----------------------+--------+-------+-------+---------+
【讨论】:
似乎没有任何直接的方法可以获取此信息。
这里有几个选项。首先,if you can grab job handles as you create them(搜索“说到检查状态”),您可以将它们存储在某个中心位置并从任何客户端查询它们。
其次,您可以将 Gearman 服务器设置为使用 persistent queues,然后自己对队列运行查询。这可能是两个选项中更简单、更简洁的选项。
【讨论】:
Gearmand 有一个可以查询的 telnet 接口。 (协议的具体细节可以在 gearman 网站上找到 - http://gearman.org/?id=protocol)
我在这里使用这段代码作为自己滚动的起点。 https://github.com/liorbk/php/blob/master/GearmanTelnet.php (这段代码本身就非常好,你应该可以直接使用它)
这是一个不太漂亮的解决方案,但除非有人改进了 gearman 管理界面,以便您可以直接通过 PHP 对话或为其编写插件,否则您只能靠自己
【讨论】:
在 Ubuntu 18.04 上,我使用 gearman 软件包默认安装了 gearadmin 二进制文件。
gearadmin --helpgearadmin --status 可以用来代替 netcat 替代方案:
gearadmin --status
queue1 334 10 10
还有一个班轮:while :; do gearadmin --status; sleep 1; done
【讨论】: