一个crontab脚本,下载一个文件并把内容入mysql数据库。具体流程如下:

1, wget一个文件。

2,处理文件生成一个中间文件。

3,将中间文件load入库。

05 10 * * * /home/work/local/php5.4/bin/php /home/work/www/new_products1/web/index_cli.php actionads/index

  

bug现象:

在线上,5次运行中,有2次会出错,就是入库的数据会缺失30%以上。

在线上手动运行脚本,没有一次出错。但配置成crontab,5次运行中,就会出错2次。

难点:

这种不可复现的bug,实在是难找原因。我们只能保存当时的现场,但脚本每天只运行一次,一次解决不了bug,可能需要等好几天才能复现这个bug。

解决流程:

1,怀疑是load文件时,丢失了部分数据。

于是解析mysql的binlog日志,找到了load的那一部分,将日志中获取到的文件字节数相加 (mysql load过程中,每下载一部分文件,会记录一下获取到了多少字节),发现文件没有丢失。同时,找到了mysql load时保存的临时文件,也是没有丢失数据的。

2,生成中间文件时,出错。

虽然开始确认了中间文件出错,但找不到为什么出错。。。

文件的开始有约30%的内容是ascii=0代表的字节。于是怀疑是不是磁盘坏道了。。。

一个程序读一个文件,处理后,写另外一个文件,在线下运行一直没有问题,程序里面也没有使用随机数之类的。。。所以我确认这段程序肯定是没有问题的。

3,假设磁盘坏道了,找证据。

我想坏道的话,把系统调用记录下来,应该可以看到原因。于是我把crontab改成:

  * * * strace -f /home/work/local/php5./bin/php /home/work/www/new_products1/web/index_cli.php actionads/index 2>>temp.log

发现read write系统调用没有出错的情况。

但同时也发现了一个现象,read源文件时,读到了大量的ascii=0代表的字节。如图:

同时,写中间文件时,也写入了大量的ascii=0所代表的字节:

这就解释了为什么中间文件会有这么多0,原因就是读到的源文件就有这么多0.

4,为什么源文件出错?

还是百思不得其解,下载的文件字节数也没有问题,说明数据没有丢失。为什么到线上就有问题呢?

眼睛盯着屏幕,好像突然发现了问题

*/ * * * * /home/work/local/php5./bin/php /home/work/www/new_products1/web/index_cli.php appcall/index
*/ * * * * /home/work/local/php5./bin/php /home/work/www/new_products1/web/index_cli.php actionads/index

原来有两个crontab,另外一个crontab也是下载一个文件,并且这两个crontab下载到的文件的名字是一样的。

会不会是它们两个冲突了呢?写一个脚本来验证。

wget ftp://xxxx:yyyy@ftp.daas.baidu.com/wenyisheng_tab23/20150904 -O 888  2>/dev/null &
sleep
wget ftp://xxxx1:yyyy1@ftp.daas.baidu.com/app_diaoqi/20150904 -O 888 2>/dev/null &

第一个wget下载到的文件有20M,第二个只有1M。为了故意生成冲突,我就让中间sleep 1秒种。

发现最后文件888,字节数跟第一个wget获取到的文件一样,但内容不一样,内容中间夹杂了第二个wget的文件。

后记

其实这个bug应该是可以很早就发现的,检查一下下载到的文件内容就可以发现。

我把它想复杂了,一看文件字节数没有问题,就确认这个文件也是没有问题的,所以就把这个线索中断了,被引入了歧途。

其实遇到疑难bug,不要急于下手,可以回顾一下流程,列一下可能出错的地方,一个一个排除,我想应该很快搞定它。

PS:

在追踪bug的时候,发现php yii框架在记录日志的时候,会把日志锁上,如下:

open("/home/work/www/logs/app.log", O_WRONLY|O_APPEND|O_CREAT, ) =
fstat(, {st_mode=S_IFREG|, st_size=, ...}) =
lseek(, , SEEK_CUR) =
lseek(, , SEEK_CUR) =
flock(, LOCK_EX)
stat("/home/work/www/logs/app.log", {st_mode=S_IFREG|, st_size=, ...}) =
write(, "2015-09-04 09:25:01 [-][-][-][in"..., ) =

为什么要加锁呢?这就验证了我以前一篇博客中的结论《日志会被写乱吗?》

因为Yii写日志的时候,会把日志记录在内存中,在一次请求处理完以后,统一写到磁盘,这时候日志会比较大,

一次write调用写不完,为了防止其它请求把日志写乱,就把日志文件加锁了。

我想这样会影响并发性能。

