gearman使用心得

gearman基础

工作原理

在这里插入图片描述

部署架构

本质上,gearman可以认为是一个分布式任务队列,client是生产者,worker则是消费者。gearman并不主动分发任务,而是由worker到它那里去取任务执行,所以它采用的是类似kafka的pull消费模式。

启动、停止服务

service gearmand start

service gearmand restart

service gearmand stop

修改gearmand启动参数

配置文件路径在:

/etc/init.d/gearmand

管理命令

(echo status; sleep 0.1) | nc 127.0.0.1 4730

结果形如:

simu    0       0       2
msg     0       0       0
test    0       0       6

每列说明如下:

函数名: job的函数名
Number in queue:队列里该函数下的job总数,包含当前正在运行的job
Number of jobs running: 该函数当前正在运行的job数
Number of capable workers: 可以做该job的worker总数

如果系统比较繁忙的话,Number of jobs running的数值会接近Number of capable workers;Number in queue可能会大于Number of capable workers。此时我们应该增加Worker的数量,反之则应该考虑减少Worker的数量。

gearman优势

  1. 跨语言的调用,worker可以用多种语言来写。
  2. 跨平台,client可以在linux上,而worker甚至可以在windows上。

进阶

持久化

对于任务队列持久化的问题,是一个值得考虑的问题。持久化必然影响高性能。gearman支持后台工作任务的持久化,支持drizzle、mysql、memcached的持久化。对于client提交的background job,Job server除了将其放在内存队列中进行派发之外,还会将其持久化到外部的持久化队列中。一旦Job server发生问题重启,外部持久化队列中的background job将会被恢复到内存中,参与Job server新的派发当中。这保证了已提交未执行的background job不会由于Job server发生异常而丢失。并且我测试发现如果开启了持久化,那么background工作任务会先将工作任务写到持久化介质,然后再入内存队列,再执行。非background工作任务,由于client与job server是保持长连接的状态,如果工作任务执行异常,client可以灵活处理,所以无须持久化。

background任务的状态获取

一个background任务的查询结果形如:

<GearmanJobRequest task='simu', unique='bfa0751a74bb0b38b01e07bc90557757', priority=None, background=True, state='CREATED', timed_out=False>
Job bfa0751a74bb0b38b01e07bc90557757 finished!  Result: CREATED - None,  Data:deque([]), Status:{'numerator': 0, 'time_received': 1587369989.1067996, 'running': True, 'known': True, 'denominator': 0, 'handle': 'H:camera-vm68:217'}
Job bfa0751a74bb0b38b01e07bc90557757 finished!  Result: CREATED - None,  Data:deque([]), Status:{'numerator': 0, 'time_received': 1587369991.1361463, 'running': False, 'known': False, 'denominator': 0, 'handle': 'H:camera-vm68:217'}

可见,一个任务一旦被设置为background执行,最后只能了解它是否执行完了,结果成功与否及中间进度都无法获得,client的get_job_status接口仅能用于非background任务的状态查询。

worker踢出

现象:

某个worker出现快速失败,然后又不停的到队列里拿任务,最后导致任务的大面积失败。

由于gearman server不主动分发,而是由worker“任性自为”,所以gearman server自身并无一个踢出快速失败worker的机制,需依赖于gearman client或worker来做这个事情。

具体说来,gearman client可以统计worker在一段时间内的失败次数、查询worker失败信息,来发现可能是快速失败的机器。另一方面,worker自己也可以根据错误信息来进行自我隔离。

tcp保活

起因:TCP对于非正常断开的连接并不能侦测到(比如网线断掉)。

我们先说一下TCP关闭连接时的动作,比如A和B通信,A向B发送一个FIN,B返回一个FIN,双方各自把单边的连接断开,整个TCP连接就结束了。如果,A突然崩溃了,这个FIN发不出去,没有保活机制,B可能就永远发现不了。

一般情况下,我们重启机器或者kill进程,socket文件句柄关闭,底层的TCP协议栈会为我们自动发送FIN,但接收端不一定能收到,比如下面的例子:

We are seeing some TCP behavior that we have not seen before. Normally when we kill a task that has a link over the local interface to another local task, in tcpdump we see that TCP sends a [FIN, ACK] from the side that died to the running task. The running task sends an [ACK] back. Then the side that died sends an [RST] back to the running task, and the running task is notified via normal socket ops that the link has disappeared.

