阅读更多

8顶
1踩

数据库

转载新闻 一次曲折的bug调试经历

2015-11-20 14:19 by 副主编 mengyidan1988 评论(5) 有6347人浏览
Bug调试是让程序员最头痛的任务,因为它就像狄仁杰断案一样,需要抓住任何的蛛丝马迹、展开丰富的推理联想,一次次的尝试,才有可能解决疑问命案——不然程序员会死,不是加班熬夜熬死,就是让老板开除,郁闷而死。

最近我在操作一个页面时,程序出现了这样的错误:
Fatal error: mysql error: [1: Can't create/write to file '/var/tmp/#sql_9469_0.MYI' (Errcode: 28)]

错误是mysql服务器抛出的,是致命错误,我以前没有遇到、也没有见到过这样的错误,但错误提示信息还是很丰富、明确的。不像以前曾遇到的错误提示,一点价值都没有。

用谷歌搜索,搜索出了很多相关信息页面,说明这个错误还是比较普遍的。基本可以断定这个错误是由于硬盘没有足够的剩余空间导致的,特别是错误信息里提到的Errcode: 28,这个错误代码有明确的意义,在命令行里使用perror命令:
$ perror 28
OS error code  28:  No space left on device

似乎引起错误的原因已经找到了,如果是硬盘空间不足,只需要扩充存储空间或删除一些无用的文件就行了。那是真的因为硬盘空间不足吗?使用df命令查看一下:



意外的是,系统还有充足的空间,系统盘只使用了15%,数据盘只使用了25%。奇怪吧,错误提示信息和真正情况并不能统一。

调试bug时遇到挫折常见的,我没有别的办法,怀疑找错了方向,但现有的线索也只有这些,怎么办呢,我觉得还是应该在网上搜索,也行会有新的发现。

果然,在一篇文章里看到有人说Errcode: 28所指示的No space并不一定是指空间不足,也可能是磁盘上的文件数过多,这位网友这样说:
I had same problem but disk space was okay (only 40% full). Problem were inodes, I had too many small files and my inodes were full.

You can check inode status with df -i

他说的这个问题我是遇到过的,linux文件系统里对文件数是有限制的,当文件数达到最大数量是,你将无法新增文件。错误信息里提到了无法读写tmp目录下的临时文件,也行正是因为无法创建新的文件。

那么使用df -i会是什么结果呢?让我吓一跳,在/dev/vda1盘上的文件数竟然快到200多万。看来文件就出自这里了。

下面的任务是找到哪个目录里藏了这么多文件。我使用了笨办法,手工从根目录一个一个的搜:
find DIR_NAME -type f ¦ wc -l

上面的命令可以统计出指定目录下一共有多少个文件。这是个体力活儿,但体力活儿是最容易出结果的,没用多久,我就发现了一个可疑目录:
/var/spool/postfix/maildrop

这个目录下竟然有180万个文件。

看来凶手就是它了。只要将maildrop下的文件全部删掉,磁盘文件数会全部释放,问题也就解决了。可是,为什么会有这么多文件,为什么会在postfix目录下,这个问题如果不搞清楚,相同的服务器异常不久后还会出现。

那么,postfix;是个东西,而maildrop又是个什么东西。

原来postfix是一个邮件服务器软件:
引用

What is Postfix? It is Wietse Venema’s mail server that started life at IBM research as an alternative to the widely-used Sendmail program. Now at Google, Wietse continues to support Postfix.

而maildrop是邮件队列,里面存放的都是一个个邮件。

可问题又来了,哪里来的这么多邮件,谁发给谁的?

我从maildrop下载了一个邮件文本,打开一看,是发给root用户的,邮件的内容是Cron Daemon执行信息。

祸首原来是任务调度程序,这几百万封邮件都是它发的,每执行完一个Cron任务,它都会发给root一份任务完成情况的邮件。在/etc/crontab文件里陈列着30多个定时调度任务,而且很多任务执行的频度很高,所以才在短时间里发送了这么多的文件。

根源是找到了,只要禁止这些调度任务给root发邮件,系统文件数就不会大量增加,我的程序就不会出现Errcode: 28错误了,可我不能简单的删除这些调度任务来禁止它们发邮件。对/etc/crontab文件熟悉的系统管理员会知道,就在它的前几行是配置信息:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

其中第三行是配置邮件的,它指明要把邮件发给root用户,只需要把这行信息改成MAILTO="",它就再也不发邮件了。

到此为止,问题算是彻底解决了,但回顾一下,一个mysql的异常的原因竟然是由于Cron调度发邮件导致的,风马牛不相及的事情,真有点像蝴蝶效应,亚马逊丛林里蝴蝶扇动翅膀,最终导致太平洋上风暴。软件开发中的调试bug就是这样的不可思议。

来自:http://jicc.cc/
  • 大小: 26.8 KB
来自: http://jicc.cc/
8
1
评论 共 5 条 请登录后发表评论
5 楼 gfdice 2015-11-30 15:14
forrest_lv 写道
这个确实也也用不着激动,服务器软件,考虑到inode满的情况不能写文件,常规经验
gfdice 写道
看lz折腾这么半天才找到原因,顿时感觉自己真是个经验丰富的程序员了。


我再介绍个经验:有时候df显示满了,但是怎么找磁盘上的文件就是没占那么多空间,这时候可以查查是不是有的进程有大量的unlink但没有正确fclose的文件,这些文件在文件系统上已经查不到了,但是依然是占用空间的,我遇到过,用`lsof|grep deleted`查查看就行。
4 楼 漫步邃思 2015-11-25 11:10
这个错误我之前也遇到过一次,搜索了很久才找到原因,主要是错误原易引起误解。
3 楼 forrest_lv 2015-11-22 18:50
这个确实也也用不着激动,服务器软件,考虑到inode满的情况不能写文件,常规经验
gfdice 写道
看lz折腾这么半天才找到原因,顿时感觉自己真是个经验丰富的程序员了。

2 楼 somefuture 2015-11-21 12:01
gfdice 写道
看lz折腾这么半天才找到原因,顿时感觉自己真是个经验丰富的程序员了。

噗呲
1 楼 gfdice 2015-11-20 14:53
看lz折腾这么半天才找到原因,顿时感觉自己真是个经验丰富的程序员了。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 记一次灵异般的 Bug 调试经历1

    来看看他在 Quora 上拿到 16k 多顶的经历:我曾经受雇于一位心理学家,去修复一个“输出有些奇怪的”软件,那个软件是他之前带过的一个研究生编写的。所以我可

  • 吐槽一下(记一次调试bug的经历)

    前两天讲解dubbo与rpc,中间出现了一个由于dubbo与spring注解冲突的一个问题。 人啊,还是得下功夫自己好好学习一下才行的。技术上,大家需要踏踏实实的,一步一个脚印的往前走。 越来越觉得博客写的好就一定行吗?...

  • 一次印象深刻的bug调试经历

    最近一段时间,再做一个用pig写的基于曝光数据的为大广告主提供一些搞搞效果数据的项目,最近苦逼的加班了好久,周末加过班、晚上加班、回家以后跑数据还得加班,总之是我大学毕业一年半以来最苦逼的日子。...

  • freeswitch1.6.20 一次NACK调试经历

    NACK(丢包重传技术)是一种通知技术,接收端在未收到消息时,通知发送方“我未收到消息”,即通知未达。然后发送方可以根据收到的NACK消息,解析出需要发送那些rtp包或者帧。这种机制在一定程度上解决了丢包问题,...

  • “令你目瞪口呆的Bug经历,你肯定没见过!“

    ”、“谁敢信,我电脑死机竟然是因为放青藏高原的时候硬盘共振振幅太大了——”……人生处处有Bug,哪一个最令你目瞪口呆,久久不能忘怀?今天就来浅浅分享一下吧!在程序员的世界里,Bug就像是一个烦人的鬼魅,随时...

  • 13 年的 Bug 调试经验总结

    本文地址:在《Learning From Your Bugs》一文中,我写了关于我是如何追踪我所...编码下面这些都是我经历过的会导致难点bug的问题:1.事件顺序。在处理事件时,提出下列问题会很有成效:事件可以以不同的顺序到达吗?如

  • “分享你最令人苦笑不得的编程bug经历“

    编写代码时经常会遇到各种各样的问题,...这些神奇的bug可能会让我们困扰一段时间,但是最终找到问题并解决它们后,我们会拥有一些有趣的故事和经验。让我们分享这些让我们困扰、让我们感到愚蠢的bug,一起来笑一笑吧!

  • 程序员经历过的最难调试的Bug是什么?

    ”程序不息,Bug不止”,程序员在与Bug的斗争中,也有很多有趣的事情发生,播妞总结了程序员调试Bug的种种传奇经历。 01  @网友王译: 当时我们在做 Egret Runtime 的第一个版本,可以...

  • 最难忘的Bug调试经历

    相信每位程序员都有过一段不堪回首地Bug调试经历,程序员一听到自己的程序有Bug,会有各种搞笑的反应,大家可以移步去看看“程序员遇到Bug后的30种常见反应”。 目前,著名的社区问答网站Quora上出现一个很火的讨论...

  • Bug 调试经验总结

    下面这些都是我经历过的会导致难点bug的问题: 1.事件顺序。在处理事件时,提出下列问题会很有成效:事件可以以不同的顺序到达吗?如果我们没有接收到此事件会怎么样?如果此事件接连发生两次会怎么样?哪怕通常不会...

  • 【编程】记录一次gdb coredump 调试经历

    记录一次gdb coredump 调试经历 在板子上有个进程反复挂掉重启。把coredump文件下载回开发环境。 命令形式: gdb xxx cored-xxx /projects/hnd/tools/linux/hndtools-mips-linux-uclibc-4.9.3/usr/bin/mips-ugw...

  • STM32的相关bug经历

    一次更新CubeMX中的Firmware Pakage导致的问题问题描述调试 问题描述 昨天打开.ioc文件改下STM32F4的芯片一些配置时,发现有新的固件包可以用,于是想着越新越好,就手抖更新下工程的固件包,之后在调试时就炸出了个...

  • 记一次内存释放调试经历

    1. bug 第一次出现的地方 现象: Windows has triggered a breakpoint in QuizEditer.exe. This may be due to a corruption of the heap, and indicates a bug in ****.exe or any of the DLLs it has loaded. ...

  • 一次难忘的Bug经历

     现在又有机会接触dsp, 这次一定要好好学习,但是当进行优化时, 有个函数,只知道有错误,也知道哪些地址值也改变了,但是就是查不出错误在哪里,调试了接近一天,最后却是在瞟了一眼一个数组时看出了错误

  • 记一次debug经历,基础的重要性

    第一次注册失败: 第二次修改信息后: debug思路: 1.使用了AsyncTask,会不会是多次调用了execute()方法导致的?debug做法: 进行条件判断,如果task实例不为null,则先设置为null,再重新初始化 。用Log...

  • watchdog及android系统bug调试

    最早引入Watchdog是在单片机系统中,由于单片机的工作环境容易受到外界磁场的干扰,导致程序“跑飞”,造成整个系统无法正常工作,因此,引入了一个“看门狗”,对单片机的运行状态进行实时监测,针对运行故障做一些...

  • 一次堆破坏的调试经历

    在vc debug的过程中,突然弹出了一个assert窗口:   Windows has triggered a breakpoint in cs.exe. This may be due to a corruption of the heap, which indicates a bug in cs.exe or any of the ...

  • 记一次uniapp的踩坑经历

    前言 这几天在做一个app,打比赛用,使用的是uni+uView的组件库。这个组件库是半道加进来的,学弟推荐的,我看有组件的话确实会方便很多,而且他都是按需引入,不占用...本次内容:分享一次因粗心踩的坑,一个自己进行

  • 基于FPGA的FOC电流采样Bug调试记录

    也明白了调试过程中要循序渐进,采用一步步的排除bug,先排除硬件bug,在排除软件Bug,软件bug通过时序一步步排除问题,最终找到是哪个环节出了问题,谨以此博客来记录这次难忘的调试经历。 Bug现象 本次FOC出现的BUG...

  • python 工业软件开发_记一次工业软件开发经历

    项目概述项目背景:工厂表面处理产线项目b司接了a司一条表面处理产线的项目,包含硬件及软件,由于现在b司做的软件难用且数据难以查找,a司不满意验收不通过,款项没有结清。所有b司找到我们,希望我们能帮他搞定这个...

Global site tag (gtag.js) - Google Analytics