zoukankan      html  css  js  c++  java
  • 调度-资源隔离

    我们如何让计算任务的进程能受限制的使用机器资源呢,这里不仅指占用某台机器的粗粒度使用,也指对某台机器的CPU/内存/带宽/硬盘的细粒度限制。

    资源限制和资源控制看上去差不多,但是我们接下来会发现他们的区别。

    资源调度有两种解决方案:限制方式和控制方式。

    所谓限制方式,也就是有个虚拟的容器限制,进程无法使用更多的资源。

    Lxc、Cgroup的实现是一种限制方式,通过虚拟化或者轻量级虚拟化限制资源的使用,后面7.4.2谈到的Mesos也是这种方式。

    Cgroup是Linux内核提供的一个操作系统层面的资源控制组,通过对进程组(process groups)的资源进行分配和使用限制达到目的。该项技术最初也是Google工程师发明,目前成为lxc(轻量级虚拟化容器)的重要组成技术。

    Cgroup提供了对进程组可以使用的资源数量限制、优先级控制、进程组使用的资源数量记录(进程组使用的CPU时间)、进程组隔离、进程组挂起和恢复等功能。

    Cgroup的一些主要子系统如下:

    ❏ Blkio:这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘、固态硬盘、USB等等)。

    ❏ Cpu:这个子系统使用调度程序提供对CPU的Cgroup任务访问。

    ❏ Cpuacct:这个子系统自动生成Cgroup中任务所使用的CPU报告。

    ❏ Cpuset:这个子系统为Cgroup中的任务分配独立CPU(在多核系统)和内存节点。

    ❏ Devices:这个子系统可允许或者拒绝Cgroup中的任务访问设备。

    ❏ Freezer:这个子系统挂起或者恢复Cgroup中的任务。

    ❏ memory:这个子系统设定Cgroup中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。

    ❏ net_cls:这个子系统使用等级识别符(Classid)标记网络数据包,可允许Linux流量控制程序(tc)识别从具体Cgroup中生成的数据包。

    ❏ Ns:名称空间子系统。

    ❏ Cgroup启动是通过Cgconfig完成的:

    #/etc/init.d/cgconfig start
    #/etc/init.d/cgconfig stop

    显示已经存在的子系统:

    cpu /cgroup/cpu

    创建一个新的Cgroup:

    cgcreate -g cpu,net_cls:/mygroup

    通过cgclassify命令将进程移到Cgroup中:

    cgclassify -g cpu,memory:group1 1701

    或者通过cgexec命令在Cgroup中启动进程:

    cgexec -g cpu:group1 lynx 

    Cgroup详细的使用可参见Linux官方文档http://www.redhat.com。

    另一种是控制方式,进程实际上可以用更多的资源,但是我们通过监控的手段,根据资源使用状况,控制住进程的启动。

    通过JVM或者其他系统监控API,对CPU内存使用情况进行获取并控制,早期的Hadoop对内存的控制也是该方式。

    Java的MemoryPoolMXBean机制可以很好地设置使用内存的阀值,并在内存不足时进行事件通知,并将任务分配到其他Java虚拟机,然后停止接受任务,内存足够后再重新恢复接收任务。这个机制是可以用来实现内存隔离的(不能像Cgroup那样隔离,但是可以做到控制)。另外,OperatingSystemMXBean机制可以支持线程和Java虚拟机进行CPU时间检测(包括用户CUP时间和系统CPU时间),通过CPU检测可以对占用率高的时刻停止接收任务。

    遗憾的是,Java本身对系统层面的监控力度支持还是不太理想,没有太好的做法。很多老外推荐使用开源软件Sigar(System Information Gatherer And Reporter)来弥补Java本身在这块的不足,Sigar提供了跨平台的系统信息收集的API,包括:

    ❏ CPU信息,包括基本信息(vendor、model、mhz、cacheSize)和统计信息(user、sys、idle、nice、wait)。

    ❏ 文件系统信息,包括Filesystem、Size、Used、Avail、Use%、Type。

    ❏ 事件信息,类似Service Control Manager。

    ❏ 内存信息,物理内存和交换内存的总数、使用数、剩余数;RAM的大小。

    ❏ 网络信息,包括网络接口信息和网络路由信息。

    ❏ 进程信息,包括每个进程的内存、CPU占用数、状态、参数、句柄。

    ❏ IO信息,包括IO的状态,读写大小等。

    ❏ 服务状态信息。

    ❏ 系统信息,包括操作系统版本,系统资源限制情况,系统运行时间以及负载,Java的版本信息等。

  • 相关阅读:
    数据库连接池的最小连接为什么是Idle语义
    mybatis多个参数不加@Param
    uboot中使用延迟函数
    uboot中linker list数据结构
    Linux内核启动流程
    安卓系统出现时间强制设置为固件编译时间的问题
    MMC/SD卡介绍
    蓝牙博文记录
    混合编程杂谈
    转载:互联网协议入门
  • 原文地址:https://www.cnblogs.com/muzinan110/p/11052064.html
Copyright © 2011-2022 走看看