Occasionally when the link has been up for a number of days, when we kill a task we are not seeing any traffic in tcpdump between the two sides. The task that is killed disappears. The link in netstat going to the running task has no client process listed and is in the FIN_WAIT1 state. The link in the other direction from the running task to the killed task is still in ESTABLISHED. The socket layer in the running task is never notified that the link has disappeared.

第二段说的就是kill进程时另一端没有得到FIN通知,从而导致连接残留,至于另一端没有得到FIN通知的原因,在这个案例里是因为防火墙策略,我觉得也不能排除丢包等其他可能。

tcp保活参数,是用下面命令查看:

cd /proc/sys/net/ipv4
cat tcp_keepalive_time
cat tcp_keepalive_intvl
cat tcp_keepalive_probes

三个参数的解释:

tcp_keepalive_time,在TCP保活打开的情况下,最后一次数据交换到TCP发送第一个保活探测包的间隔,即允许的持续空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2h)。
tcp_keepalive_probes 在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包次数,默认值为9(次)
tcp_keepalive_intvl,在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包的发送频率,默认值为75s。

gearmand上残留垃圾worker问题的解决

我们有时会发现一些worker被kill掉之后,或者某些机器panic了,在gearmand上依然能看到,原因是:gearmand侧因为某种原因未收到FIN通知,而它默认又没开TCP 保活,导致出现残留TCP连接。

我们可用如下选项使能TCP保活,比如下面的例子(案例链接 ):

 /usr/local/sbin/gearmand -p 4732 -L0.0.0.0 --log-file /usr/local/var/log/gearmand1.log --verbose=INFO -w 5 --keepalive --keepalive-idle=60 --keepalive-interval=30 --keepalive-count=3

我们可使用netstat -o选项来查看保活定时器是否生效:

netstat -apno | grep 49539

输出结果为:

tcp        0      0 0.0.0.0:4732            0.0.0.0:*               LISTEN      49539/gearmand       off (0.00/0/0)
tcp        0      0 xx.xx.xx.67:4732      xx.xx.xx.74:39048     ESTABLISHED 49539/gearmand       keepalive (0.80/0/0)

第一行表示gearmand监听在4732端口。第二行表示xx.74有一个worker连接上来,且连接是有keepalive定时器的,keepalive括号里的三列数据,第一列是定时器当前剩余时间,第三列是已重试次数。

我们发现,gearmand和worker之间始终是连接上的(相应的,我们会发现第三列"重试次数"始终为0),说明worker端也在做keepalive。

现在,我们在worker所在的xx.74上把39048端口封掉(可用iptables -D OUTPUT 1恢复)

iptables -A OUTPUT -p tcp --sport 39048 -j DROP

意味着worker不能向gearmand发送报文来维持keepalive了,很快,我们发现netstat -o结果的第三列“重试次数”达到最大值,worker连接被gearmand强制关闭。

再看看gearmand不做keepalive是什么现象,使用如下命令启动gearmand:

/usr/local/sbin/gearmand -p 4732 -L0.0.0.0 --log-file /usr/local/var/log/gearmand_4732.log --verbose=DEBUG -w 5

用netstat命令查出worker端口,接着用iptables命令封掉该端口,结果发现,即使我们把worker停掉,gearmand侧始终还是有这个worker连接,亦即gearmand认为这个连接仍然有效,这样客户端就会挂住!

不过,奇怪的是,如果此时我们新增其它worker进来,gearmand就能察觉到这种“连接残留”现象,把无效连接清理出去,并且后续新增的worker连接都会使用间隔为7200s(系统默认值)的keepalive定时器

如果我们不新增worker连接呢?客户端就会一直挂住。

综上,有几点结论:

  • gearmand默认不启动keepalive,但一旦它发现有“连接残留”现象,会对随后新加入的worker连接起一个默认时长(取决于操作系统的tcp_keepalive_time值,一般是7200s)的keepalive定时器;
  • 为了能够及时发现挂死worker,需要指定gearmand的keepalive参数到一个合适的值;
  • gearman客户端似乎是有keepalive动作的;
  • 使用iptables封端口命令可以模拟出“连接残留”现象。

取消任务

gearadmin --cancel-job <job-handle>  

This can be used to cancel a job that is not currently being handled by a worker. This will not cancel a job which is already in progress (though if the job fails, it will not be run again). 

使用的是gearmand提供的cancel job 管理命令,参考这里

只能取消还在排队的,若已经执行,则无法取消

gearman占用文件句柄数

一个worker连接就会打开一个文件句柄(socket),所以ulimit的限制对gearmand是有效的。

