当前位置: 首页 > news >正文

北京公司网站建设定制seo点击排名源码

北京公司网站建设定制,seo点击排名源码,商城网站怎么做,wordpress 如何登陆地址Docker Cgroups——Docker 资源限制背后的技术原理虽然在容器内部进程只能看到“掩饰”过的视图,但是在宿主机上,它就是一个普通的进程,与其他所有进程之间是平等竞争的关系。这就意味着虽然表面上被隔离了,但它实际上在与其他进程…

Docker Cgroups——Docker 资源限制背后的技术原理

虽然在容器内部进程只能看到“掩饰”过的视图,但是在宿主机上,它就是一个普通的进程,与其他所有进程之间是平等竞争的关系。这就意味着虽然表面上被隔离了,但它实际上在与其他进程共享资源。

Cgroups(控制组) 是 Linux 内核的另一个特性,全称叫 Linux Control Group,用来限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等资源。Cgroups 还可以对进程进行优先级设置、审计。

在 Linux 中,Cgroups 以文件和目录的方式组织在 /sys/fs/cgroup 路径下。

$ ll /sys/fs/cgroup/
total 0
drwxr-xr-x 15 root root 380 May  3 14:50 ./
drwxr-xr-x  9 root root   0 May  3 20:29 ../
dr-xr-xr-x  5 root root   0 May  3 14:50 blkio/
lrwxrwxrwx  1 root root  11 May  3 14:50 cpu -> cpu,cpuacct/
dr-xr-xr-x  5 root root   0 May  3 14:50 cpu,cpuacct/
lrwxrwxrwx  1 root root  11 May  3 14:50 cpuacct -> cpu,cpuacct/
dr-xr-xr-x  3 root root   0 May  3 14:50 cpuset/
dr-xr-xr-x  5 root root   0 May  3 14:50 devices/
dr-xr-xr-x  3 root root   0 May  3 14:50 freezer/
dr-xr-xr-x  3 root root   0 May  3 14:50 hugetlb/
dr-xr-xr-x  5 root root   0 May  3 14:50 memory/
lrwxrwxrwx  1 root root  16 May  3 14:50 net_cls -> net_cls,net_prio/
dr-xr-xr-x  3 root root   0 May  3 14:50 net_cls,net_prio/
lrwxrwxrwx  1 root root  16 May  3 14:50 net_prio -> net_cls,net_prio/
dr-xr-xr-x  3 root root   0 May  3 14:50 perf_event/
dr-xr-xr-x  5 root root   0 May  3 14:50 pids/
dr-xr-xr-x  2 root root   0 May  3 14:50 rdma/
dr-xr-xr-x  6 root root   0 May  3 14:50 systemd/
dr-xr-xr-x  5 root root   0 May  3 14:50 unified/

这个路径下的子目录,都是这台机器可以被 Cgroups 限制的资源种类,也叫子系统。

$ ll /sys/fs/cgroup/cpu,cpuacct/
total 0
dr-xr-xr-x  5 root root   0 May  3 20:30 ./
drwxr-xr-x 15 root root 380 May  3 14:50 ../
-rw-r--r--  1 root root   0 May  3 20:38 cgroup.clone_children
-rw-r--r--  1 root root   0 May  3 20:38 cgroup.procs
-r--r--r--  1 root root   0 May  3 20:38 cgroup.sane_behavior
-rw-r--r--  1 root root   0 May  3 15:04 cpu.cfs_period_us
-rw-r--r--  1 root root   0 May  3 15:04 cpu.cfs_quota_us
-rw-r--r--  1 root root   0 May  3 15:04 cpu.shares
-r--r--r--  1 root root   0 May  3 20:38 cpu.stat
-r--r--r--  1 root root   0 May  3 20:38 cpuacct.stat
-rw-r--r--  1 root root   0 May  3 20:38 cpuacct.usage
-r--r--r--  1 root root   0 May  3 20:38 cpuacct.usage_all
-r--r--r--  1 root root   0 May  3 20:38 cpuacct.usage_percpu
-r--r--r--  1 root root   0 May  3 20:38 cpuacct.usage_percpu_sys
-r--r--r--  1 root root   0 May  3 20:38 cpuacct.usage_percpu_user
-r--r--r--  1 root root   0 May  3 20:38 cpuacct.usage_sys
-r--r--r--  1 root root   0 May  3 20:38 cpuacct.usage_user
drwxr-xr-x  2 root root   0 May  3 15:04 docker/
-rw-r--r--  1 root root   0 May  3 20:38 notify_on_release
-rw-r--r--  1 root root   0 May  3 20:38 release_agent
drwxr-xr-x 88 root root   0 May  3 15:03 system.slice/
-rw-r--r--  1 root root   0 May  3 20:38 tasks
drwxr-xr-x  4 root root   0 May  3 20:38 user.slice/

