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 文件系统实现会从容器对应的控制组中读取正确的限制,从而使得应用获得正确的资源限制设定。
相关文章:
Docker Cgroups——Docker 资源限制背后的技术原理
Docker Cgroups——Docker 资源限制背后的技术原理虽然在容器内部进程只能看到“掩饰”过的视图,但是在宿主机上,它就是一个普通的进程,与其他所有进程之间是平等竞争的关系。这就意味着虽然表面上被隔离了,但它实际上在与其他进程…...

十四. MySQL 锁相关
目录一. MySQL 锁基础Mysql 锁分类二. InnoDB 下的锁增删改查操作时底层的加锁处理表级锁1. 意向锁2. AUTO-INC锁id不连续对主从同步的影响3. 其它表锁行锁分析1. 记录锁 Record Locks2. 间隙锁 Gap Locks3. 临键锁 Next-Key Locks4. 插入意向锁5. 隐式锁6. 加锁算法InnoDB 行锁…...

ModStartBlog v7.0.0 网站简单统计,支持博客分享
ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装 …...

【C语言蓝桥杯每日一题】—— 递增序列
【C语言蓝桥杯每日一题】—— 递增序列😎前言🙌递增序列🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者…...

node_express框架01
01_express 基本结构 注意点:app.get 指定了 get 方法,如果是 app.all 就是指定了所有的请求方法(例如:post delete 都是包含的),而 app.get(/) 里面访问的是根路径,如果访问别的路径ÿ…...

想转行做程序员,该怎么选择开发语言?哪个岗位工资最高?
本文主要针对零基础想了解或者转行从事开发岗的同学。 我们收集了往届毕业同学和一些正在咨询的同学,发现大家在学习初期,对转行互联网做开发,最多的疑问或者顾虑大体分为几类: 现在哪门语言比较火? 学什么语言好找到工…...

JavaWeb——【笔记】3.2JavaWeb_Web核心_Request(请求)+Response(响应)
Request(请求)Response(响应)两个对象 request、response是service()方法中的两个参数。作用分别是获取请求数据进行逻辑处理;对数据解析设置响应数据 一、简介 示例: 二、Request(请求) 1、Request继承体系 能更清楚其是由谁创建及查阅什么文档 2、Request获…...

HTML 标签和属性
一些标签 单双标签 双标签。双标签指标签是成对出现的,也就是有一个开始标签和一个结束标签,开始标签用 <标签名> 表示,结束标签用 </标签名> 表示,只有一对标签一起使用才能表示一个具体的含义。例如 <html>&…...

MySQL 连接的使用
MySQL 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。 本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。 你可以在 SEL…...

配置案例丨EtherCAT转Profinet网关连接凯福科技总线步进驱动器
西门子S7-1200/1500系列的PLC,采用PROFINET实时以太网通讯协议,需要连接带EtherCAT的通讯功能的伺服驱动器等设备,就必须进行通讯协议转换。小疆GW-PN-ECATM系列的网关提供了,快速可行的解决方案。GW-PN-ECATM支持两种实时以太网通…...

VSCODE连接ssh服务器时提示could not establish connection to解决方法
VSCODE连接ssh服务器时提示could not establish connection to解决方法 1.点击扩展设置 在Remote.ssh:config file中输入config路径 重新连接即可,如果是之前连接过ubuntu现在无法连接则需要打开刚刚的地址文件中删掉known_hostsj即可 虚拟机中ubuntu安…...

网络安全之防火墙 双机热备实验
目录 网络安全之防火墙 双机热备实验 实验图 基本配置 PC1 SW2 PC2 编辑 SW3配置 登陆防火墙图形界面 编辑 FW1的配置 FW2的配置 新建trust to untrust 区域的安全策略 配置心跳线 在FW1与FW2之间拉一条心跳线 编辑 配置FW1 g 1/0/2 口 ip 编辑 配置FW2 g…...

Java高频面试题(2023最新整理)
Java的特点 Java是一门面向对象的编程语言。面向对象和面向过程的区别参考下一个问题。 Java具有平台独立性和移植性。 Java有一句口号:Write once, run anywhere,一次编写、到处运行。这也是Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已编…...

mongoDB学习笔记
1.大数据定义: 数据量级大 byte kb MB GB TB PB ... 数据种类多 数据维度 例如:人物画像 数据处理速度快 数据有价值 问题:①.存储 ? ②.数据分析? ③.高并发? 大数据应用领域: 电商(推…...
快速融人,融资的共享模式,实体,线上皆可参考
有一种模式现在非常流行,它既能帮助商家快速收钱,又能帮助商家快速裂变更多客户,这个神奇的模式就是共享股东模式,现在很多老板都在用这个模式。 梦龙商业案例分析,带你了解商业背后的秘密 这个模式也适用于很多个行…...

纯干货版阿里巴巴国际站入门攻略
阿里巴巴国际站作为目前全球排名名列前茅的B2B电商平台,很多跨境电商卖家都很想入局。但是目前很多公司的国际站都没有专职运营的人员,只是靠外贸业务员操作,所以涉猎的都是比较浅的东西。今天龙哥就来讲讲如果想要深研这个平台的话ÿ…...

jQuery四、其他方法
零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…...

2023年先进无人飞行系统国际会议(ICAUAS 2023) | IOP JPCS独立出版
会议简介 Brief Introduction 2023年先进无人飞行系统国际会议(ICAUAS 2023) 会议时间:2023年7月13日-16日 召开地点:中国哈尔滨&加拿大多伦多双会场 大会官网: ICAUAS 2023-2023 International Conference on Advanced Unmanned Aerial …...

2022蓝桥杯省赛——修剪灌木
问题描述 爱丽丝要完成一项修剪灌木的工作。 有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木, 让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。当修剪了最右侧的灌木后, 她会调转方向, 下一天开始向左修剪…...

Spring Boot Aop初接触
AOP(面向切面编程),或多或少都听过一点。名字比较怪,切面,不容易理解,但其中真正含义,无非就是旁路控制,非侵入式编码之类。比如我想加个操作日志功能,利用AOP࿰…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...