gearman管理
通常,Gearman被用来分发任务,以便实现异步操作。下面捋捋如何管理Gearman。
说明:请自行安装好Gearman和PHP PECL Gearman。
(我之前安装的gearman php的c语言扩展,gearman-monitor和gearman-manager都需要
Net_Gearman(也就是
A pure PHP API that can be found as Net_Gearman on PEAR.
)
准备
我们先来创建一个Worker,实现一个简单的显示功能:
<?php
$worker= new GearmanWorker();
$worker->addServer('127.0.0.1', '4730');
$worker->addFunction('echo', 'my_echo_function');
while ($worker->work());
function my_echo_function($job) {
return $job->workload();
}
?>
然后我们运行它:
shell> php /path/to/worker/file
可能你已经注意到,代码里有一个死循环,是不是需要Sleep一下?让我们监测看看:
shell> strace -r php /path/to/worker/file
0.000099 poll([{fd=3, events=POLLIN}], 1, 10000) = 0 (Timeout)
10.006522 write(3, "\0REQ\0\0\0\t\0\0\0\0", 12) = 12
可见PHP PECL Gearman内部已经做了休息十秒的设置,我们就不用杞人忧天了。
接下来我们以Shell为Client来调用一下:
shell> gearman -f echo "hello, world."
到这里,准备工作基本就齐活儿了,相信大家已经对Gearman有了一个初步的认识。
管理
出于效率的考虑,我们往往会启动很多个Worker,但具体应该启动多少个呢?十个还是一百个?少了不够,多了浪费,到底应该如何度量呢?
其实Gearman本身已经提供了相应的命令供我们查看状态:
shell> (echo status; sleep 0.1) | nc 127.0.0.1 4730
命令的结果会分为四列,它们的含义从左到右依次是:
- Function name: A string denoting the name of the function of the job
- Number in queue: A positive integer indicating the total number of jobs for this function in the queue. This includes currently running ones as well (next column)
- Number of jobs running: A positive integer showing how many jobs of this function are currently running
- Number of capable workers: A positive integer denoting the maximum possible count of workers that could be doing this job. Though they may not all be working on it due to other tasks holding them busy.
从这些信息可以推断出:如果系统比较繁忙的话,Number of jobs running的数值会接近Number of capable workers;Number in queue可能会大于Number of capable workers。此时我们应该增加Worker的数量,反之则应该考虑减少Worker的数量。
另外,推荐大家结合使用watch命令来监控Gearman的状态,这样更直观一些:
shell> watch -n 1 "(echo status; sleep 0.1) | nc 127.0.0.1 4730"
实际应用中,还有很多特殊情况需要考虑,比如说:程序代码更新后,如何避免手动重启Worker?还需要注意的是Worker长时间运行,一旦意外中断或者内存泄漏怎么办?通常这类进程控制问题用Supervisor都可以轻松搞定,有兴趣的读者自己看看吧。此外网络上还有一些不错的工具可以玩玩,比如:GearmanManager,Gearman-Monitor。
需要小心的一件事情是数据的共享。Gearman 不进行所交换数据的任何转换或操作。对于这里使用的简单字符串和整数没有问题,但是不能共享 PHP 中的数组值并期望能在 Java 语言中被理解。对于这种类型的交互,可以使用很多结构化数据标准中的一种,比如 JavaScript Object Notation (JSON) 或 XML。另外,如果您在处理来自数据库的信息,只要共享 ID 或者找到需要处理的数据时要用到的信息即可,或者使用 memcached 这样的透明方法(尽管可能仍然需要 JSON 或等价物)。
转自:http://huoding.com/2012/10/30/196
http://blog.chinaunix.net/uid-20357359-id-1963682.html
GearmanMonitor 和 GearmanManager
GearmanMonitor 是用来查看 Gearman 服务状态的工具,包括 运行中/过的队列 Queue,运行中的所有 workers,及服务器 servers。GearmanMonitor 需要有 Net_Gearman 支持。安装 pear 后,直接执行:
我们首先安装NET_geraman(也就是php写的gearman库)。
https://github.com/brianlmoon/net_gearman
Installation 1. Install PEAR if it is not already installed on your system.
2. Use git to pull this repo to your servers. Be sure where you install it is in the autoload or include path before the rest of PEAR. Linux上安装php的pear
在搭建centreon的过程中,需要pear模块支持。
什么是pear
pear是PHP扩展与应用库(the PHP Extension and Application Repository)的缩写。它是一个PHP扩展及应用的一个代码仓库,简单地说,pear就是PHP的cpan。
在官网上有说明详细的安装信息,这里作简单说明。
http://pear.php.net/manual/en/about-pear.php
我的PHP目录为/usr/local/php5
在Linux下安装PHP的PEAR:
1)下载
#curl -o go-pear.php http://pear.php.net/go-pear
如果提示:
PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) ‘json.so’ in Unknown on line 0
Sorry! Your PHP version is too new (5.2.9) for this go-pear.
Instead use http://pear.php.net/go-pear.phar for a more stable and current
version of go-pear, more suited to your PHP version.
那么要从http://pear.php.net/go-pear.phar获取。
#curl -o go-pear.php http://pear.php.net/go-pear.phar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3594k 100 3594k 0 0 186k 0 0:00:19 0:00:19 –:–:– 196k
会在当前目录下载go-pear.php 页面。
2)运行go-pear.php
# /usr/local/php5/bin/php go-pear.php
3)这里按回车继续安装,CTRL+C放弃安装。
Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type ‘all’ to change all of them or simply press Enter to
accept these locations.
1. Installation base ($prefix) : /usr/local/php5
2. Temporary directory for processing : /tmp/pear/install
3. Temporary directory for downloads : /tmp/pear/install
4. Binaries directory : /usr/local/php5/bin
5. PHP code directory ($php_dir) : /usr/local/php5/lib/php
6. Documentation directory : /usr/local/php5/docs
7. Data directory : /usr/local/php5/data
8. User-modifiable configuration files directory : /usr/local/php5/cfg
9. Public Web Files directory : /usr/local/php5/www
10. Tests directory : /usr/local/php5/tests
11. Name of configuration file : /usr/local/php5/etc/pear.conf
1-11, ‘all’ or Enter to continue:
Beginning install…
Configuration written to /usr/local/php5/etc/pear.conf…
Initialized registry…
Preparing to install…
installing phar://go-pear.phar/PEAR/go-pear-tarballs/Archive_Tar-1.3.7.tar…
installing phar://go-pear.phar/PEAR/go-pear-tarballs/Console_Getopt-1.3.0.tar…
installing phar://go-pear.phar/PEAR/go-pear-tarballs/PEAR-1.9.4.tar…
installing phar://go-pear.phar/PEAR/go-pear-tarballs/Structures_Graph-1.0.4.tar…
installing phar://go-pear.phar/PEAR/go-pear-tarballs/XML_Util-1.2.1.tar…
install ok: channel://pear.php.net/Archive_Tar-1.3.7
install ok: channel://pear.php.net/Console_Getopt-1.3.0
install ok: channel://pear.php.net/Structures_Graph-1.0.4
install ok: channel://pear.php.net/XML_Util-1.2.1
install ok: channel://pear.php.net/PEAR-1.9.4
PEAR: Optional feature webinstaller available (PEAR’s web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR’s PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR’s PHP-GTK2-based installer)
PEAR: To install optional features use “pear install pear/PEAR#featurename”
** WARNING! Old version found at /usr/local/php5/bin, please remove it or be sure to use the new /usr/local/php5/bin/pear command
The ‘pear’ command is now at your service at /usr/local/php5/bin/pear
** The ‘pear’ command is not currently in your PATH, so you need to
** use ‘/usr/local/php5/bin/pear’ until you have added
** ‘/usr/local/php5/bin’ to your PATH environment variable.
Run it without parameters to see the available actions, try ‘pear list’
to see what packages are installed, or ‘pear help’ for help.
For more information about PEAR, see:
http://pear.php.net/faq.php
http://pear.php.net/manual/
安装完毕
安装 pear 后,直接执行:
1
2
3
4
5
|
[root@www bin] # pear install Net_Gearman # 如果提示 # No releases available for package "pear.php.net/Net_Gearman" # 则执行 [root@www bin] # pear install channel://pear.php.net/Net_Gearman-0.2.3 |
Net_gearman安装完后就可以用gearmanMonitor了
下载后放到web目录下就可以访问了。
修改GearmanMonitor目录下的_config.php配置文件
<?php
/**
* Gearman Monitor configuration file
*
* The following server fields are available:
* - address: Gearman server address, hostname and port
* - name: Gearman server name to display in Gearman Monitor interface
*
* Example:
* $cfgServers[$i]['address'] = '192.168.0.10:4730';
* $cfgServers[$i]['name'] = 'Gearman server 1';
* ++ $i;
*
* $cfgServers[$i]['address'] = '192.168.1.1:7003';
* $cfgServers[$i]['name'] = 'Gearman server 2';
* ++ $i;
*/
$i = ;
$cfgServers = array();
$cfgServers[$i]['address'] = '';
$cfgServers[$i]['name'] = '';
++ $i;
address改成127.0.0.1:4730
GearmanManager
GearmanManager 用来统一管理用 PHP 编写的 Gearman workers。需要 PHP 启用 pcntl。用 install/install.sh 安装完成后,根据需要和设置,修改 /etc/init.d/gearman-manager
:
##PATH## DAEMON= /usr/local/bin/gearman-manager PIDDIR= /tmp PIDFILE=${PIDDIR} /manager .pid LOGFILE= /tmp/gearman-manager .log CONFIGDIR= /data/gearman-manager GEARMANUSER= "gearmand" PARAMS= "-c ${CONFIGDIR}/config.ini" |
GearmanManager 安装时,选择的是 PECL library,启动时可能会遇见如下的问题:
1
2
3
4
5
|
[root@www gearman-manager] # /etc/init.d/gearman-manager start Starting gearman-manager: [ OK ] [root@www gearman-manager] # php: libgearman/universal.cc:553: bool gearman_request_option(gearman_universal_st&, gearman_string_t&): Assertion `con->recv_state == GEARMAN_CON_RECV_UNIVERSAL_NONE' failed. php: libgearman /universal .cc:553: bool gearman_request_option(gearman_universal_st&, gearman_string_t&): Assertion `con->recv_state == GEARMAN_CON_RECV_UNIVERSAL_NONE' failed. ..... |
解决办法如 Bug #60764 Enabling Non-Blocking Mode causes asseration 这里所提, 修改 pecl-manager.php :
1
2
|
// 注释下面这句 // $thisWorker->addOptions(GEARMAN_WORKER_NON_BLOCKING); |
gearman管理的更多相关文章
- gearman管理工具GearmanManager的安装与使用
一.gearman自带了一个gearadmin工具 查看帮助信息 > gearadmin --help 查看状态 > gearadmin --status 查看worker信息 > ...
- 用于PHP的Gearman Worker管理工具GearmanManager
项目地址:https://github.com/brianlmoon/GearmanManager PHP环境要求 PHP 5.5.9 POSIX extension Process Control ...
- 转。管理Gearman
通常,Gearman被用来分发任务,以便实现异步操作.下面捋捋如何管理Gearman. 说明:请自行安装好Gearman和PHP PECL Gearman. 准备 我们先来创建一个Worker,实现一 ...
- gearman安装及初次使用
官网: http://gearman.org/ 一篇文章: 利用Gearman实现异步任务处理 一.问题分析 问题:在性能测试过程中,发现用户管理平台在进行图片上传时,性能不佳. 分析:经过代码分析 ...
- 分布式任务系统gearman的python实战
Gearman是一个用来把工作委派给其他机器.分布式的调用更适合做某项工作的机器.并发的做某项工作在多个调用间做负载均衡.或用来在调用其它语言的函数的系统.Gearman是一个分发任务的程序框架,可以 ...
- 分布式计算框架Gearman原理详解
什么是Gearman? Gearman提供了一个通用的应用程序框架,用于将工作转移到更适合于工作的其他机器或流程.它允许你并行工作,负载平衡处理,并在语言间调用函数.它可用于从高可用性网站到传输数据库 ...
- gearman(异步计算)学习
Gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调 用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/C++版本.目前大部分源码都是(Gearmand服务 ...
- golang 版本 gearman 试用
g2 是golang 版的gearman 实现,包含了server (支持leveldb,以及metrics).client 代码.worker 代码 使用上还是很方便的,同时部署也比较简单,结合do ...
- 使用gearman进行异步的邮件或短信发送
一.准备工作 1.为了防止,处理业务途中出现的宕机,请配置好gearman的持久化方式.2.使用gearmanManager来管理我们的worker脚本,方便测试. 上述两条请看我之前写的两篇文章 二 ...
随机推荐
- C语言基础(20)-文件操作(fopen,getc,fclose)
一.文件操作 读文件的顺序: 1.先打开文件 2.读写文件 3.关闭文件 1.1 fopen FILE *fopen( const char *path, const char *mode ); 函数 ...
- java获取真实的ip地址
直接上代码,获取请求主机的IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 public class IPUtil { private static final Logger logger = ...
- Spark Core源代码分析: RDD基础
RDD RDD初始參数:上下文和一组依赖 abstract class RDD[T: ClassTag]( @transient private var sc: SparkContext, @tran ...
- windows下安装JDK和Tomcat
一.安装JDK 1.安装 JDK当前最高版本为1.7. 下载并运行JDK 1.7安装程序jdk-7u25-windows-i586.exe,直接安装到C盘(也可以在其它盘,但文件名一定要是英文名),其 ...
- Spring MVC表单提交中文数据出现乱码
http://jiessiedyh.iteye.com/blog/475541 http://bigcat.easymorse.com/?p=474 Spring MVC 教程,快速入门,深入分析 h ...
- form表单提交方式
form表单提交方式总结一下: 一.利用submit按钮实现提交,当点击submit按钮时,触发onclick事件,由JavaScript里函数判断输入内容是否为空,如果为空,返回false, 不提交 ...
- Java类载入器原理分析
一:Java虚拟机中能够安装多个类载入器,系统默认是三个基本的类载入器: Bootstrap ExtClassLoader AppClassLoader 类载入器也是Java类.由于其它Java类 ...
- SlidingMenu官方实例分析4——AttachExample
AttachExample这个类没有继承BaseActivity,而是FragmentActivity,写到这好像感悟到了 为什么官方现在都推荐使用Fragment而不是Activity,因为Frag ...
- 各种流程图的绘画网路工具 processon
https://www.processon.com 对应的网址,类似在线viso 很方便使用,工具齐全,推荐使用!
- 使用json遇到的问题
JSON JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立 ...