内核学习总结(三)

来源:互联网 发布:东方卫视网络电视直播 编辑:程序博客网 时间:2024/04/29 11:47

1.OOM-Killer

Linux 中的 Out Of Memory(OOM)Killer 功能作为确保内存的最终手段,可以在耗尽系统内存或交换区后,向进程发送信号,强制终止该进程。


进程的选定方法 :OOM Killer 在内存耗尽时,会查看所有进程,并分别为每个进程计算分数。将信号发送给分数最高的进程。

分数计算:1. 首先, 计算分数时是以进程的虚拟内存大小为基准的。 虚拟内存大小可以使用 ps 命令的 VSZ 或 /proc/<PID>/status 的 VmSize 来确认。对于正在消耗虚拟内存的进程, 其最初的得分较高。 单位是将 1KB 作为 1 个得分。 消耗 1GB 内存的进程, 得分约为 1 000 000。
2. 如果进程正在执行 swapoff 系统调用, 则得分设置为最大值(unsigned long 的最大值 ) 这是因为禁用 swap 的行为与消除内存不足是相反的, 会立刻将其作为 OOM。
Killer 的对象进程。
3. 如果是母进程,则将所有子进程内存大小的一半作为分数。
4. 根据进程的 CPU 使用时间和进程启动时间调整得分。 这是因为在这里认为越是长时间运行或从事越多工作的进程越重要,需保持得分较低。


2.RT Group Scheduling 与 RT Throttling

前面说了,实时进程的调度方案,比如是FIFO。如果这个进程是个死循环,而也没有办法跳转到其他的进程,那么有没有一种方法也能对实时的进程进行CPU的时间设置呢,必然是有的。

RT Group Scheduling 和 RT Throttling 功能是用来限制使用实时调度策略的进程的 CPU时间。

通过限制分配给实时进程的每个单位时间的 CPU 时间 , 就可以防止使用实时调度策略的进程出现 bug。还可以指定单位时间内分配多少 CPU 时间给实时进程。 标准设置的单位时间是 1 秒,CPU 分配时间是 0.95 秒,非实时进程每 1 秒也可以使用 CPU 0.05 秒。

root@sq:/home/sq# cat /proc/sys/kernel/sched_rt_runtime_us 
950000
root@sq:/home/sq# cat /proc/sys/kernel/sched_rt_period_us
1000000
整 个 系 统 的 CPU 时 间 设 置 可 以 使 用 sysctl 来 获 取、 设 置。那么要更改这些时间,则可以使用:

sysctl -w kernel.sched_rt_runtimes_us=900000。

一般来说,sysctl 中的设置仅用于有效( 启用 ) 与无效( 关闭 ) 的切换, 单个设置需要使用 Cgroup 来进行。

2-1 . 那么如何使用RT Group Scheduling 与 RT Throttling?

RT Group Scheduling 是 Cgroup 的 子 系 统。 要 使 用 RT Group Scheduling, 必 须 启 用      CONFIG_RT_GROUP_SCHED。 可以与其他 Cgroup 一样通过 cgroup 文件系统进行设置  。

只需要修改里面的cpu.rt_period_us 和cpu.rt_period_us文件。

2-2 在不同的cgroup组中分配不同CPU时间

首先的说下CFS:Fair Group Scheduling 是 Cgroup 的资源管理之一, 用来控制 Linux 内核的进程调度程序进行的 CPU 时间分配。 与其他 Cgroup 进行的资源管理一样, 可以对每个特定进程组进行资源(CPU 分配时间 ) 管理。 使用这个功能, 就可以在分组间对 CPU 分配时间进行调整。

在/cgroup中建立test1 和test2 ,然后这两个子系统中的CPU时间片都是50%,也就是说test1中的进程如果出现了死循环,那么系统的CPU也只有50%在用。那么如何指定不同的cgroup组占用不同的CPU呢,而不是平均分配。

那么这时候就需要修改 cpu.shares 这个文件。默认是1024.


3.cpuset的使用

cpuset: 其功能是指定特定进程或线程所使用的 CPU组,通俗点说吧,就是如何使用多核的CPU。

里面打交道的文件就是:cpuset.cpus  和tasks。 具体用法和cpu类似。


4.使用 Memory Cgroup 限制内存使用量

 mount -t cgroup -o memory cgroup /cgroup   和cpu cpuset等用法一致。 打交道的文件:memory.limit_in_bytes。

后面就很简单了,不再描述。


5.来复习下虚拟内存的管理:

在 Linux 中有规定 “ 允许超过物理内存量分配多少虚拟空间 ” 的参数 , 通过下列两个/proc 入口来进行控制。
• /proc/sys/vm/overcommit_memory
• /proc/sys/vm/overcommit_ratio

还记得怎么配置么?  这个是交换分区一起设置的,并且还有个参数  swapniess。












0 0
原创粉丝点击