supervisor踩坑记录
线上一直以来都在用supervisor管理各项服务,感觉非常舒心,supervisor管理`gunicorn`和`celery`进程,web服务和异步任务各司其职,跑起来一直很稳定。
前段时间却不小心踩了一个小坑,本来以为是celery的问题,后来查了半天才发现,原来根源在supervisor这儿。
灵异事件的表现是这样的,一个小项目里有用到了异步任务,但是发送到异步队列的某一个任务,有时候可以执行成功,有时候失败,不稳定重现。
刚开始的时候怀疑任务本身出了问题,但有点说不通,因为并没有任何的报错被发送出来,连任务代码第一行的日志都没有被输出。另外,其他任务都是正常的,日志也是正常的,每一次的任务都能成功。
所以,目光又开始聚焦到了任务的调用方式上面,就先改成了同步试试,然后发现同步是可以成功的,这至少是排除了任务本身的问题了,任务函数是正确的。
这就奇怪了,难不成是调用的姿势不对吗,翻了一下celery的源码,发现了`apply_async`这个函数中有个`task_id`这个参数,正好我在调用的时候用了`delay`函数,且业务上的参数也是`task_id`,而`delay`函数里面就一句话,调用`apply_async`函数。
看到这个地方的时候,我感觉自己找到了问题的关键,这不就是参数名冲突了吗,改改参数名就好了,然后就把自己的`task_id`改成了`task_id_`,刚兴奋得改完,回头瞅了一眼`delay`和`apply_async`这俩函数,发现自己又错了,我是用`delay`函数调用的,而`delay`函数的参数其实是`*args`和`**kwargs`,`delay`函数里面调用`apply_async`的时候,只传了这两个参数,并且是作为元组和字典传进去的,而`task_id`是独立的一个参数,和`args`这些参数是平级的,所以根本就不存在参数名冲突这个可能。
刚抓住的稻草又没了,只能再去分析了,又去翻了翻日志,突然发现,自己以前写的一个函数里的日志输出有异常,本来打印的info日志里面有个错别字被改掉了,但是最近刚刚打出来的日志,竟然还有这个错别字。
到这问题基本已经清楚了,那就是有不止一组的celery任务进程在开着,并且有一部分是旧的代码。赶紧验证一下,`ps -ef | grep celery`看了一下,当下在跑着的任务里,果然不止`supervisor`现在在监控的celery进程,还有一些老旧的celery进程,其父进程ID都变成了1,好了,到此真相大白了。赶紧把这些任务kill掉,再验证一遍,终于好了,任务又开始稳定得执行了。
后来问了问,原来是这台机器上的supervisord有一次被意外kill了,但是这些异步任务却留了下来,并且父进程ID都成了1。后来supervisord被启动了依赖,但是这个事情一直没有被发现,这些任务进程也会连接到相同的消息队列去进行消耗,但旧的任务队列里面并没有对应的新任务的处理方法,所以这些被旧的任务进程拿到的任务,就被丢弃了。
后来又看了看celery启动时候的日志,发现standalone启动的时候,是有下面这段提示的
[2017-01-05 19:51:47,815: INFO/MainProcess] mingle: searching for neighbors
[2017-01-05 19:51:48,821: INFO/MainProcess] mingle: all alone
而有同名的node name存在的时候,也是有下面的日志的
[2017-02-09 19:10:50,872: INFO/MainProcess] mingle: searching for neighbors
[2017-02-09 19:10:51,881: WARNING/MainProcess] /home/deploy/_pyvenv/xxxxx/lib/python3.4/site-packages/celery/app/control.py:36: DuplicateNodenameWarning: Received multiple replies from node name: celery@xxxxxxxxxxhostnamexxxxxxxx_
要是早点看看celery的日志,问题也是可以被解决的。
嗯,再次体现了看日志的重要性,这次因为这个异步任务本身并不怎么重要,只有开发和部分运营的同学用到的功能里包含了这个任务,所以并没有造成什么太大的损失。
但要是一个重要的项目重要的任务出这种问题就悲剧了,后面需要针对这种事情做好监控,并且规范线上的操作,做好checklist完善和操作各项基础设施的操作指南,避免这种事情再发生了。
supervisor踩坑记录的更多相关文章
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- google nmt 实验踩坑记录
最近因为要做一个title压缩的任务,所以调研了一些text summary的方法. text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...
- ABP框架踩坑记录
ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...
- SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录
Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...
- IDFA踩坑记录
IDFA踩坑记录: 1.iOS10.0 以下,即使打开“限制广告跟踪”,依然可以读取idfa: 2.打开“限制广告跟踪”,然后再关闭“限制广告跟踪”,idfa会改变: 3.越狱机器安装开发证书打的包, ...
随机推荐
- bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】
模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...
- java实现——030最小的k个数
1.O(nlogk)海量数据 import java.util.TreeSet; public class T030 { public static void main(String[] args){ ...
- myeclipse的常用快捷键
创建一个类 Alt+Shift+N,C,输入Demo,回车 创建类属性 按3次下方向键,回车,输入String name;,回车 创建构造器 Alt+Shift+S,O,回车 创建getter/set ...
- imagebutton、imageview的属性
[转]http://blog.csdn.net/victoryckl/article/details/14162131 http://blog.sina.com.cn/s/blog_68b3fdc30 ...
- IOC:AutoFac使用demo
使用autofac 实现依赖注入 1.引用 autofac.dll 和 autofac.configuration.dll 2.新增接口 IDAL using System; using System ...
- Bomb(hdu 3555)
题意:给定一个闭区间,求区间内有多少数中含"49" /* dp[i][j]表示i位数以j为最高位位中的所有不符合数的个数. 然后把数字拆分,乱搞即可. */ #include< ...
- 8.DNS :域名系统
前面已经提到了访问一台机器要靠IP地址和MAC地址,其中,MAC地址可以通过ARP协议得到,所以这对用户是透明的,但是IP地址就不行,无论如何用户都需要用一个指定的IP来访问一台计算机,而IP地址又非 ...
- php正则表达式简介
正则表达式简介 正则表达式Regular Expression,使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.代表性书籍<正则表达式之道>里面有详细论述,本书籍为个人查阅之用力 ...
- C,C++,VC++有什么区别
C语言是一种古老而又经久不衰的计算机程序设计语言,大约诞生于上个世纪60年代.由于它的设计有很多优点,多年以来深受广大程序设计人员的喜爱,并逐渐淘汰了很多其它程序设计语言.我们平时使用的大多数软件都是 ...
- 兼容ie6及以上的阴影滤镜的写法
.subnav{ width: 220px; _width:160px; min-height: 168px; border: 1px solid #d0d8da; background: #fff; ...