Docker网络与Cgroup硬件资源占用控制

news2024/9/25 3:18:29

目录

1.dockers的网络模式

 1.1 获取容器的进程号

1.2 docker网络模式的特性 

1.3 host主机模式

 1.4  container模式

 1.5  none模式

1.6 bridge 桥接模式

1.6 容器的自定义网络 

 (1)未创建自定义网络时,创建指定IP容器的测试

(2)创建自定义docker网络 

删除自定义网络:

1.7  Docker容器网络生产经验

2. Docker容器的资源控制

3 .docker占用宿主机cpu的限制

3.1 cpu的使用率上限

(1)正常启用的cpu,测试使用上限

(2)修改默认的容器时间分片上限规则,再次创建启动测试

(3)创建容器时指定容器的cpu资源占用量上限 

(4)多cpu分配容器的使用上限

3.2  设置cpu资源的占用比 

注意:该方式需要设置多个容器时才会生效 

3.3 设置容器绑定指定的cpu 

查看主机中的cpu编号 

进行绑核创建容器 ​​​​​​​

 4.  内存使用的限制

4.2 限制容器可用的swap 大小 

5. 对磁盘IO的配置控制(blkio)的限制 

5.1 默认情况下容器的写速度 

5.2 进行写速度限制的容器创建 

6. 清除docker占用的磁盘空间

 总结

 1.对网络模式的控制

2.对cpu的限制参数

3.对内存的限制

4.对磁盘IO的限制



的网络模式

 1.1 获取容器的进程号


docker inspect -f '{{.State.Pid}}' 容器id/容器名

1.2 docker网络模式的特性 

 docker初始状态下有三种默认的网络模式 :

  • bridg(桥接)
  • host(主机)
  • none(无网络设置)
docker network  ls

1.3 host主机模式

  • 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离 文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespacel隔离。一个Docker容器一 般会分配一个独立的Network. Namespace。
  • 但如果启动容器的时候使用host模式, 那么这个容器将不会获得一 个独立的Network Namespace,而是和宿主机共用一个Network Namespace。 容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。
  • 容器和宿主机共享网络命名空间,但没有独立IP地址,使用宿主机的IP地址,和宿主机共享端口范围,例如宿主机使用了80端口,那么容器不能使用80端口。这种模式比较方便,但不安全

#创建容器web1,指定网络模式为 host
 #容器和宿主机共享网络命名空间,但没有独立IP地址。使用宿主机的IP,和宿主机共享端口范围。
 docker run -d --name web1 --net=host nginx
 ​
 #访问宿主机的ip和80端口,则可以访问到tt1的nginx服务
 curl http://192.168.181.100:80

  

 1.4  container模式

在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。 新创建的容器不会创建自己的网卡,配置自己的Ie,而是和一个指定的容器共享re、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

新创建的B容器和A容器共享命名空间。假如A容器使用了80端口,B容器就不能使用80端口。

#基于镜像centos:7 创建一个名为web2的容器
docker run -itd --name web2 centos:7 /bin/bash
#查看容器web2的pid号
docker inspect -f '{{.State.Pid}}' web2
ls -l /proc/web2的pid/ns
 
#创建web3容器,使用container网络模式,和web2共享网络命名空间
docker run -itd --name web3 --net=container:web2 centos:7 bash
#查看web3容器的pid
docker inspect -f '{{.State.Pid}}' web3
ls -l /proc/web3的pid/ns/
#可以看到web3和web2共享同一个网络命名空间

 1.5  none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个locker容器没有网卡、iP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡、这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性

1.6 bridge 桥接模式

 bridge模式是docker的默认网络模式,不用--net参数,就是bridge模式。

相当于Vmware中的 nat模式,容器使用独立.network Namespace,并连接到docker)虚拟网卡。通过dockerO网桥以及iptables