大多数都是文件,里面保存着一些配置参数。

$ cat /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us
100000
$ cat /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us
-1

我们首先来构建一个跑 Python 死循环脚本的容器镜像:

Dockerfile 如下:

FROM python:3.6.8-alpine3.9
RUN echo -e "while True:\n    pass" > app.py
CMD ["python3", "app.py"]

这个脚本为了吃满 CPU。

接下来直接构建一个 Docker 镜像:

$ docker build -t cgroups_test:latest .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM python:3.6.8-alpine3.9
3.6.8-alpine3.9: Pulling from library/python
bdf0201b3a05: Pull complete
59c926705abf: Pull complete
dd4853571cc7: Pull complete
3a45eb710779: Pull complete
f4700a9d59e5: Pull complete
Digest: sha256:54b604a4f1937b370d2daf2344594dbd76305048b705ca786cd467125f36759d
Status: Downloaded newer image for python:3.6.8-alpine3.9---> ed8897654bd1
Step 2/3 : RUN echo -e "while True:\n    pass" > app.py---> Running in fbd12ca97a57
Removing intermediate container fbd12ca97a57---> d1e64aa6624f
Step 3/3 : CMD ["python3", "app.py"]---> Running in b5834c5ef957
Removing intermediate container b5834c5ef957---> a76fa98dd418
Successfully built a76fa98dd418
Successfully tagged cgroups_test:latest
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cgroups_test        latest              a76fa98dd418        3 minutes ago       79.1MB
python              3.6.8-alpine3.9     ed8897654bd1        8 days ago          79.1MB

直接启动容器:

$ docker run -d cgroups_test
$ top
top - 22:20:15 up  5:35,  2 users,  load average: 0.72, 0.24, 0.09
Tasks: 172 total,   2 running, 132 sleeping,   0 stopped,   0 zombie
%Cpu(s): 50.2 us,  0.3 sy,  0.0 ni, 49.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4034008 total,  2943452 free,   439008 used,   651548 buff/cache
KiB Swap:  2097148 total,  2095100 free,     2048 used.  3355620 avail MemPID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
29223 root      20   0    7916   7184   2876 R  99.7  0.2   1:12.09 python3

python3(容器进程) 对 CPU 的占用率已经接近百分百了。。。

docker ps看一下容器的 ID:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
9226c3249105        cgroups_test        "python3 app.py"    8 minutes ago       Up 3 minutes                            reverent_euclid
$ docker inspect --format="{{.Id}}" reverent_euclid
9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2

得到完整的 container ID:9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2

然后查看 /sys/fs/cgroup/cpu,cpuacct/docker/ 路径

ll /sys/fs/cgroup/cpu,cpuacct/docker/
total 0
drwxr-xr-x 3 root root 0 May  3 22:24 ./
dr-xr-xr-x 5 root root 0 May  3 20:30 ../
drwxr-xr-x 2 root root 0 May  3 22:24 9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2/
-rw-r--r-- 1 root root 0 May  3 22:25 cgroup.clone_children
-rw-r--r-- 1 root root 0 May  3 22:25 cgroup.procs
-rw-r--r-- 1 root root 0 May  3 22:25 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 May  3 22:25 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 May  3 22:25 cpu.shares
-r--r--r-- 1 root root 0 May  3 22:25 cpu.stat
-r--r--r-- 1 root root 0 May  3 22:25 cpuacct.stat
-rw-r--r-- 1 root root 0 May  3 22:25 cpuacct.usage
-r--r--r-- 1 root root 0 May  3 22:25 cpuacct.usage_all
-r--r--r-- 1 root root 0 May  3 22:25 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 May  3 22:25 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 May  3 22:25 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 May  3 22:25 cpuacct.usage_sys
-r--r--r-- 1 root root 0 May  3 22:25 cpuacct.usage_user
-rw-r--r-- 1 root root 0 May  3 22:25 notify_on_release
-rw-r--r-- 1 root root 0 May  3 22:25 tasks

看到 docker 路径下多了一个 9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2 子目录,就是正在运行的容器的 ID。

