文章归档

cgroup.memory内核oom过程

以内核3.10.79为例。这里分析一下内核对于cgroup.memory进程组oom的过程,以及混部环境下需要什么样的oom策略。

1. 触发时机

内核对于每个memory cgroup维护一个计数器,统计当前cgroup内已经使用了的内存。每当cgroup内进程创建页面时,页面大小所占用的内存就会通过res_counter_charge_locked()函数计入计数器里。而当内存占用超过memory.limit_in_bytes所设置的阈值时,charge失败,返回ENOMEN错误。

int res_counter_charge_locked( struct res_counter *counter, unsigned long val, bool force) { int ret = 0; if (counter->usage + val > counter->limit) { counter->failcnt++; ret = -ENOMEM; if (!force) return ret; } counter->usage += val; if (counter->usage > counter->max_usage) counter->max_usage = counter->usage; return ret; }

»» 继续阅读全文

memory.usage_in_bytes与rss内存统计不一致

最近线上发现一个问题。一个用户在做resize操作的时候失败了,resize的主要动作是将内存阈值从45G调整到50G,按理来说这个调整是可行的,但实际执行时出现了问题。执行器报错如下:

Cgroups: failed to write memory.excess_mode: 16: Device or resource busy

用户的解释说,通过top统计到container内的rss进程只使用了20G左右,并没有超过45G。但是我们看memory.usage_in_bytes的统计时,container内存已经达到了90G。为什么memory.usage_in_bytes和rss会不一致呢?

原因是因为,cgroup的memory在统计内存时,把page cache也统计进去了,而top看到的rss,是不包含page cache的。

»» 继续阅读全文

libprocess并发编程

libprocess是mesos中非常重要的一个基础库,提供一些很方便的helper函数以及并发编程所需要的基本原语,例如下面我将重点讲的future/promise。

为了更好的解释future/promise是什么,我抽取了一段mesos中的代码作为例子:

Future<Socket> PollSocketImpl::accept() { return io::poll(get(), io::READ) .then(lambda::bind(&internal::accept, get())); }

这个函数的基本作用是:使用io::poll()注册io::READ事件,并且当事件ready的时候,调用internal::accept()。

显然,这是一个异步的accept()方法。

»» 继续阅读全文

mesos单机资源隔离

Mesos Containerizer简单介绍

http://mesos.apache.org/documentation/latest/mesos-containerizer/

mesos默认的容器目前支持四种资源隔离,共享文件系统、namespaces、cgroups、posix、网络端口隔离

»» 继续阅读全文

mesos: Segfault in net::getIP

今天把mesos升级到0.22.1之后slave一起来就core了,打开debug调试了一下:

Program terminated with signal 11, Segmentation fault. #0 0x00007f639867c77e in free () from /lib64/libc.so.6 (gdb) bt #0 0x00007f639867c77e in free () from /lib64/libc.so.6 #1 0x00007f63986c25d0 in freeaddrinfo () from /lib64/libc.so.6 #2 0x00007f6399deeafa in net::getIP (hostname="<redacted>", family=2)   at ./3rdparty/stout/include/stout/net.hpp:201 #3 0x00007f6399e1f273 in process::initialize (delegate=Unhandled dwarf    expression opcode 0xf3) at src/process.cpp:837 #4 0x000000000042342f in main ()

»» 继续阅读全文