nat表配置与宿主机通信,此模式会为每一个容器分配hetwork Mamespace、设置等,并将一个主机上的 Docker容器连接到一个虚拟网桥上。

 (1)当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Dokcer容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

(2)从docker0子网中分配一个IP给容器使用,并设置dockerO的I地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来、因此,veth设备常用来连接两个网络设备。

(3 ) Docker将 veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过 brctl show命令查看。

(4) 使用docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。


[root@localhost opt]#docker run -id --name c1  centos:7
[root@localhost opt]#docker run -id --name c2  centos:7
[root@localhost opt]#docker run -id --name c3  centos:7
[root@localhost opt]#brctl show
[root@localhost opt]#docker run -id --name c4  -p 8080:80 centos:7
[root@localhost opt]#brctl show
[root@localhost opt]#docker ps -a

1.6 容器的自定义网络 

ifconfig docker0

 (1)未创建自定义网络时,创建指定IP容器的测试

指定容器IP的方式: 

注意:创建指定IP的容器也需要基于docker网卡的IP网段 

docker run -id --name a1 --ip 192.168.181.100   806c77e62cdd
ping 192.168.181.100
docker run -id --name a2 --network bridge --ip 192.168.181.100   806c77e62cdd

(2)创建自定义docker网络 

 创建自定义网络:

docker network create --subnet=192.168.181.100/24 --opt "com.docker.network.bridge.name"="docker1" mynetwork

 再次创建指定IP的容器:

docker run -id --net=mynetwork --ip 1792.168.181.100 --name a3 centos:7
ping 192.168.181.100

删除自定义网络:

如果想要删除自定义的网络,可以使用 docker network rm 网络模式名称 进行删除,例如docker network rm mynetwork。

 删除网络模式前,需要先确保使用该网络模式创建的容器已退出(即已停止)。如果容器仍在运行,则该网络无法删除。

1.7  Docker容器网络生产经验

# daemon.json 配置介绍
 {
  "graph": "/data/docker",
  "storage-driver": "overlay2",
  "insecure-registries": ["registry.access.redhat.com", "quay.io"],
  "registry-mirrors": ["https://3u6mkfxb.mirror.aliyuncs.com"],
  "bip": "172.168.181.1/24",       #指定网桥的网段,这里不能写0,必须写1
  "exec-opts": ["native. cgroupdriver= systemd"],
  "live-restore": true
 }
 ​
 #配置项注意点:
 ● graph:该关键字未来将被弃用,可以采用"data-root" 替代。
 ● storage-driver:存储驱动,即分层文件系统。
 ● insecure-registries:不安全的docker registries, 即使用http协议推拉镜象。
 ● registry-mirrors:加速站点,一般可以使用阿里、网易云、docker中国 (https: //registry.docker-cn.com)的地址。
 ● bip:指定doccer bridge地址(不能以.0结尾),生产中建议采用172.xx.yy.1/24,其中xx. yy为宿主机ip后四位,方便定位问题。
 ● 若启动失败,查看/var/log/message 日志排错。
 ● live-restore:启用实时还原。
 默认情况下,当Docker守护程序终止时,它将关闭正在运行的容器。从Docker Engine 1.12开始,您可以配置守护程序,以便在守护程序不可用时容器仍在运行。此功能称为实时还原。实时还原选项有助于减少由于守护程序崩溃,计划内的停机或升级而导致的容器停机时间。
 ​
 ​
 #使用配置文件/etc/docker/daemon.json (没有时新建该文件)
 vim /etc/docker/daemon.json
 {
 " insecure-registries": ["172.168.181.7:65500"],
 "registry-mirrors": ["https://3u6mkfxb.mirror.aliyuncs.com"],
 "live-restore": true
 }

2. Docker容器的资源控制

Docker通过Cgroup 来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。Caroup 是ControlGroups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、内存、磁盘,io等等)的机制,被LXC、docker等很多项目用于实现进程资源控制。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理是通过该功能来实现的。

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