一个疑难bug的解决过程的更多相关文章

  1. 记录一个前端bug的解决过程

    人在江湖飘,哪能不挨刀. 我挨了重重一bug.严格来讲这可能是我职业生涯以来的首个悲惨经历,因为凭我的知识储备和经验,基本上任何可重现的bug都是可解的.然而这个bug却困扰了我三个月之久,它具有以下 ...

  2. android一个下拉放大库bug的解决过程及思考

    android一个下拉放大库bug的解决过程及思考 起因 项目中要做一个下拉缩放图片的效果,搜索了下github上面,找到了两个方案. https://github.com/Frank-Zhu/Pul ...

  3. JSON金额解析BUG的解决过程

    [原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源] 这是在我们开发的一个支付系统中暴露的一个BUG,问题本身比较简单,有意思的是解决问题的过程.将过程分享出来,希望能够对大家有所帮助. 一 ...

  4. Win10 UWP系列:关于错误 0x80073CF9及一个小bug的解决

    最近一直在开发XX的uwp版本,也是边摸索边做,最近遇到几个比较奇怪的问题,记录于此. 1.项目可用部署到PC,但无法部署到手机,提示以下错误: 错误 : DEP0001 : 意外错误: Instal ...

  5. 使用 $(function(){}) 时遇到的一个小bug及解决方法

    在 $(function(){}) 中声明函数,在 $(function(){}) 外调函数,会报错 原因: 页面加载后,会先执行 $(function(){}) 外面的语句,再执行 $(functi ...

  6. 如何从头到脚彻底解决一个MySQL Bug

    摘要:为了保障华为云GaussDB产品的可靠性,每一款产品发布前都要通过多轮严苛的测试用例. 说明:本文中的MySQL,如果不做特殊说明,指的是开源社区版MySQL. 华为云数据库新版本在发布之前,会 ...

  7. 这几天帮一个朋友解决了一点小问题(RF的有些小问题及解决过程)

    最近涉猎自动化太少了,以至于都不经常更新了.最近一个朋友在做移动端自动化的时候遇到了一些小问题来找我解决.本人也不是很精通,只是接触的时间长了一点了.下面就是一些问题和解决过程: 1.她刚过来的时候, ...

  8. 终于解决了贴吧手机版的一个重大BUG

    终于解决了贴吧手机版的一个重大BUG 别诧异虽然同一个域名,但是,PC 和手机打开完全不一样的体验 http://tieba.yunxunmi.com/ 吃点夜校准备做梦去!! 发现 我云贴吧 一个  ...

  9. springboot中json转换LocalDateTime失败的bug解决过程

    环境:jdk1.8.maven.springboot 问题:前端通过json传了一个日期:date:2019-03-01(我限制不了前端开发给到后端的日期为固定格式,有些人就是这么不配合),      ...

随机推荐

  1. 如何获得iphone设备的剩余空间

    在手机终端开发的时候,我们需要关注手机剩余空间,因为手机不像电脑一样空间宽裕,当设备空间比较少得时候需要释放空间. 用法:先引入头文件 #include <sys/param.h> #in ...

  2. 20 个最棒的 jQuery Tab 插件

    jQuery Tab 常用来做网页上的选项设置界面和导航,本文向你推荐最棒的 20 个 jQuery Tab 插件.Enjoy !! 1. Slider Tabs SliderTabs 是一个可定制的 ...

  3. http://f.dataguru.cn/forum.php?mod=viewthread&tid=44212&fromuid=4771

    http://f.dataguru.cn/forum.php?mod=viewthread&tid=44212&fromuid=4771

  4. 酷盘kanbox获得B轮2000万美元融资

    和阿里近期收购以穷游.虾米为代表的一批小网站相似,酷盘也属于个人用户数量级别庞大,但商业模式并不明晰的企业.目前阿里巴巴集团旗下的阿里云公司拥有自己的云存储业务,其本身既有面向个人用户的产品,也有面向 ...

  5. ALT+数字,可输入汉字或拉丁字母 good

    各种编码查询表:http://bm.kdd.cc/ 输入 ALT + 50385 就出 难 字了,原因是它的十六进制ANSI编码是C4D1=50385 同理: 汉=BABA=47802字=D7D6=5 ...

  6. 多核CPU怎么理解

    简而言之,双核处理器即是基于单个半导体的一个处理器上拥有两个一样功能的处理器核心.换句话说,将两个物理处理器核心整合入一个核中.企业IT管理者们也一直坚持寻求增进性能而不用提高实际硬件覆盖区的方法.多 ...

  7. WPF——控件之间的绑定

    一.启动窗口 二.控件绑定(注意看光标的位置,一个是单向绑定,一个是双向绑定) 注意看单向绑定与双向绑定的绑定方法:

  8. bzoj3697

    一开始又看错题,以为同样路径上不同的休息站是算不同路径,后来发现休息站只是路径合法的条件毫无疑问是树的分治,下面我们只要考虑计算能建休息站的路径我们把阳看作路径权值为1,阴作为路径权值-1点分治之后, ...

  9. c#浅谈反射内存的处理

    这段时间由于公司的项目的要求,我利用c#的反射的机制做了一个客户端框架.客户端里的所有的模块都是以一定形式进行提供,例如:FORM,UserControl. 在做的过程中很简单与愉快.具体的过程如下: ...

  10. c# 无损高质量压缩图片代码

    /// <summary> /// 无损压缩图片 /// </summary> /// <param name="sFile">原图片</ ...