一次曲折的bug调试经历 | 急匆匆



一次曲折的bug调试经历 | 急匆匆

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命令查看一下:

1

意外的是,系统还有充足的空间,系统盘只使用了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就是这样的不可思议。


Read full article from 一次曲折的bug调试经历 | 急匆匆


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts