Gearman是最早由LiveJournal内部开发并使用的一个通用并行任务调度框架,允许不同语言直接通过非常简单的方式进行互操作。前台提交工作任务(Task)和参数,由后台工作进程(Worker)完成实际工作。

例如前台提交用户需要进行渲染的图片,由Gearman调度到后台提供渲染服务的工作进程,在完成工作后返回结果给前台进行展示。提交工作和完成工作的代码只需要通过预先协商好的参数格式进行交互,具体任务的调度、负载均衡、可靠性等,由Gearman服务器来确保。而针对大规模应用,可以很容易进行多路节点的集群部署。

在正式对外发布后,Danga Interactive用C重写了整个服务器代码,支持PHP, Perl, Python等常见脚本客户端,支持用memcached, sqlite, postgresql, tokyocabinet等作为任务持久化队列,基本上来说是便宜量又足。

线程模型

在大规模使用的时候,需要针对应用类型进行参数设置,以使Gearman的性能达到最优,这首先应该了解Gearman的线程模型。

为确保具备对海量任务调度的支持能力,Gearman毫无悬念的选择libevent作为网络操作支撑库。因此Gearman的服务器Gearmand提供了三类线程角色:

  1. 端口监听和管理线程,接受新连接请求并将之交给IO线程,1个
  1. IO线程,完成实际的任务处理,包括命令解析,队列操作等,n个
  1. 处理线程,完成内部数据结构的管理,无系统调用尽可能简单,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 性能调优相关推荐

  1. hive性能调优实战pdf_Nginx 性能调优实战

    来自:Linux社区 1.Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2.如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpui ...

  2. jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、hprof使用详解

    来自:ITeye博客, 作者:Josh_Persistence 链接:https://www.iteye.com/blog/josh-persistence-2161848 现实企业级Java应用开发 ...

  3. ELASTIC SEARCH 性能调优

    ELASTICSEARCH 性能调优建议 创建索引调优 1.在创建索引的使用使用批量的方式导入到ES. 2.使用多线程的方式导入数据库. 3.增加默认刷新时间. 默认的刷新时间是1秒钟,这样会产生太多 ...

  4. OCM_第十二天课程:Section6 —》数据库性能调优_ 资源管理器/执行计划

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  5. Tomcat 和 JVM 的性能调优总结

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://rrd.me/enKbC Tomcat性能调优 ...

  6. JVM解读-性能调优实例

    2019独角兽企业重金招聘Python工程师标准>>> JVM性能调优 1 堆设置调优 年轻代大小选择 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选 ...

  7. Java性能调优、LinkedIn容器部署、阿里移动性能调优——首届APMCon精彩演讲先睹为快...

    APMCon2016,在盛夏的8月等你. \\ 作为第一届APM垂直领域的技术大会,我们能拿出什么呈现给参会者? \\ 答案是,除了会场可以纳凉避暑之外,还有来自国内外顶级技术大拿带来的Java性能管 ...

  8. elasticsearch原理_ElasticSearch读写底层原理及性能调优

    ES写入/查询底层原理 1. Elasticsearch写入数据流程 客户端随机选择一个ES集群中的节点,发送POST/PUT请求,被选择的节点为协调节点(coordinating node) 协调节 ...

  9. “性能调优”坑惨了几十万程序员

    很多程序员觉得性能调优这块的JVM.Mysql不是什么大事,自己平时写代码写得好好的,不是很了解JVM好像也没什么的,认为得千万级甚至亿万级的大流量.大项目才用得上,其他一般场景根本用不到,直到遇见这 ...

最新文章

  1. 重温Thinking in java
  2. 郑晔:代码之丑 无状态方法
  3. 集合php,PHP问题集合
  4. 【深度学习笔记】分类指标accuracy,recall,precision等的区别
  5. python入门新手项目-Python入门实战项目有哪些适合新手?
  6. jQuery学习笔记(简介,选择器)
  7. 《C++ Primer》7.5.2节练习
  8. 创梦天地通过聆讯:上半年经营利润1.3亿 腾讯持股超20%
  9. 在后台增加一个查询条件
  10. MTK功能机2503 GPIO配置
  11. Ubuntu中安装ns3
  12. STM32驱动SPI LCD屏幕
  13. python普通人能学吗_普通人可以学Python吗
  14. axure 倒计时_Axure 8.0实例 |自定义倒计时制作流程
  15. [论文阅读]PIXER: an automated particle-selection method based on segmentation using deep neural network
  16. 齐纳二极管 稳压二极管 SOD123封装 正负区分
  17. 百度地图开发-在百度地图上面显示出运动的轨迹
  18. 美团饿了么外卖返利小程序公众号搭建外卖返利分销系统代cps源码
  19. SDN和Openflow flowvisor NOX
  20. 概率分析方法与推断统计(来自我写的python书)

热门文章

  1. 冰火魔界服务器维修,冰火魔界手游在电脑上怎么玩 冰火魔界电脑版安装方法...
  2. 搜索引擎常用技巧——英文资料篇
  3. 即将取代Maven和Gradle的新一代更强更快的构建工具(至尊典藏版)
  4. AISummit全球人工智能技术大会顺利开幕:首日精彩回顾
  5. 织梦模板修改方法(转)
  6. 苹果三代耳机_苹果三代蓝牙无线耳机
  7. Innosetup打包脚本常用设置大全
  8. ArcGIS API for JavaScript之基础篇(二)
  9. 接连霸榜,这门国产编程语言是真的强!
  10. 九年义务教育的精英,遇上十年寒窗苦读的翘楚,必将擦出耀眼的火花!