Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73093
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 126
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-13 23:44
个人简介

信息安全出身、高性能流媒体服务器开发从业者、CDN、linux爱好者、HLS

文章分类

全部博文(14)

文章存档

2016年(14)

我的朋友

分类: LINUX

2016-03-26 22:33:01

今天遇到一个因内存泄露导致的coredump,服务器内存瞬间耗干,产生一个100g+大的coredump文件。coredump进行了10min,硬盘差点就没空间了。。。后来定位发现是由于使用linux内核的通用链表导致的问题,相同的节点加链表两次导致一个节点陷入死循环,以致内存瞬间耗干。

下面来看一下linux通用链表相同的节点加链两次这种bug会产生怎么样的后果:

先看加链的源代码:
static inline void __list_add(struct list_head *new1,                
                              struct list_head *prev,                
                              struct list_head *next)
{
        next->prev = new1;
        new1->next = next;
        new1->prev = prev;
        prev->next = new1;
}

static inline void list_add_tail(struct list_head *new1, struct list_head *head)  
{
        __list_add(new1, head->prev, head);
}

原始的链表:

使用list_add_tail将第3个节点再次加链之后:

所以此时一旦遍历链表就会陷入死循环。



mark一下,有时间整理一下linux源码链表相关,,以及coredump相关

阅读(2423) | 评论(0) | 转发(0) |
0

上一篇:ulimit命令

下一篇:vfork 挂掉的一个问题

给主人留下些什么吧!~~