首先查看gearmand的ulimit限制:

cat /proc/32144/limits | grep "Max open files"

结果可能是:

Limit                     Soft Limit           Hard Limit           Units
Max open files            1024                 4096                 files

接着使用

ulimit -a

查看系统限制,结果可能是:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 1028104
max locked memory       (kbytes, -l) 16384
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1028104
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

查看open files那一项,为1024,说明每个进程最多只能打开1024个文件句柄。

再看看gearmand占用了多少个文件句柄:

ls -l /proc/34488/fd | wc -l

结果是903.

所以初步怀疑gearmand的卡死跟文件句柄数有关系。调整方法如下,增加-f选项,指定接收的文件句柄数为2048:

/usr/local/sbin/gearmand -d -L0.0.0.0 --log-file /usr/local/var/log/gearmand.log --verbose=INFO -w 5 -f 2048 --keepalive --keepalive-idle=60 --keepalive-interval=30 --keepalive-count=3

顺带说一句,gearmand的文件句柄占用数似乎满足如下的关系:

文件句柄数 > worker总数 + active worker数

所以,worker总数是800,一次批量发送200个任务,就很有可能突破默认的1024的界限。

gearman类似技术

celery:celery是一个分布式的任务调度模块,可以支持多台不同的计算机执行不同的任务或者相同的任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/74861.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理: 第八章chatGPT的搭建

理论基础 Transformer 大模型家族可以分成三类, 至于三者的区别可以参考上一章: Encoder-only,Decoder-only, 只需要Pre_trainEncoder-decoder , 可以在一些任务上无需进行fine_tune 必须要在下游任务进行微调比如Bert &#xff0c; Bart 。 T5 这种无需要微调就能完成一些任…

Mr. Cappuccino的第62杯咖啡——Spring之Bean的生命周期

Spring之Bean的生命周期 Aware接口项目结构项目代码运行结果源代码使用场景 InitializingBean接口项目结构项目代码运行结果源代码 BeanFactoryPostProcessor接口项目结构项目代码运行结果源代码 Bean的生命周期项目结构项目代码运行结果源代码 Aware接口 实现Aware接口是为了…

全新 – Amazon EC2 M1 Mac 实例

去年&#xff0c;在 re: Invent 2021 大会期间&#xff0c;我写了一篇博客文章&#xff0c;宣布推出 EC2 M1 Mac 实例的预览版。我知道你们当中许多人请求访问预览版&#xff0c;我们尽了最大努力&#xff0c;却无法让所有人满意。不过&#xff0c;大家现在已经无需等待了。我很…

用身边统计学告诉大家ChatGPT听闻过的、用过的、重度使用的大概有多少?

最近摸鱼时&#xff0c;看到有人发帖说信息茧房真的是无处不在。讨论一番后&#xff0c;确实是这样&#xff0c;每个人都在不同程度的“坐井观天”罢了。拿最近火遍全球的ChatGPT来说&#xff0c;身边真的不少人听都没听过。这里有个更详细调查&#xff0c;不过是Sunergia做的&…

Python Opencv实践 - 图像放射变换

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols img.shape[:2] print(img.shape[:2])#使用getAffineTransform来获得仿射变换的矩阵M #cv.getAffineTransform(…

用js快速生成一个简单的css原子库 例如: .mr-18 .pl-18

第三方css原子库的缺点 比如 tailwindcss&#xff0c;有学习成本最开始写的时候效率可能还没有我们自己手写效率高&#xff0c;需要配置&#xff0c;会有原始样式被覆盖的问题&#xff1b;总之就是一个字重 自己搓的优点 学习成本低灵活不会有副作用 <!DOCTYPE html>…

【Rust】Rust学习 第十三章Rust 中的函数式语言功能:迭代器与闭包

Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程&#xff08;functional programming&#xff09;。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 更具体的&#xff0c;我们将要涉及&#…

R语言生存分析算法的简单组合

library(survival) library(randomForestSRC)# 生成模拟数据 set.seed(123) n <- 200 time <- rexp(n, rate 0.1) status <- rbinom(n, size 1, prob 0.7) var1 <- rnorm(n) var2 <- rnorm(n) var3 <- rnorm(n) data1 <- data.frame(time time, statu…

怎么使用手机远程控制Win10电脑?

可以使用手机远程控制电脑吗&#xff1f; “近期&#xff0c;我将出差一段时间。问题是&#xff0c;我希望能够从很远的地方浏览家里电脑上的一些东西&#xff0c;但我不会一直随身携带笨重的笔记本电脑。我可以手机远程访问Windows电脑吗&#xff1f; ” 当然&am…

网络基础--ARP协议介绍

1、ARP作用 ARP&#xff08; Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是将 IP 地址解析为以太网 MAC 地址&#xff08;或称物理地址&#xff09;的协议。在局域网中&#xff0c;当主机或其它网络设备有数据要发送给另一个主机或设备时&#xff0c;它必…

AIGC热潮涌动 HashData如何降低大模型应用门槛?

当前&#xff0c;以ChatGPT为代表的大语言模型&#xff08;LLM&#xff09;正在掀起新一轮的AI 浪潮&#xff0c;数字产业生态也迎来前所未有的变局。随着大模型应用的兴起&#xff0c;如何低成本地实现大模型的构建和应用&#xff0c;成为企业关注的重点。 数据仓库是企业数据…

前后端分离------后端创建笔记(07)表单验证

1、我输入数据&#xff0c;然后关闭&#xff0c;重新打开会发现残存的数据仍然保留着 2、点了这个x号&#xff0c;数据就全部被清理了 3、点这三个地方&#xff0c;数据全部都清理掉 4、这里先写一个方法 4.1 定义一个方法 4.2 这里表单的数据在哪里&#xff0c;就是这个 4.3 …

Linux文件系统管理

Linux文件系统管理 磁盘的组成与分区 计算机用于存取文件的硬件是磁盘&#xff0c;磁盘的组成主要有磁盘盘、机械手臂、磁盘读取头与主轴马达所组成&#xff0c; 而数据的写入其实是在磁盘盘上面。磁盘盘上面又可细分出扇区(Sector)与磁道(Track)两种单位&#xff0c; 其中扇区…

idea常见错误大全之:解决全局搜索失效+搜索条件失效(条件为空)+F8失灵

问题一&#xff1a;全局搜索快捷键ctrlshiftf 突然失灵了&#xff0c;键盘敲烂了 都没反应&#xff0c;这是为什么呢&#xff1f; 肯定不是idea本身的原因&#xff0c;那么就是其它外在因素影响到了idea的快捷键&#xff0c;那么其它的快捷键为什么没失效呢&#xff0c;原因只有…

P13-CNN学习1.3-ResNet(神之一手~)

论文地址:CVPR 2016 Open Access Repository https://arxiv.org/pdf/1512.03385.pdf Abstract 翻译 深层的神经网络越来越难以训练。我们提供了一个残差学习框架用来训练那些非常深的神经网络。我们重新定义了网络的学习方式&#xff0c;让网络可以直接学习输入信息与输出信息…

【应用笔记】使用 CW32 实现电池备份(VBAT)功能

前言 电池备份&#xff08;VBAT&#xff09;功能的实现方法&#xff0c;一般是使用 MCU 自带的 VBAT 引脚&#xff0c;通过在该引脚连接钮扣电池&#xff0c;当系统电源因故掉电时&#xff0c;保持 MCU 内部备份寄存器内容和 RTC 时间信息不会丢失。 本文档介绍了如何基于 C…

迭代器失效问题

1.什么是迭代器失效 迭代器失效是一种现象&#xff0c;由特定操作引发&#xff0c;这些特定操作对容器进行操作&#xff0c;使得迭代器不指向容器内的任何元素&#xff0c;或者使得迭代器指向的容器元素发生了改变。 2.可能引起迭代器失效的操作 ①.插入元素/扩容引起的迭代…

web图书管理系统Servlet+JSP+javabean+MySQL图书商城图书馆 源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 web图书管理系统ServletJSPjavabeanMySQL 系统有1权限…

合同管理是什么,合同管理怎么做

阅读本文&#xff0c; 您可以了解&#xff1a;1、合同管理是什么&#xff1b;2、合同管理怎么做 一、合同管理是什么 合同管理是指对合同的有效执行、监督和维护过程的管理。合同是一种法律文件&#xff0c;用于规定各方之间的权利和义务。在商业和法律交易中&#xff0c;合同…

Windows 11 家庭中文版找不到组策略文件gpedit.msc

最近因为调整日期问题需要用到组策略文件gpedit.msc,但是发现找不到文件 在按键盘 winR 打开运行界面输入 gpedit.msc 回车 Windows找不到文件’gpedit.msc’。请确定文件名是否正确后&#xff0c;再试-次。 检查电脑Windows系统版本 是 Windows 11 家庭中文版 果断早网上搜…