Docker基础: Linux内核之Cgroups(1)
2016-09-19 21:01
567 查看
作为开源Container技术代表的Docker,它跟Linux内核的Namespace和Cgroup两大特性密不可分。物有本末,事有终始。知所先后,则近道矣。理解Linux的这两大特性将有助于我们更深入的理解Docker。
在本文中我们将会简要介绍一下Cgroups是什么。
答案千千万万,最为容易被人所接受的是钱的原因。企业级用户掏出大把的银子进行投资,而架构和设计也必须服从经济规律给他们计算ROI等,花的钱多长时间才能收回来,花这分钱相当于省多少钱,比如你有一台强大的UNIX小机,平时大部分时候CPU/存储/IO/内存等都是在闲置的状态,但是你如果整个center的机器都是在20%左右的水线上运转,就如同你有一条10车道宽的马路只用2车道一样,那是对客户投资的一种浪费。
怎样更为简单有效合理地利用资源,一直是IT最为核心的内容之一。这个问题其实很简单,Resouce有富余,用就可以了麽。怎么用?把一台资源剩余的物理机进行切分,用到不富余就可以了。其实这里面就有隔离和控制。先说隔离,再想想虚拟机运行起来是什么样的呢,虽然在一台机器上,但是相互之间不影响,这就是隔离的效果之一。在说控制,同时可以设定某台机器使用多余的多少Resource,比如某个container中使用多少CPU/多少内存。在HPE的IVM这款产品中,只需要简单的”hpvmmodify -P 虚拟机名称 -c cpu个数”就可以指定在HPUX上跑起来的VM使用几个CPU了,其他产品也是一样简单易用。但是虚拟机太重,好用的除了virtualbox基本上都是收费的,而且价格不菲,同时没有统一标准,Docker针对这几个特点,开源免费/社区驱动/统一标准/轻量快捷等特点,快速征服了众多开发者。
当然这只是Cgroups中的一个作用–limit(限制),限制CPU/内存/IO/网络等的使用量。除此之外还可以进行使用的统计等操作,这在云服务提供时时不可或缺的功能。
命令:yum install libcgroup
接下来我们将会在CentOS上使用cg相关命令进行Resource资源控制的模拟从而更加直观地理解到cgroups对资源如何进行控制的。
在本文中我们将会简要介绍一下Cgroups是什么。
Cgroups的历史
Cgroups是Control Groups的缩写, 它是Linux 内核的一个特征,在2.6.24被引入. Cgroups用于提供对Linux的进程组进行资源上的限制/统计/隔离等操作的这样一种功能.时间 | 具体发展 |
---|---|
2006 | Google的工程师(Paul Menage and Rohit Seth等)发起的Process containers |
2007 | 由于术语container容易引起理解上的混乱,改名为Control Groups |
2007 | 合并入Linux内核2.6.24 |
2007以后 | 诸如防火墙的支持,hierarchy的引入等不断完善和增强功能 |
Why Cgroups
我们在说LXC构建在Linux的Namesapce和Cgroups之上,而且在前面的一些文章中我们也简单使用unshare去模拟了六种隔离的情况,了解到隔离能给我们带来的便利。但是为什么还要Cgroups呢,而且Cgroups也提到了对进程组的隔离,它们是重复的功能特性麽?抱着这些问题我们需要首先再问:Why Cgroups?它的应用场景在哪儿?答案千千万万,最为容易被人所接受的是钱的原因。企业级用户掏出大把的银子进行投资,而架构和设计也必须服从经济规律给他们计算ROI等,花的钱多长时间才能收回来,花这分钱相当于省多少钱,比如你有一台强大的UNIX小机,平时大部分时候CPU/存储/IO/内存等都是在闲置的状态,但是你如果整个center的机器都是在20%左右的水线上运转,就如同你有一条10车道宽的马路只用2车道一样,那是对客户投资的一种浪费。
怎样更为简单有效合理地利用资源,一直是IT最为核心的内容之一。这个问题其实很简单,Resouce有富余,用就可以了麽。怎么用?把一台资源剩余的物理机进行切分,用到不富余就可以了。其实这里面就有隔离和控制。先说隔离,再想想虚拟机运行起来是什么样的呢,虽然在一台机器上,但是相互之间不影响,这就是隔离的效果之一。在说控制,同时可以设定某台机器使用多余的多少Resource,比如某个container中使用多少CPU/多少内存。在HPE的IVM这款产品中,只需要简单的”hpvmmodify -P 虚拟机名称 -c cpu个数”就可以指定在HPUX上跑起来的VM使用几个CPU了,其他产品也是一样简单易用。但是虚拟机太重,好用的除了virtualbox基本上都是收费的,而且价格不菲,同时没有统一标准,Docker针对这几个特点,开源免费/社区驱动/统一标准/轻量快捷等特点,快速征服了众多开发者。
当然这只是Cgroups中的一个作用–limit(限制),限制CPU/内存/IO/网络等的使用量。除此之外还可以进行使用的统计等操作,这在云服务提供时时不可或缺的功能。
SubSystem详细
Subsystem即为Cgroups所能控制的Resource,主要的Subsystem如下所示。项番 | Subsystem | 说明 |
---|---|---|
No.1 | Cpusets | 限制分配CPU |
No.2 | cpuacct | 统计CPU使用报告 |
No.3 | memory | 限制内存使用量 |
No.4 | blkio | 限制磁盘/USB等物理设备 |
No.5 | net_cls | 控制网络数据包 |
No.6 | freezer | 挂起或者恢复进程 |
No.7 | devices | 设备访问控制 |
Centos版本
虽然Cgroups是Linux内核,但是不同的发型版在使用上还有细小的区别。由于RHEL或者CentOS使用Systemd进行服务的管理,而Systemd本身就是使用了Cgroups的特性,所以我们将会使用CentOS来简单介绍一下Cgroups的使用。[root@liumiaocn ~]# uname -a Linux liumiaocn 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux [root@liumiaocn ~]#
事前准备
CentOS上为了支持cgroups,需要安装libcgroups,不同的linux发型版稍有不同,CentOS下可以使用如下进行安装。不过default一般都是会安装。命令:yum install libcgroup
Subsystem确认
CentOS中将所有Cgroup的subsystem挂载到/sys/fs/cgroup目录下。使用mount命令可以进行确认[root@liumiaocn ~]# mount -t cgroup cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio) cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer) cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu) cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory) cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event) [root@liumiaocn ~]#
systemd进程确认
systemd根传统的init同样进行服务的管理,详细的说明会另行说明。从下面的ps结果可以看到systemd的进程PID是1,同时在mount -t cgroup中也提示了/sys/fs/cgroup/systemd[root@liumiaocn ~]# ps -ef |grep systemd |grep -v grep root 1 0 0 20:25 ? 00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 761 1 0 20:25 ? 00:00:00 /usr/lib/systemd/systemd-journald root 801 1 0 20:25 ? 00:00:00 /usr/lib/systemd/systemd-udevd root 1100 1 0 20:26 ? 00:00:00 /usr/lib/systemd/systemd-logind dbus 1107 1 0 20:26 ? 00:00:00 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation [root@liumiaocn ~]#
systemd的cgroup控制
systemd的cgroups控制层级可以通过systemctl status进行简单确认,同时上下文也能清晰地看到systemd是使用了cgroups进行控制的。[root@liumiaocn ~]# systemctl status ● liumiaocn State: running Jobs: 0 queued Failed: 0 units Since: Mon 2016-09-19 20:25:55 CST; 13min ago CGroup: / tq1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 tquser.slice x tquser-0.slice x x mqsession-4.scope x x tq3809 sshd: root@pts/1 x x tq3816 -bash x x tq4023 systemctl status x x mq4024 systemctl status x mquser-1000.slice x mqsession-1.scope x tq2227 gdm-session-worker [pam/gdm-password] x tq2252 /usr/bin/gnome-keyring-daemon --daemonize --login x tq2313 gnome-session --session gnome-classic x tq2320 dbus-launch --sh-syntax --exit-with-session x tq2321 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session x tq2386 /usr/libexec/gvfsd x tq2390 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes x tq2467 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic" x tq2495 /usr/libexec/at-spi-bus-launcher x tq2499 /bin/dbus-daemon --config-file=/etc/at-spi2/accessibility.conf --nofork --print-address 3 x tq2503 /usr/libexec/at-spi2-registryd --use-gnome-session x tq2521 /usr/libexec/gnome-settings-daemon x tq2533 /usr/bin/pulseaudio --start --log-target=syslog x tq2557 /usr/libexec/gsd-printer x tq2586 /usr/bin/gnome-shell x tq2625 ibus-daemon --xim --panel disable x tq2629 /usr/libexec/ibus-dconf x tq2632 /usr/libexec/ibus-x11 --kill-daemon x tq2639 /usr/libexec/gnome-shell-calendar-server x tq2647 /usr/libexec/mission-control-5 x tq2648 /usr/libexec/evolution-source-registry x tq2652 /usr/libexec/caribou x tq2655 /usr/libexec/goa-daemon x tq2665 /usr/libexec/dconf-service x tq2671 /usr/libexec/goa-identity-service x tq2703 /usr/libexec/gvfs-udisks2-volume-monitor x tq2716 /usr/libexec/gvfs-gphoto2-volume-monitor x tq2723 /usr/libexec/gvfs-mtp-volume-monitor x tq2729 /usr/libexec/gvfs-goa-volume-monitor x tq2735 /usr/libexec/gvfs-afc-volume-monitor x tq2768 nautilus --no-default-window --force-desktop x tq2773 abrt-applet x tq2777 /usr/bin/vmtoolsd -n vmusr x tq2779 /usr/libexec/tracker-miner-apps x tq2782 /usr/libexec/tracker-miner-fs x tq2788 /usr/libexec/tracker-extract x tq2789 /usr/libexec/evolution/3.12/evolution-alarm-notify x tq2790 ./escd --key_Inserted="/usr/bin/esc" --on_Signal="/usr/bin/esc" x tq2793 /usr/libexec/tracker-miner-user-guides x tq2798 /usr/libexec/tracker-store x tq2802 /usr/bin/gnome-software --gapplication-service x tq2814 /usr/bin/seapplet x tq2907 /usr/libexec/gconfd-2 x tq2920 /usr/libexec/ibus-engine-simple x tq2922 /usr/libexec/gvfsd-trash --spawner :1.3 /org/gtk/gvfs/exec_spaw/0 x tq2954 /usr/libexec/gvfsd-metadata x tq2997 /usr/libexec/evolution-calendar-factory x tq3008 /usr/libexec/gvfsd-burn --spawner :1.3 /org/gtk/gvfs/exec_spaw/1 x tq3101 /usr/libexec/gnome-terminal-server x tq3104 gnome-pty-helper x tq3105 /bin/bash x tq3455 su - x mq3462 -bash mqsystem.slice tqbluetooth.service x mq2546 /usr/libexec/bluetooth/bluetoothd tqudisks2.service x mq2089 /usr/lib/udisks2/udisksd --no-debug tqpackagekit.service x mq2048 /usr/libexec/packagekitd tqpcscd.service x mq1983 /usr/sbin/pcscd --foreground --auto-exit tqcolord.service x mq1979 /usr/libexec/colord tqupower.service x mq1964 /usr/libexec/upowerd tqatd.service x mq1750 /usr/sbin/atd -f tqcrond.service x mq1749 /usr/sbin/crond -n tqgdm.service x tq1748 /usr/sbin/gdm x mq1822 /usr/bin/Xorg :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-oZOCVv/database -seat seat0 -nolisten tcp vt1 tqlibvirtd.service x tq1745 /usr/sbin/libvirtd x tq1857 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper x mq1858 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper tqsshd.service x mq1742 /usr/sbin/sshd -D tqtuned.service x mq1740 /usr/bin/python -Es /usr/sbin/tuned -l -P tqcups.service x mq1739 /usr/sbin/cupsd -f tqwpa_supplicant.service x mq1423 /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant. tqNetworkManager.service x mq1275 /usr/sbin/NetworkManager --no-daemon tqksmtuned.service x tq1155 /bin/bash /usr/sbin/ksmtuned x mq4017 sleep 60 tqpolkit.service x mq1147 /usr/lib/polkit-1/polkitd --no-debug tqModemManager.service x mq1143 /usr/sbin/ModemManager tqrsyslog.service x mq1142 /usr/sbin/rsyslogd -n tqabrt-xorg.service x mq1137 /usr/bin/abrt-watch-log -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD tqabrt-oops.service x mq1136 /usr/bin/abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detected ernel BUG at list_del corruption list_add corruption do_IRQ: st tqabrtd.service x mq1129 /usr/sbin/abrtd -d -s tqrtkit-daemon.service x mq1128 /usr/libexec/rtkit-daemon tqvmtoolsd.service x mq1127 /usr/bin/vmtoolsd tqsmartd.service x mq1121 /usr/sbin/smartd -n -q never tqlibstoragemgmt.service x mq1119 /usr/bin/lsmd -d tqavahi-daemon.service x tq1118 avahi-daemon: running [mgsrv1.local x mq1120 avahi-daemon: chroot helpe tqaccounts-daemon.service x mq1117 /usr/libexec/accounts-daemon tqdbus.service x mq1107 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation tqfirewalld.service x mq1106 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid tqirqbalance.service x mq1104 /usr/sbin/irqbalance --foreground tqrngd.service x mq1101 /sbin/rngd -f tqsystemd-logind.service x mq1100 /usr/lib/systemd/systemd-logind tqgssproxy.service x mq1110 /usr/sbin/gssproxy -D tqalsa-state.service x mq1097 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon tqauditd.service x tq1075 /sbin/auditd -n x tq1092 /sbin/audispd x mq1102 /usr/sbin/sedispatch tqsystemd-udevd.service x mq801 /usr/lib/systemd/systemd-udevd tqlvm2-lvmetad.service x mq784 /usr/sbin/lvmetad -f mqsystemd-journald.service mq761 /usr/lib/systemd/systemd-journald [root@liumiaocn ~]#
接下来我们将会在CentOS上使用cg相关命令进行Resource资源控制的模拟从而更加直观地理解到cgroups对资源如何进行控制的。
其他相关
内容 | URL |
---|---|
在CentOS7上使用LXC管理容器 | http://blog.csdn.net/liumiaocn/article/details/52348219 |
如何使用RHEL/CentOS 7安装创建和管理LXC (Linux Containers) | http://blog.csdn.net/liumiaocn/article/details/52337479 |
Docker基础: Linux内核命名空间之(1) mnt namespace | http://blog.csdn.net/liumiaocn/article/details/52549196 |
参考内容 | https://www.kernel.org/doc/Documentation/cgroup-v1/ |
相关文章推荐
- Docker基础: Linux内核之Cgroups(2)
- Docker 基础技术之 Linux cgroups 详解
- Linux系统内核编译基础
- linux基础(十二)内核学习及编译
- linux内核开发基础学习笔记
- Linux内核基础
- Linux设备驱动程序——内存和I/O基础知识学习:(1)内核中相关基础知识学习
- Linux内核管理基础知识概述
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- Linux内核驱动基础(一)常用宏定义
- linux内核开发基础学习笔记
- 在双机调试linux3.2内核的基础上源码调试编写的内核模块
- linux 学习- 编程基础之内核配置与编译
- Linux操作系统基础知识之七:内核中的同步
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- Linux从用户层到内核层系列 - TCP/IP协议栈部分系列7: 基础知识之 - Linux内核源码目录与内核编译选项
- 并发基础 -- Linux 内核同步机制
- Linux基础知识:内核编译-内核管理概述
- 深入浅出linux之内核基础层
- Linux内核基础