3 .docker占用宿主机cpu的限制

3.1 cpu的使用率上限

Linux通过CFS (Completely Fair Scheduler,完全公平调度器)来调度各个进程对ceu的使用。CFS默认的调度周期是100ms 。我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。

 使用--cpu-period 即可设置调度周期,使用--cpu-quota即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。CFS周期的有效范围是 1ms~1s,对应的--cpu-period 的数值范围是1000~1000000。而容器的CPU配额必须不小于1ms,即--cpu-quota的值必须>= 1000。而容器的CPU配额必须不小于1ms,即--cpu-quota的值必须>= 1000。

(1)正常启用的cpu,测试使用上限


#正常创建容器(此时容器遵循默认的占用cpu资源规则)
[root@localhost ~]#docker run -id --name c1 centos:7
 
[root@localhost ~]#docker ps -a
 
[root@localhost ~]#docker exec -it c1 bash
 
[root@d6da0a6b999a /]# vi cpu.sh
 
#!/bin/bash
i=0
while true
do
let i++
done
 
 
[root@d6da0a6b999a /]# chmod +x cpu.sh 
 
[root@d6da0a6b999a /]# ./cpu.sh

如果在创建容器时不限制它cpu使用的限制,是非常危险的一件事,一旦某个容器的程序异常陷入死循环,将直接导致其他容器中业务的中断 

(2)修改默认的容器时间分片上限规则,再次创建启动测试

docker start c1
docker ps -a
#d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04为容器id
cd/sys/fs/cgroup/cpu/docker/d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04
 
[root@localhost d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04]#echo 50000 > cpu.cfs_quota_us

(3)创建容器时指定容器的cpu资源占用量上限 


docker run -id --name c2 --cpu-quota 30000 centos:7
[root@localhost docker]#docker exec -it c2 bash
[root@10cfa036ff07 /]# vim cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@10cfa036ff07 /]# vi cpu.sh
[root@10cfa036ff07 /]# chmod +x cpu.sh 
[root@10cfa036ff07 /]# ./cpu.sh

(4)多cpu分配容器的使用上限

[root@localhost docker]#docker run -id --name c3 centos:7
 
[root@localhost docker]#docker ps -a
 
[root@localhost docker]#cd /sys/fs/cgroup/cpu/docker/a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a/
[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a]#ls
 
[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a]#echo 200000 >  cpu.cfs_quota_us


[root@localhost ~]#docker exec -it c3 bash
[root@a1ce6948cdb6 /]# vi cpu.bash
#!/bin/bash
i=0
while true
do
let i++
done
[root@a1ce6948cdb6 /]# chmod +x ./cpu.bash 
[root@a1ce6948cdb6 /]# ./cpu.bash 

3.2  设置cpu资源的占用比 

注意:该方式需要设置多个容器时才会生效 

创建容器时可以使用选项  --cpu-shares  数值(该数值要为1024的倍数,1024代表一份,当个容器占用cpu的份额由自身分配的份数除于所有容器占用cpu的份数,就为该容器所占用cpu资源的百分比)

进行分配:

[root@localhost ~]#docker run -id --name b1 --cpu-shares 2048 centos:7
 
[root@localhost ~]#docker run -id --name b2 --cpu-shares 1024 centos:7
 
[root@localhost ~]#docker run -id --name b3 --cpu-shares 1024 centos:7
 

开启三个终端,启动容器压测:


#三个容器均为以下压测操作
#下载压测工具依赖环境
yum install -y epel-release
#下载压测工具
yum install -y stress
#进行四个线程压测
stress -c 4
 
 
#再开启一个终端查看测试结果
docker stats
  • 由测试结果, 可以看到在cPU进行时间片分配的时候,容器b1比容器b2和b3多一倍的机会获得cpu的时间片。但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器 b2和b3一定能获得cpu时间片
  • 比如容器b2和b3的进程一直是空闲的,那么容器b1是可以获取比容器b2和b3更多的cpu时间片的。极端情况下,例如主机上只运行了一个容器,即使它的cpu份额只有50,它也可以独占整个主机的cpu资源。
  •  Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu 份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。

