1.容器,其实是一种特殊的进程而已指定了不同的namespace参数pid、mount、ipc、network、user)
2.容器中的程序使用settimeofday(2)系统调用修改了时间,整个宿主机的时间就都会被随之修改。
3.cgroup可以限制进程使用的资源 (/sys/fs/cgroup/)
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/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
输出的结果是一系列文件系统目录。
在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。
memory,为进程设定内存使用的限制
cpuset,为进程分配单独的 CPU 核和对应的内存节点
blkio,为块设备设定I/O 限制,一般用于磁盘等设备
这些都是我这台机器当前可以被 Cgroups 进行限制的资源种类。以cpu子系统为例
ls /sys/fs/cgroup/cpu
cgroup.clone_children cgroup.sane_behavior cpuacct.usage cpu.cfs_quota_us cpu.shares notify_on_release tasks
cgroup.event_control container cpuacct.usage_percpu cpu.rt_period_us cpu.stat release_agent user.slice
cgroup.procs cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us docker system.slice
cfs_period和cfs_quota限制进程在长度为 cfs_period 的一段时间内,只能被分配到总量为 cfs_quota 的 CPU 时间.
tasks是添加被限制的进程pid的文件
cgroup就是一个子系统目录加上一组资源限制文件的组合。duiyu对于docker等linux容器项目来说,他们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后启动容器进程之后,把这个进程的pid填写到对应的控制住tasks文件就行了。
4.容器是一个“单进程”模型。
由于一个容器的本质就是一个进程,用户的应用进程实际上就是容器里 PID=1 的进程,也是其他后续创建的所有进程的父进程。这就意味着,在一个容器中,你没办法同时运行两个不同的应用,除非你能事先找到一个公共的 PID=1 的程序来充当两个不同的应用,会用 systemd 或者 supervisord 这样的软件来代替应用本身作为容器的启动进程。
网友评论