文章来自:http://blog.flier.lu/2010/04/gearman-performance-tunning/
Gearman是最早由LiveJournal内部开发并使用的一个通用并行任务调度框架,允许不同语言直接通过非常简单的方式进行互操作。前台提交工作任务(Task)和参数,由后台工作进程(Worker)完成实际工作。
例如前台提交用户需要进行渲染的图片,由Gearman调度到后台提供渲染服务的工作进程,在完成工作后返回结果给前台进行展示。提交工作和完成工作的代码只需要通过预先协商好的参数格式进行交互,具体任务的调度、负载均衡、可靠性等,由Gearman服务器来确保。而针对大规模应用,可以很容易进行多路节点的集群部署。
在正式对外发布后,Danga Interactive用C重写了整个服务器代码,支持PHP, Perl, Python等常见脚本客户端,支持用memcached, sqlite, postgresql, tokyocabinet等作为任务持久化队列,基本上来说是便宜量又足。
线程模型
在大规模使用的时候,需要针对应用类型进行参数设置,以使Gearman的性能达到最优,这首先应该了解Gearman的线程模型。
为确保具备对海量任务调度的支持能力,Gearman毫无悬念的选择libevent作为网络操作支撑库。因此Gearman的服务器Gearmand提供了三类线程角色:
端口监听和管理线程,接受新连接请求并将之交给IO线程,1个
IO线程,完成实际的任务处理,包括命令解析,队列操作等,n个
处理线程,完成内部数据结构的管理,无系统调用尽可能简单,1个
其中第1, 3种线程对全局处理性能没有直接影响,虽然处理线程有可能成为瓶颈,但他的工作足够简单消耗可忽略不计,因此我们的性能调优主要目标是在IO线程的数量。
对每个IO线程来说,它都会有一个libevent的实例;所有Gearman的操作会以异步任务方式提交到处理线程,并由IO线程获取完成实际操作,因此IO线程的数量是与可并行处理任务数成正比。Gearmand 提供 -t 参数调整总IO线程数,需要使用 libevent 1.4 以上版本提供多线程支持。
进程句柄数
另外一个影响大规模部署的是进程句柄数,Gearman会为每一个注册的Worker分配一个fd(文件描述符),而这个fd的总数是受用户限制的,可以使用 ulimit -n 命令查看当前限制
flier@debian:~$ ulimit -n
1024
flier@debian:~$ ulimit -HSn 4096 // 设置进程句柄数的最大软硬限制
4096
也就是说gearman缺省配置下,最多允许同时有小于1024个worker注册上来,fd用完之后的Worker和Client会出现连接超时或无响应等异常情况。因此,发生类似情况时,我们应首先检查 /proc/[PID]/fd/ 目录下的数量,是否已经超过 ulimit -n 的限制,并根据需要进行调整。而全系统的打开文件设置,可以参考 /proc/sys/fs/file-max 文件,并通过 sysctl -w fs.file-max=[NUM] 进行修改。
flier@debian:~$ cat /proc/sys/fs/file-max
24372
flier@debian:~# sysctl -w fs.file-max=100000
100000
更详细的设置请参考 Linux increase the maximum number of open files or file descriptors。
Gearmand 本身也提供了调整句柄数量限制的功能,启动时则可以通过 –file-descriptors 参数指定,但非特权进程不能设置超过soft limit的数额。
-f, –file-descriptors=FDS Number of file descriptors to allow for the process
(total connections will be slightly less). Default
is max allowed for user.
The soft limit is the value that the kernel enforces for the corresponding resource. The hard limit acts as a
ceiling for the soft limit: an unprivileged process may only set its soft limit to a value in the range from 0
up to the hard limit, and (irreversibly) lower its hard limit. A privileged process (under Linux: one with the
CAP_SYS_RESOURCE capability) may make arbitrary changes to either limit value.
轮询调度
此外,Gearmand 还提供了一些增强任务调度公平性的参数,例如 0.13 里面新增的 round-robin 模式,允许将任务公平的调度到多个 Worker,而不是用缺省按 Worker 注册函数的顺序进行调度,避免工作过于集中在少数设备上。
-R, –round-robin Assign work in round-robin order per
workerconnection. The default is to assign work in
the order of functions added by the worker.
Gearmand 内部通过一个 Worker 队列,在 RR 模式下动态调整 Worker 的调度次序。
if (server_con->thread->server->flags.round_robin)
{
GEARMAN_LIST_DEL(server_con->worker, server_worker, con_)
_server_con_worker_list_append(server_con->worker_list, server_worker);
++server_con->worker_count;
if (server_con->worker_list == NULL) {
server_con->worker_list= server_worker;
}
}
受限唤醒
而通过 –worker-wakeup 参数,则可以指定收到任务时,需要唤醒多少个 Worker 进行处理,避免在 Worker 数量非常大时,发送大量不必要的 NOOP 报文,试图唤醒所有的 Worker。
-w, –worker-wakeup=WORKERS Number of workers to wakeup for each job received.
The default is to wakeup all available workers.
根据 Gearman 协议设计, Worker 如果发现队列中没有任务需要处理,是可以通过发送 PRE_SLEEP 命令给服务器,告知说自己将进入睡眠状态。在这个状态下,Worker 不会再去主动抓取任务,只有服务器发送 NOOP 命令唤醒后,才会恢复正常的任务抓取和处理流程。因此 Gearmand 在收到任务时,会去尝试唤醒足够的 Worker 来抓取任务;此时如果 Worker 的总数超过可能的任务数,则有可能产生惊群效应。
/* Queue NOOP for possible sleeping workers. */
if (job->function->worker_list != NULL)
{
worker= job->function->worker_list;
noop_sent= 0;
do
{
if (worker->con->options & GEARMAN_SERVER_CON_SLEEPING &&
!(worker->con->options & GEARMAN_SERVER_CON_NOOP_SENT))
{
ret= gearman_server_io_packet_add(worker->con, false,
GEARMAN_MAGIC_RESPONSE,
GEARMAN_COMMAND_NOOP, NULL);
if (ret != GEARMAN_SUCCESS)
return ret;
worker->con->options|= GEARMAN_SERVER_CON_NOOP_SENT;
noop_sent++;
}
worker= worker->function_next;
}
while (worker != job->function->worker_list &&
(job->server->worker_wakeup == 0 ||
noop_sent < job->server->worker_wakeup));
job->function->worker_list= worker;
}
除此之外,针对应用特点合理使用持久化队列,在大并发任务量的情况下对性能也会有直接影响。
归根结底,需要根据自己的应用场景,合理设计一些测试用例和自动化脚本,通过实际的运行状态进行参数调整。
相关推荐
Gearman中文手册,gearman手册chm,Gearman中文详解,分享gearman技术心得,主要是为了分享技术,所以不要大家的资源分。
### Gearman文档与集群计算...无论是在大型社交平台如LiveJournal的应用场景下,还是在各种高性能计算环境中,Gearman都展现出了其独特的价值。通过对Gearman的理解和应用,开发者可以构建出更加稳定、高效的应用系统。
通过 Gearman C# API,你可以轻松地将这些任务解耦,让它们在后端集群中并行处理,提高系统的整体性能和响应速度。 总结一下,这个"Gearman C# API和示例"项目提供了一个C#开发者与Gearman服务交互的基础框架,涵盖...
综上所述,GearMAN作为一个分布式任务框架,它的设计理念、功能特性、性能优势以及使用方法等知识点对于理解现代分布式系统架构中的任务处理优化具有重要意义。无论是在高并发场景下任务分配的高效率,还是在系统...
Gearman是一种分布式任务队列系统,它允许应用程序在不同的服务器之间分发工作负载,从而实现负载均衡和异步处理。本篇文章将详细讲解如何在Linux环境中搭建Gearman,包括依赖库的安装和Gearman服务的配置。 首先,...
在 Laravel 开发中,PHP Gearman 是一个非常重要的工具,它允许开发者实现分布式任务处理和异步任务执行,从而提高应用的性能和响应速度。Gearman 是一个跨语言的、通用的任务调度框架,它可以将任务分发到多台...
这个例子展示了 Gearman 如何帮助我们将异步任务分发到分布式环境中执行,从而提高系统的扩展性和性能。 总结来说,Gearman Java APIs 提供了强大而灵活的工具,让开发者能够在 Java 应用程序中轻松实现分布式任务...
**Laravel 开发与 Gearman RPC 整合详解** 在现代Web开发中,异步任务处理和分布式计算已经成为提升系统性能的关键技术。Laravel作为PHP的流行框架,提供了丰富的工具来支持这类需求。本篇文章将深入探讨如何在...
Gearman是一款开源的分布式任务队列系统,它允许应用程序在多台机器上分发工作负载,从而实现异步处理和负载均衡。这个系统的重点在于解耦任务的发起者和执行者,使得系统能够灵活地扩展并提高处理能力。在本讨论中...
- **监控与调试**:利用 Gearman 的管理工具和 MySQL 日志,监控任务进度和性能问题。 7. **安全与可靠性**: - **数据安全**:确保 Gearman 与 MySQL 之间的通信加密,防止数据泄露。 - **故障恢复**:通过 ...
在介绍PHP使用Gearman进行任务分发操作的过程中,有几个关键知识点需要详细阐述: ...掌握了这些知识点后,开发者可以有效地利用Gearman解决Web应用中的长耗时任务处理问题,提高应用性能和用户体验。
Gearman中文手册,gearman手册chm,Gearman中文详解,分享gearman技术心得,主要是为了分享技术,所以不要大家的资源分。
Gearman是一个分布式任务队列系统,它允许应用程序将工作分发到多个服务器或进程,以实现负载均衡和异步处理。在本实例中,我们关注的是如何在C++环境中,利用Visual Studio 2008(VS2008)在Windows平台上创建一个...
java-gearman-service-0.6.6.zip 包,gearman分为3部分,client - server - worker,创建 java 版本的client和worker部分。 其实在gearman中,client和worker的编写不复杂,但是不同厂商提供的API是不大相同的,本...
java实现gearman的job实现的jar包,包括gearman server,client和work客户端API
Gearman是一个分布式任务队列系统,它允许应用程序在任何地方运行任务,而无需关心它们在哪里运行或如何运行。Gearman-Java是Java语言对Gearman的客户端库,它提供了与Gearman服务器通信的能力,用于分发工作负载...
该资源包括安装Gearman时可能涉及到的软件包 具体包括gearmand、gearman、php、gperf、libevent
gearman的java库有两个,一个是gearman service ,一个是gearman java,相比来说service版本更好用一些,并且网上的教程一般是用的这个版本。因此我打好了gearman service的包提供给需要的开发者使用。
4. **异步处理**:Java Gearman Service 支持异步操作,允许任务的提交和接收可以在不同的线程中进行,提高了程序的并发性能。 5. **任务生命周期管理**:包括任务的提交、监控、取消和重试等功能,为开发者提供了...
安装gearman 如果没有mysql客户端,需要安装mysql客户端 yum install -y libevent-devel 上传gearman.zip,解压unzip gearman.zip rpm -ivh uuid-1.5.1-3.el5.x86_64.rpm rpm -ivh libgearman-1.1.8-2.el5.x86_64...