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

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(/) 里面访问的是根路径,如果访问别的路径&#xff…...

想转行做程序员,该怎么选择开发语言?哪个岗位工资最高?

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

JavaWeb——【笔记】3.2JavaWeb_Web核心_Request(请求)+Response(响应)

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

HTML 标签和属性

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

MySQL 连接的使用

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

配置案例丨EtherCAT转Profinet网关连接凯福科技总线步进驱动器

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

VSCODE连接ssh服务器时提示could not establish connection to解决方法

VSCODE连接ssh服务器时提示could not establish connection to解决方法 1.点击扩展设置 在Remote.ssh&#xff1a;config file中输入config路径 重新连接即可&#xff0c;如果是之前连接过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有一句口号&#xff1a;Write once, run anywhere&#xff0c;一次编写、到处运行。这也是Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已编…...

mongoDB学习笔记

1.大数据定义&#xff1a; 数据量级大 byte kb MB GB TB PB ... 数据种类多 数据维度 例如&#xff1a;人物画像 数据处理速度快 数据有价值 问题&#xff1a;①.存储 &#xff1f; ②.数据分析&#xff1f; ③.高并发&#xff1f; 大数据应用领域: 电商&#xff08;推…...

快速融人,融资的共享模式,实体,线上皆可参考

有一种模式现在非常流行&#xff0c;它既能帮助商家快速收钱&#xff0c;又能帮助商家快速裂变更多客户&#xff0c;这个神奇的模式就是共享股东模式&#xff0c;现在很多老板都在用这个模式。 梦龙商业案例分析&#xff0c;带你了解商业背后的秘密 这个模式也适用于很多个行…...

纯干货版阿里巴巴国际站入门攻略

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

jQuery四、其他方法

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…...

2023年先进无人飞行系统国际会议(ICAUAS 2023) | IOP JPCS独立出版

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

2022蓝桥杯省赛——修剪灌木

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

Spring Boot Aop初接触

AOP&#xff08;面向切面编程&#xff09;&#xff0c;或多或少都听过一点。名字比较怪&#xff0c;切面&#xff0c;不容易理解&#xff0c;但其中真正含义&#xff0c;无非就是旁路控制&#xff0c;非侵入式编码之类。比如我想加个操作日志功能&#xff0c;利用AOP&#xff0…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...

【Java】Ajax 技术详解

文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”

深入浅出JavaScript中的ArrayBuffer&#xff1a;二进制数据的“瑞士军刀” 在JavaScript中&#xff0c;我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时&#xff0c;单纯依赖字符串或数组就显得力不从心了。这时&#xff…...

以太网PHY布局布线指南

1. 简介 对于以太网布局布线遵循以下准则很重要&#xff0c;因为这将有助于减少信号发射&#xff0c;最大程度地减少噪声&#xff0c;确保器件作用&#xff0c;最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确&#xff0c;然…...