PS:Gearmand源码编译过程。
Gearmand源码编译
操作系统:CentOS release 6.2
#依赖文件安装 yum install -y gcc gcc-c++ libevent libevent-devel boost boost-devel gperf uuid libuuid libuuid-devel; #安装sqlite持久化存储 yum install -y sqlite* ;
#gearmand源码编译 wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz; tar -zxvf gearmand-1.1.12.tar.gz; cd gearmand-1.1.12; ./configure --prefix=/usr/local/gearmand; make && make install;
#./configure编译后的提示如下: Configuration summary for gearmand version 1.1.12 * Installation prefix: /usr/local/gearmand * System type: unknown-linux-gnu * Host CPU: x86_64 * C Compiler: cc -std=gnu99 cc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16) * C Flags: -g -O2 -Wno-unknown-pragmas -Wno-pragmas -Wall -Wextra -Wno-attributes -Waddress -Warray-bounds -Wbad-function-cast -Wchar-subscripts -Wcomment -Wfloat-equal -Wformat-security -Wformat=2 -Wformat-y2k -Wlogical-op -Wmissing-field-initializers -Wmissing-noreturn -Wmissing-prototypes -Wnested-externs -Wnormalized=id -Woverride-init -Wpointer-arith -Wpointer-sign -Wredundant-decls -Wshadow -Wsign-compare -Wstrict-overflow=1 -Wswitch-enum -Wundef -funsafe-loop-optimizations -Wclobbered -Wunused -Wunused-variable -Wunused-parameter -Wwrite-strings -fwrapv -pipe -fPIE -pie -Wpacked * C++ Compiler: c++ c++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16) * C++ Flags: -g -O2 -std=c++0x -Wno-unknown-pragmas -Wno-pragmas -Wall -Wextra -Wno-attributes -Waddress -Warray-bounds -Wchar-subscripts -Wcomment -Wctor-dtor-privacy -Wfloat-equal -Wformat=2 -Wformat-y2k -Wmissing-field-initializers -Wlogical-op -Wnon-virtual-dtor -Wnormalized=id -Woverloaded-virtual -Wpointer-arith -Wredundant-decls -Wshadow -Wsign-compare -Wstrict-overflow=1 -Wswitch-enum -Wundef -funsafe-loop-optimizations -Wclobbered -Wunused -Wunused-variable -Wunused-parameter -Wwrite-strings -Wformat-security -fwrapv -pipe -fPIE -pie -Wpacked * CPP Flags: -fvisibility=hidden * LIBS: * LDFLAGS Flags: * Assertions enabled: no * Debug enabled: no * Warnings as failure: no * Building with libsqlite3 yes #持久化存储-sqlite * Building with libdrizzle yes #持久化存储-libdrizzle * Building with libmemcached not found #持久化存储-libmemcached * Building with libpq no #持久化存储-libpq * Building with tokyocabinet no #持久化存储-tokyocabinet * Building with libmysql no #持久化存储-libmysql * SSL enabled: no * cyassl found: no * openssl found: yes * make -j: 3 * VCS checkout: no * sphinx-build: :
其中 libsqlite3、lbdrizzle、libmemcached、libpq、tokyocabinet,libmysql的支持都是对于持久化来说的,如果需要要确保系统中安装了这些数据库。持久化安装使用教程
执行命令
#/usr/local/gearmand #三个重要的命令 ├── bin │ ├── gearadmin #管理 gearman相关 │ └── gearman # 命令行客户端 client,work相关 ├── sbin │ └── gearmand # 守护进程 job server相关
gearadmin 命令
Options: --help 查看相关帮助 -h [ --host ] arg (=localhost) 要连接的 host ,默认为「localhost」 -p [ --port ] arg (=4730) 要连接到的端口号,默认为 4730 --server-version 获得 gearman 服务器的版本号 --server-verbose 获得服务器的详细设置 --create-function arg 从服务器创建一个函数 --cancel-job arg 从服务器中取消置顶的任务 --drop-function arg 从服务器中删除一个函数 --show-unique-jobs 列出服务器上不重复的任务 --show-jobs 列出服务器上所有的任务 --getpid 获取服务器的进程 ID --status 服务器的状态 --workers 服务器的 workers --shutdown 关闭服务器 -S [ --ssl ] 启用 SSL 链接的支持
client,work 命令
#./gearman --help #客户端模式: gearman [options] [] #工作端模式: gearman -w [options] [[ ...]] client and worker 通用选项: -f "function" - 处理任务的函数名 -h "host" - Job Server主机,默认是localhost -H - 帮助菜单 -v - 打印诊断信息到标准输出,默认为 `false` -p "port" - Job Server端口,默认是4730 -t "timeout"- 执行多长时间超时,毫秒 -i "pidfile"- 创建进程的pid文件 -S - 启用 SSL 连接 Client options: -b -后台运行任务 -I -高优先级运行任务 -L -低优先级运行任务 -n -逐行执行任务 -N -等同 `-n`,但去掉换行符 -P -使用指定函数名前置处理所有输出行 -s -执行任务不返回结果 -u "unique" -任务的唯一标识 Worker options: -c "count" -worker进程处理多少个任务后中止) -n -为每一行发送数据包 -N -Same as -n, but strip off the newline -w -以worker模式运行
job server命令
# ./gearmand --help General options: -b [ --backlog ] arg (=32) 储备的监听连接数量 -d [ --daemon ] 守护进程模式。立即结束命令行,在后台运行 gearman --exceptions 默认启用协议层的异常 -f [ --file-descriptors ] arg 进程最大可用的文件描述符数(总连接数会比这个数字略少,默认使用的是当前用户最大可用数。 -h [ --help ] 帮助 -j [ --job-retries ] arg (=0) 在任务服务器移除任务之前尝试执行的最大次数。设置这个值这可以确保那些糟糕的任务不会 crash 掉所有的工作线程。默认值是 0 (即不限制次数) --job-handle-prefix arg 每个job handle的前缀. 默认"H:'host_na me'",这个可通过GearmanJob::handle程序查询 --hashtable-buckets arg (=991) 内部用于存放任务的哈希表(hash tables)的容量 默认使用的是991,可以支持包含300万个任务的队列.如果预计队列中的任务数将超过300万,请按比例设 置一个更大的数字.例如为了容纳2^32个任务,本参数可设置为1733003.这会消耗大约26MB的额外内存.到目前为止,`Gearmand`暂不支持超过2^32个任务的队列。 --keepalive 启用链接保持 --keepalive-idle arg (=-1) 如果启用了链接保持(--keepalive),请在支持 TCP_KEEPIDLE 的系统上设置这个参数。如果设置为 -1,则表示当系统不支持或者获取默认值事发生错误 使用该值 --keepalive-interval arg (=-1) 如果启用了链接保持(--keepalive),请在支持 TCP_KEEPINTVL 的系统上设置这个参数。如果设置为-1,则表示当系统不支持或者获取默认值事发生错误使用该值。 --keepalive-count arg (=-1) 如果启用了链接保持(--keepalive),请在支持 TCP_KEEPCNT 的系统上设置这个参数。如果设置为-1,则表示当系统不支持或者获取默认值事发生错误使用该值。 -l [ --log-file ] arg (=/usr/local/gearmand/var/log/gearmand.log) 日志文件存放位置(none:不写日志) -L [ --listen ] arg 监听的IP,默认全部接受 -P [ --pid-file ] arg (=/usr/local/gearmand/var/gearmand.pid) -r [ --protocol ] arg 加载协议模块 -R [ --round-robin ] 按照worker连接job server的顺序来分配任务。默认值是按照worker添加function的顺序来分配任务。 -q [ --queue-type ] arg (=builtin) 指定持久化队列 --config-file arg (=/usr/local/gearmand/etc/gearmand.conf) 也可以使用 `@name` 来指定。 --syslog Use syslog. --coredump 是否为未捕捉的信号创建一个核心转储 -t [ --threads ] arg (=4) 使用的I/o线程数量。0表示使用最大线程,默认为4 -u [ --user ] arg 启动后切换到指定用户 --verbose arg (=ERROR) 设置日志记录级别 (FATAL, ALERT, CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG) -V [ --version ] 版本号 -w [ --worker-wakeup ] arg (=0) 当接收到任务时唤醒多少个工作线程。默认会唤醒所有可用的工作线程 HTTP: --http-port arg (=8080) 监听http端口号 Gear: -p [ --port ] arg (=4730) 服务启动自己的端口号,默认4730 --ssl 启用ssl连接. --ssl-ca-file arg 用于ssl连接的ca文件 --ssl-certificate arg SSL 证书. --ssl-key arg SSL 密钥
关于“-t”参数解释
gearmand中使用到了多线程模型,其线程分为三种:
1.Listening and management thread 监听和管理线程 - 只有一个:主要负责接受连接请求,并分配给I/O线程
2.I/O Thread I/O 线程 - 可以有很多个:主要负责读写系统调用,解析数据包
3.Processing Thread 处理线程 - 只有一个:负责管理列表和Hash表,管理唯一Key、任务的Handle、函数、任务队列
-t [ --threads ] arg (=4) 使用的I/o线程数量。0表示使用最大线程,默认为4
-t 可以指定I/O线程的数量。如果 没有指定 t 或者 t = 0,则三个线程合为一个,所有的事情都在一个线程中处理。如果 -t 1 则有一个监听和管理线程、一个I/O和处理线程;如果 -t 2 则每个类别一个线程,如果大于2,则创建更多的I/O线程。
官方提到,a 16 core Intel machine is able to process upwards of 50k jobs per second。
job server 启动命令
#启动脚本 /usr/local/gearmand/sbin/gearmand \ --daemon \ #后台运行 --listen=127.0.0.1 #IP白名单 #命令汇总 /usr/local/gearmand/sbin/gearmand --daemon --listen=127.0.0.1 --port=8888