文章归档

cpuset子系统与cpu亲缘性设置sched_setaffinity

目前cpu亲缘性设置有两种方式:

  1. 通过sched_setaffinity()函数将进程绑定到某些cpu上运行
  2. 讲进程加入到cpuset控制组,通过修改cpuset.cpus参数来实现亲缘性设置

但是有一点需要注意的是,通过sched_setaffinity设置的cpu_mask不允许超出cpuset.cpus的范围,超出部分是无效的。

举例,进程A所在的cpuset控制组cpuset.cpus参数值是0,1,2,3,4,但是进程运行期间调用sched_setaffinity()修改cpu_mask为0,1,2,4,7。因为7并不在cpuset.cpus范围里,所以内核会把7忽略掉,最终进程只能在0,1,2,4这几个CPU上运行。

»» 继续阅读全文

linux多核调度负载均衡机制

多核调度要解决的两个基本问题是:

  1. 充分利用多核性能
  2. 节能

一个经典的多核体系架构如下:

  1. NUMA 架构,系统中有N个Node,每个Node访问系统中不同区域的内存有不同的速度
  2. 同时它又是一个 SMP 系统,一个Node由多个物理封装 (Physical Package) 构成,物理封装通常拥有独立的L3 cache
  3. 一个物理封装又由多个核心 (Core) 构成,即 Multi-core 技术或者叫 Chip-level Multi processor(CMP) ,每个核心独占L1 cache,共享L2 cache
  4. 一个核中又通过 SMT 之类的技术实现多个硬件线程,这就是top中看到的逻辑cpu,同一个核心中的cpu共享所有的 cache

»» 继续阅读全文

一种更快速的本地端口存活检测方法

本地端口存活检测通常有两种做法:

  1. netstat
  2. nmap & telnet

netstat的问题在于,它的原理是扫描整个/proc/net/tcp、/proc/net/tcp6文件,如果本机链接数非常多(不一定是正常的连接,也可能是异常连接,例如处于TIME_WAIT状态或者FIN状态)的情况下,/proc/net/tcp文件会非常大,扫描几个小时也扫不完,而且扫描/proc/net/tcp文件这个过程是属于内核态的,可能会hang住

另外nmap虽然是一个很成熟标准的端口存活检测机制,nmap的方式是通过连接端口来判断的,这种侵入式方法的问题在于,对于一些实现的不是很健壮的程序,可能会因此挂掉。

»» 继续阅读全文

pid namespaces销毁触发内核crash

最近在测试pid namespaces的过程中发现一个问题:就是当机器OOM的时候,杀掉了一个有pid namespace的进程,这个进程在回收的过程中,触发了内核crash

内核crash的地方是在回收进程pid的时候踩了空指针,内核版本是2.6.32

所以在低版本内核中,如果pid namespace使用不正确,可能会带来致命的稳定性问题

pid namespace是实现容器的基础技术之一,docker和lxc中都使用了pid namespace来为容器提供独立隔离的进程体系,实现容器之间的PID隔离,但是我看了一下docker和lxc的实现,实现方式很简单,在低版本内核上是极有可能触发这个bug的,我们来了解一下docker和lxc的进程隔离实现方案

关于pid namespace的实现原理,可以参考: Namespaces in operation, part 3: PID namespaces

»» 继续阅读全文

tc:linux流量控制

http://lartc.org

1. Simple, classless Queueing Disciplines 1.1 pfifo_fast

This queue is, as the name says, First In, First Out, which means that no packet receives special treatment. At least, not quite. This queue has 3 so called ’bands’. Within each band, FIFO rules apply. However, as long as there are packets waiting in band 0, band 1 won’t be processed. Same goes for band 1 and band 2.

The kernel honors the so called Type of Service flag of packets, and takes care to insert ’minimum delay’ packets in band 0.

Do not

»» 继续阅读全文

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 ()

»» 继续阅读全文

第 3 页,共 13 页12345...10...最旧 »