$ ll /sys/fs/cgroup/cpu,cpuacct/docker/9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2/
total 0
drwxr-xr-x 2 root root 0 May  3 22:27 ./
drwxr-xr-x 3 root root 0 May  3 22:24 ../
-rw-r--r-- 1 root root 0 May  3 22:27 cgroup.clone_children
-rw-r--r-- 1 root root 0 May  3 22:24 cgroup.procs
-rw-r--r-- 1 root root 0 May  3 22:27 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 May  3 22:27 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 May  3 22:27 cpu.shares
-r--r--r-- 1 root root 0 May  3 22:27 cpu.stat
-r--r--r-- 1 root root 0 May  3 22:27 cpuacct.stat
-rw-r--r-- 1 root root 0 May  3 22:27 cpuacct.usage
-r--r--r-- 1 root root 0 May  3 22:27 cpuacct.usage_all
-r--r--r-- 1 root root 0 May  3 22:27 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 May  3 22:27 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 May  3 22:27 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 May  3 22:27 cpuacct.usage_sys
-r--r--r-- 1 root root 0 May  3 22:27 cpuacct.usage_user
-rw-r--r-- 1 root root 0 May  3 22:27 notify_on_release
-rw-r--r-- 1 root root 0 May  3 22:27 tasks

这里都是9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2 控制组 CPU 资源的配置。

$ cat /sys/fs/cgroup/cpu,cpuacct/docker/9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2/cpu.cfs_period_us
100000
$ cat /sys/fs/cgroup/cpu,cpuacct/docker/9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2/cpu.cfs_quota_us
-1

可以看到 9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2 控制组 CPU 周期是默认的 100ms,而 CPU 配额没有任何限制,所以 python3 进程直接就吃满了整个 CPU。

接下来我们这样修改文件内容:

$ echo 20000 > /sys/fs/cgroup/cpu,cpuacct/docker/9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2/cpu.cfs_quota_us

代表在每 100ms 的时间里,被 9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2 控制组限制的进程只能使用 20ms 的 CPU 时间,也就是这个进程最多只能使用 20% 的 CPU 带宽。

我们来看一下 tasks 文件:

cat /sys/fs/cgroup/cpu,cpuacct/docker/9226c3249105f42d04b433baa134af9bb10891de2df72fe2edfc6f2bb0a41fb2/tasks
29223

如果对数字敏感的话,马上就可以发现这个数字就是容器进程 python3 的 PID!

现在我们 top 看一下进程对 CPU 资源的占用:

$ top
top - 22:58:05 up  6:13,  2 users,  load average: 0.41, 0.84, 0.90
Tasks: 173 total,   2 running, 132 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.6 us,  0.3 sy,  0.0 ni, 89.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4034008 total,  2968868 free,   412624 used,   652516 buff/cache
KiB Swap:  2097148 total,  2095100 free,     2048 used.  3381924 avail MemPID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND29223 root      20   0    6180   5528   2816 R  20.3  0.1   9:33.65 python3

python3 进程的 CPU 使用率已经降到了 20% 左右!

下面停掉这个容器,重新创建一个限制 CPU 使用的容器:

$ docker container stop 9226c3249105
9226c3249105
$ docker run --cpu-period=100000 --cpu-quota=20000 -d cgroups_test
5218de26ad09db66a92b5c6f8880e99e48012d3cb2148eeff0ce481775b27f02
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5218de26ad09        cgroups_test        "python3 app.py"    1 second ago        Up 1 second                             flamboyant_taussig
$ top
top - 23:04:04 up  6:19,  2 users,  load average: 0.11, 0.37, 0.67
Tasks: 177 total,   2 running, 135 sleeping,   0 stopped,   0 zombie
%Cpu(s): 10.5 us,  0.3 sy,  0.0 ni, 89.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4034008 total,  2959716 free,   420932 used,   653360 buff/cache
KiB Swap:  2097148 total,  2095100 free,     2048 used.  3373504 avail MemPID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND3162 root      20   0    7916   7168   2868 R  19.6  0.2   0:13.86 python3

PID 为3162的 python3 进程在启动后的 CPU 占用率就在20%左右。

接下来确认容器对应控制组中的参数配置:

$ ll /sys/fs/cgroup/cpu,cpuacct/docker/5218de26ad09db66a92b5c6f8880e99e48012d3cb2148eeff0ce481775b27f02/
total 0
drwxr-xr-x 2 root root 0 May  3 23:06 ./
drwxr-xr-x 3 root root 0 May  3 23:02 ../
-rw-r--r-- 1 root root 0 May  3 23:06 cgroup.clone_children
-rw-r--r-- 1 root root 0 May  3 23:02 cgroup.procs
-rw-r--r-- 1 root root 0 May  3 23:02 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 May  3 23:02 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 May  3 23:06 cpu.shares
-r--r--r-- 1 root root 0 May  3 23:06 cpu.stat
-r--r--r-- 1 root root 0 May  3 23:06 cpuacct.stat
-rw-r--r-- 1 root root 0 May  3 23:06 cpuacct.usage
-r--r--r-- 1 root root 0 May  3 23:06 cpuacct.usage_all
-r--r--r-- 1 root root 0 May  3 23:06 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 May  3 23:06 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 May  3 23:06 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 May  3 23:06 cpuacct.usage_sys
-r--r--r-- 1 root root 0 May  3 23:06 cpuacct.usage_user
-rw-r--r-- 1 root root 0 May  3 23:06 notify_on_release
-rw-r--r-- 1 root root 0 May  3 23:06 tasks
$ cat /sys/fs/cgroup/cpu,cpuacct/docker/5218de26ad09db66a92b5c6f8880e99e48012d3cb2148eeff0ce481775b27f02/cpu.cfs_period_us
100000
$ cat /sys/fs/cgroup/cpu,cpuacct/docker/5218de26ad09db66a92b5c6f8880e99e48012d3cb2148eeff0ce481775b27f02/cpu.cfs_quota_us
20000
$ cat /sys/fs/cgroup/cpu,cpuacct/docker/5218de26ad09db66a92b5c6f8880e99e48012d3cb2148eeff0ce481775b27f02/tasks
3162

Docker 在启动容器的时候就把 cpu-period 和 cpu-quota 参数写到了对应的控制组中。

总结一下,Linux Cgroups 就是一个子系统目录加上一组资源配置文件的组合。Docker 在启动容器时在每个子系统下为容器创建一个控制组(目录名为 container ID),修改相应的配置参数,把容器进程的 PID 填到 tasks 文件中就完事了。

容器的本质只是一个加了限定参数的进程。

但是 Linux Cgroups 对资源的限制最大的问题还是限制不彻底,Linux 下的 /proc 路径下存储着当前内核运行状态的一系列特殊文件,用户可以通过访问这些文件来查看系统信息,它们也是 top 查看 CPU 占用的数据来源。但在容器里执行 top,显示的信息居然是宿主机的数据。。。

这就要避免容器挂载宿主机的 /proc/stats 目录。lxcfs是一种不错的纠正方案。容器中进程读取相应文件内容时,LXCFS 的 FUSE 文件系统实现会从容器对应的控制组中读取正确的限制,从而使得应用获得正确的资源限制设定。

http://www.15wanjia.com/news/57476.html

相关文章:

  • 呼和浩特做网站公司昆明关键词优化
  • 返利网网站怎么做在线html5制作网站
  • 做网站不赚钱的原因线上营销模式有哪些
  • 制作手机wap网站工具市场营销策划方案书
  • 网站怎样才有流量最佳搜索引擎磁力
  • 宁波外贸网站推广北京网站营销与推广
  • 滨州五学一做考试网站想要网站导航推广页
  • 国外企业查询网站模板下载网站
  • 公司网站主页设计图片百度云资源搜索
  • 大同市城乡建设委员会网站百度推广账号出售
  • 有没有专门帮人做图的网站百度保障平台 客服
  • 织梦dedecms蓝色培训机构模板教育学校学院整站php网站源码精准营销平台
  • 哪个网站代做ppt便宜哪些网站可以免费申请域名
  • wordpress邮件发送失败简述网站内容如何优化
  • 修文县生态文明建设局网站淄博seo怎么选择
  • 番禺做网站600元河北网站推广公司
  • 哈尔滨网络推广平台优化是什么意思
  • 太原有哪些做网站的公司正规引流推广公司
  • 做学习交流网站推广软件平台
  • 建设电子商务网站期末考试全网品牌推广
  • 厦门本地企业网站建设佛山百度网站快速排名
  • 网站建站公司广州公司网站建设多少钱
  • 购买空间网站哪个好千锋教育地址
  • 网站如何引导页企业培训十大热门课程
  • proxy网站进一步优化落实
  • WordPress模板转换typecho湖南seo
  • 门户网站开发视频教学推广计划方案模板
  • 广西网站建设价格多少上海网站搜索排名优化哪家好
  • wordpress的搜索功能seo点击软件手机
  • 做网站 传视频 用什么笔记本好济南网站建设公司