文章归档

Namespaces系列1:PID namespace

1. 简介

The global resource isolated by PID namespaces is the process ID number space. This means that processes in different PID namespaces can have the same process ID.

As with processes on a traditional Linux (or UNIX) system, the process IDs within a PID namespace are unique, and are assigned sequentially starting with PID 1. Likewise, as on a traditional Linux system, PID 1—the init process—is special: it is the first process created within the namespace, and it performs certain management tasks within the namespace.

PID隔离最主要的两个目的是:

  1. 为容器提供安全的进程操作
  2. »» 继续阅读全文

Intel Cache Allocation Technology: CPU LLC Isolate

LLC是指Last Level cache,目前来说通常也就是L3 Cache,CAT是指Intel架构提供的一组工具&技术,用以支持LLC隔离。隔离的目的是针对Latency sensitive服务程序,提高QoS。可以考虑到两个LS敏感的程序跑在同一个机器上相互影响的程度还是比较大。

相关的一些资料如下:

  1. x86: Intel Cache Allocation Technology support
  2. Intel® 64 and IA-32 Architectures Software Developer Manuals 其中的 17.16 PLATFORM SHARED RESOURCE CONTROL: CACHE ALLOCATION TECHNOLOGY

»» 继续阅读全文

linux内核调度:cfs(Completely Fair Scheduler) 的简单原理

cfs为完全公平调度提供了一种统一的抽象:虚拟时钟vruntime

不关心进程是否sleep,不关心是否为交互式进程,它只基于虚拟时钟,通过一棵RB树维护所有的进程。RB树的key就是进程的虚拟运行时间。

cfs提供了一种可扩展的进程调度架构,实现了机制和策略的分离

因为真实的硬件上同一时刻只能允许一个任务在运行,所以为了模拟并行,需要引入一个虚拟时钟的概念。虚拟时钟将进程睡眠补偿,优先级,权限等各种参数映射到同一维度。

»» 继续阅读全文

memory.force_empty清空cgroup内存

linux-2.6.32.68

memory.force_empty这个参数的最主要作用就是触发cgroup内存回收。但是有两种方式:

  1. root用户通过echo 1 > memory.force_empty 强制回收内存
  2. memory cgroup被删除时,会将当前计数charge到parent cgroup。(可能会触发parent cgroup的内存回收)

对应内核的函数是

/* * make mem_cgroup's charge to be 0 if there is no task. * This enables deleting this mem_cgroup. */ static int mem_cgroup_force_empty(struct mem_cgroup *mem, bool free_all)

这个函数的使用有两个基本的前提条件:

  1. 当前cgroup里不允许有任何进程
  2. 不存在子cgroup

因为mem_cgroup_force_empty()函数的实现里多处使用如下判断:

    if (cgroup_task_count(cgrp) || !list_empty(&cgrp->children))         goto out;

dentry缓存

最近追查某线上服务发现一个问题:频繁的创建&删除目录或者文件,会消耗大量的物理内存。

原因是因为,目录或者文件删除后,dentry并没有立即释放,而是保存在了superblock上的lru链表上。通常只有内核认为内存紧张的时候才会回收此部分内存。

不过由于dentry结构非常小,这种case下内存增长是很慢。

Active / Total Objects (% used) : 740781 / 764463 (96.9%) Active / Total Slabs (% used) : 31522 / 31522 (100.0%) Active / Total Caches (% used) : 74 / 101 (73.3%) Active / Total Size (% used) : 144439.65K / 148432.28K (97.3%) Minimum / Average / Maximum Object : 0.01K / 0.19K / 8.00K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 460278 460278 100% 0.19K 21918 21 87672K dentry 91416 81993 89% 0.10K 2344 39 9376K buffer_head 30660 29625 96% 0.19K 1460 21 5840K

»» 继续阅读全文

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

»» 继续阅读全文

第 2 页,共 5 页12345