3.3 设置容器绑定指定的cpu 

查看主机中的cpu编号 

top   
按数字“1”

进行绑核创建容器 

[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 2 centos:7

压力测试:

yum install -y epel-release
yum insatll -y stress
 
stress -c 1

 测试结果:

 4.  内存使用的限制

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

docker run -itd --name d1 -m 512m centos:7 /bin/bash
docker  stats

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 d2 -m 512m --memory-swap=1g centos:7 bash
 ​
 ​
 #--memoryswap值和 -m 的值相同,表示容器无法使用swap
 docker run -itd --name d3 -m 512m --memory-swap=512m centos:7 bash
 ​
 ​
 # --memory-swap 的值设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
 docker run -itd --name d4 -m 512m centos:7 bash
 ​
 ​
 # --memory-swap 值为 -1,它表示容器程序使用的内存受限,但可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。
 docker run -itd --name d5 -m 512m --memory-swap=-1 centos:7 bash
 

5. 对磁盘IO的配置控制(blkio)的限制 

  • -device-read-bps:限制某个设备上的读速度bps ( 数据量),单位可以是kb、mb (M)或者gb。
  • --device-write-bps : 限制某个设备上的写速度bps ( 数据量),单位可以是kb、mb (M)或者gb。
  • 该速度是指每秒钟进行读写操作1M,1G或者是1kb 
  • --device-read-iops :限制读某个设备的iops (次数)
  • --device-write-iops :限制写入某个设备的iops ( 次数)

5.1 默认情况下容器的写速度 

[root@localhost ~]#docker run -id --name e1  centos:7
[root@localhost ~]#docker exec -it e1 bash
[root@8657384cb483 /]# dd if=/dev/zero  of=/opt/test.txt bs=10M count=5 oflag=direct
## oflag=direct 规避文件读写系统中所带来的缓存,避免影响测试结果

5.2 进行写速度限制的容器创建 

 
[root@localhost ~]#docker run -it --name e3 --device-write-bps /dev/sda:1M centos:7 /bin/bash
[root@6c1b8bcf6b44 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct

6. 清除docker占用的磁盘空间

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

docker system prune -a 

 总结

 1.对网络模式的控制

 ########映射端口 -P为随机 -p为指定端口#################
docker run -itd  --name=为容器指定名称 -P 镜像名称
docker run -itd --name=为容器指定名称 -p 宿主机端口:容器端口 镜像名称
 
 
##############指定网络模式##########################
 #使用docker' run 创建Docker容器时,可以用--net 或--network 选项指定容器的网络模式
 ●host模式:使用 --net=host 指定。
 ●none模式:使用 --net=none 指定。
 ●container模式:使用--net=container:NAME/ID指定。
 ●bridge模式:使用 --net=bridge 指定,默认设置,可省略。
 
############自定义网络####################################
注意:只要自定义网络在创建容器时才能指定IP(必须是自定义网段中的IP)
#创建自定义网络
 docker network create --subnet=网段 --opt "com.docker.network.bridge.name"="网卡名" 自定义网络的名称
 
#使用自定义网络
 docker run -itd --name 容器名 --net 自定义网路名 --ip 自定义网路网段范围内的IP  centos:7 /bin/bash
 
#删除自定义网络
docker network rm 网络模式名称
 
 

2.对cpu的限制参数

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

3.对内存的限制

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

4.对磁盘IO的限制

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VBA技术资料MF44:VBA_把数据从剪贴板粘贴到Excel

【分享成果,随喜正能量】人皆知以食愈饥,莫知以学愈愚,生命中所有的不期而遇都是你努力的惊喜.人越纯粹,就越能感受到美。大江、大河、大海、大山、大自然,这些风景从来都不会受“属于谁”的污染,人人都感受到它们的美…

来自句子转换器:转换器和池化组件

一、说明 转换器和池化组件,它们来自 Bert 在 SentenceTransformer 对象中预先训练的模型。 在我之前的文章中,我用拥抱面转换器介绍了预训练模型来计算句子之间的余弦相似性分数。在这篇文章中,我们将深入研究变压器模型的参数。句子转换器对…

Unity 编辑器资源导入处理函数 OnPreprocessTexture:深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPreprocessTexture 用法 点击封面跳转下载页面 简介 在Unity中,我们可以使用编辑器资源导入处理函数(OnPreprocessTexture)来自定义处理纹理资源的导入过程。这个函数是继承自AssetPostprocessor类的&#x…

.NET Core6.0使用NPOI导入导出Excel

一、使用NPOI导出Excel //引入NPOI包 HTML <input type"button" class"layui-btn layui-btn-blue2 layui-btn-sm" id"ExportExcel" onclick"ExportExcel()" value"导出" />JS //导出Excelfunction ExportExcel() {…

微信小程序OCR插件,实现身份证、行驶证、银行卡、营业执照和驾驶证等识别

随着科技的不断发展&#xff0c;图片识别技术已经成为了当下移动互联网中的热点话题。而基于微信小程序和 OCR 插件的图文识别方案&#xff0c;更是成为了越来越多小程序开发者关注和研究的问题。本文中&#xff0c;我将为大家介绍微信小程序 OCR 插件&#xff0c;帮助大家实现…

并发编程系列-分而治之思想Forkjoin

我们介绍过一些有关并发编程的工具和概念&#xff0c;包括线程池、Future、CompletableFuture和CompletionService。如果仔细观察&#xff0c;你会发现这些工具实际上是帮助我们从任务的角度来解决并发问题的&#xff0c;而不是让我们陷入线程之间如何协作的繁琐细节&#xff0…

Linux学习之基本指令一

在学习Linux下的基本指令之前首先大家要知道Linux下一切皆目录&#xff0c;我们的操作基本上也都是对目录的操作&#xff0c;这里我们可以联想我们是如何在windows上是如何操作的&#xff0c;只是形式上不同&#xff0c;类比学习更容易理解。 目录 01.ls指令 02. pwd命令 0…

Android Ble蓝牙App(六)请求MTU与显示设备信息

前言 在上一篇文章中已经了解了数据操作的方式&#xff0c;而数据交互的字节长度取决于我们手机与蓝牙设备的最大支持长度。 目录 Ble蓝牙App&#xff08;一&#xff09;扫描Ble蓝牙App&#xff08;二&#xff09;连接与发现服务Ble蓝牙App&#xff08;三&#xff09;特性和属…

财报解读:多元化布局,亲亲食品欲摘“果冻之王”头衔?

提及亲亲食品&#xff0c;大多数消费者的印象是其果冻、虾条等产品&#xff0c;而随着消费升级、休闲零食行业竞争的加剧&#xff0c;亲亲食品近年来也想“多条腿走路”&#xff0c;持续进行着产品创新。 不过&#xff0c;在市场看来&#xff0c;承载其转型愿景的新品并未带来…

ORB-SLAM2学习笔记8之特征点提取、生成描述子的ORBextractor

文章目录 0 引言1 特征点提取1.1 提取流程1.2 ORBextractor.cc1.2.1 成员函数1.2.2 成员变量 1.3 构建图像金字塔1.3.1 为什么要构建图像金字塔1.3.2 金字塔参数设置 1.4 提取ORB特征点1.4.1 Fast角点检测1.4.2 特征点提取流程1.4.3 八叉树筛选及非极大值抑制 2 描述子生成2.1 …

【数据集】GRNWRZ V2.0(全球河流网络和相应的水资源分区)介绍及下载

数据介绍 论文&#xff1a;J2022-A data set of global river networks and corresponding water resources zones divisions v2 论文下载地址 GRNWRZV1.0由严登华教授&#xff08;中国水利水电科学研究院&#xff09;团队开发&#xff0c;以全球90mDEM数据为基础&#xff0c;结…

SpringBoot-Mybatis 入门(数据库增删改查)

创建SpringBoot-Mybatis项目 创建新项目&#xff0c;注意Type要选择Maven Spring Boot的版本没啥硬性要求&#xff0c;一般开开发环境 依赖必选MySQL Driver、MyBatis Framework&#xff1b; 选Spring Web是为了辅助未来的web开发&#xff1b; Lombok是个人开发习惯。 配置 …

【C++精华铺】8.C++模板初阶

目录 1. 泛型编程 2. 函数模板 2.1 函数模板的概念及格式 2.2 函数模板的原理 2.3 模板的实例化 2.4 模板参数的匹配原则 3. 类模板 3.1 类模板格式 3.2 类模板的实例化 1. 泛型编程 什么是泛型编程&#xff1f;泛型编程是避免使用某种具体类型而去使用某种通用类型来进行…

FT2000+低温情况下RTC守时问题

1、背景介绍 飞腾2000芯片通过I2C连接一块RTC时钟芯片&#xff08;BellingBL5372&#xff09;来实现麒麟信安系统下后的守时功能。目前BIOS支持UEFI功能&#xff0c;BIOS上电后能获取RTC时间&#xff0c;并将时间写入相应的UEFI变量或内存区域&#xff0c;操作系统上电后使用U…

大模型基础02:GPT家族与提示学习

大模型基础&#xff1a;GPT 家族与提示学习 从 GPT-1 到 GPT-3.5 GPT(Generative Pre-trained Transformer)是 Google 于2018年提出的一种基于 Transformer 的预训练语言模型。它标志着自然语言处理领域从 RNN 时代进入 Transformer 时代。GPT 的发展历史和技术特点如下: GP…

产业园区数字孪生3d可视化全景展示方案

随着数字经济的发展&#xff0c;数字技术给企业发展带来了机遇的同时&#xff0c;也为企业管理带来挑战。比如园区运维&#xff0c;不仅体量大&#xff0c;复杂的运维管理系统&#xff0c;落地难度也较高。那么如何通过数字化手段重塑园区运营&#xff0c;打通园区各业务数据孤…

LimeReport设置当前打印时间

拉一个文本控件&#xff0c;然后填入下面信息&#xff1a; $S{ var curDate new Date(); var strYear curDate.getFullYear().toString(); var strMonth (curDate.getMonth() 1).toString(); var strDay curDate.getDate().toString(); var strHour curDate.getHours().…

句子变形金刚:变相的含义

一、说明 变形金刚完全重建了自然语言处理&#xff08;NLP&#xff09;的格局。在变形金刚出现之前&#xff0c;由于循环神经网络&#xff08;RNN&#xff09;&#xff0c;我们的翻译和语言分类很好——它们的语言理解能力有限&#xff0c;导致许多小错误&#xff0c;而且在大块…

mybatis-x插件的使用

mybatis-x能够帮助我们快速通过数据库生成实体类&#xff0c;mapper层&#xff0c;service层等 下面就带大家如何使用 首先我们去idea里面下载mybatis-x&#xff0c;如下图 我们还需要使用idea连接mysql数据库。效果如下图 接下来我们右键选中表&#xff0c;再选择第一项这个mm…

Panorama SCADA软件在无人值守水泵房的应用

应用背景 城市自来水公司、工矿企业的水泵房普遍数量较多&#xff0c;分布也较分散&#xff0c;在管理上通常会存在需要不定时开关泵、水泵故障不能及时发现、操作人员需24小时轮班值守、人员管理成本高等问题。 虹科Panorama是一个用于构建数据采集、SCADA 和历史解决方案的软…