KubeVirt下gpu operator实践(GPU直通)
KubeVirt下gpu operator实践(GPU直通)
参考《在 KubeVirt 中使用 GPU Operator》,记录gpu operator在KubeVirt下实践的过程,包括虚拟机配置GPU直通,容器挂载GPU设备等。
KubeVirt 提供了一种将主机设备分配给虚拟机的机制。该机制具有通用性,支持分配各种类型的 PCI 设备,例如加速器(包括 GPU)或其他连接到 PCI 总线的设备。
1. 准备工作
硬件信息
三台服务器,每台服务器的主要硬件配置信息如下:
-
型号: H3C UniServer R5200 G3
-
cpu:Xeon® Gold 5118 CPU @ 2.30GHz,2x12x2
-
mem: 512GB
-
disk: 1.75GBx2,一块用于系统盘,一块用于ceph数据盘。
-
gpu:GV100GL_TESLA_V100_PCIE_16GB*4
kubernetes集群环境
k8s环境信息如下,使用v1.27.6版本,节点同时作为管理节点和业务节点。
]# kubectl get node
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 7d18h v1.27.6
node2 Ready control-plane,master 7d18h v1.27.6
node3 Ready control-plane,master 7d18h v1.27.6
rook-ceph环境安装
使用版本v1.13.5,组件信息如下:
]# kubectl get pod -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-5k87k 2/2 Running 4 (5d22h ago) 12d
csi-cephfsplugin-88rmz 2/2 Running 0 5d22h
csi-cephfsplugin-np9lb 2/2 Running 4 (5d22h ago) 12d
csi-cephfsplugin-provisioner-5556f68f89-bsphz 5/5 Running 0 5d22h
csi-cephfsplugin-provisioner-5556f68f89-jswvj 5/5 Running 0 5d22h
csi-rbdplugin-5v8dm 2/2 Running 0 5d22h
csi-rbdplugin-provisioner-76f966fdd8-6jwdk 5/5 Running 0 5d22h
csi-rbdplugin-provisioner-76f966fdd8-sjf6c 5/5 Running 3 (4d21h ago) 5d22h
csi-rbdplugin-s8k4x 2/2 Running 4 (5d22h ago) 12d
csi-rbdplugin-s97mc 2/2 Running 4 (5d22h ago) 12d
os-rook-set-cronjob-28865084-h5jdf 0/1 Completed 0 118s
rook-ceph-agent-7bdf69b4f7-wzl7r 1/1 Running 0 5d22h
rook-ceph-crashcollector-node1-c9bc54894-s7lps 1/1 Running 0 5d22h
rook-ceph-crashcollector-node2-6448cdd8f9-7dlgs 1/1 Running 0 5d22h
rook-ceph-crashcollector-node3-56d876f9c6-6bjlr 1/1 Running 0 5d22h
rook-ceph-exporter-node1-7c7d659d96-6k55c 1/1 Running 0 5d22h
rook-ceph-exporter-node2-7bc85dfdf-xdt8g 1/1 Running 0 5d22h
rook-ceph-exporter-node3-f45f5db9d-8jrgs 1/1 Running 0 5d22h
rook-ceph-mds-ceph-filesystem-a-5bbf4d5d79-qwsd2 2/2 Running 0 5d22h
rook-ceph-mds-ceph-filesystem-b-69b5fc4f7-fhlth 2/2 Running 0 5d22h
rook-ceph-mgr-a-5f5768988-6dsm2 3/3 Running 0 5d22h
rook-ceph-mgr-b-5c96dcf465-7gcrk 3/3 Running 0 5d22h
rook-ceph-mon-a-5dcb9b69c5-p5mh9 2/2 Running 0 5d22h
rook-ceph-mon-b-6575d4f46b-gsthp 2/2 Running 0 5d22h
rook-ceph-mon-c-7ff969d568-gqzr4 2/2 Running 0 5d22h
rook-ceph-operator-86d5cb7c46-nx4jc 1/1 Running 0 5d22h
rook-ceph-osd-0-69c8c7fb45-nvvsx 2/2 Running 0 5d22h
rook-ceph-osd-1-5fcdbc57bf-dh8cf 2/2 Running 0 5d22h
rook-ceph-osd-2-7445bdc885-sxqbc 2/2 Running 0 5d22h
rook-ceph-rgw-ceph-objectstore-a-795c4c64cf-xbhkl 2/2 Running 0 5d22h
rook-ceph-tools-5877f9f669-tndwc 1/1 Running 0 5d22h
kubevirt安装
参考kubevirt官方文档完成虚拟化插件的安装,本文使用的版本为v1.2.0-amd64。
]# kubectl get pod -n kubevirt
NAME READY STATUS RESTARTS AGE
virt-api-74d58d7fc8-5v5t4 1/1 Running 0 5d21h
virt-api-74d58d7fc8-m7lhw 1/1 Running 0 5d21h
virt-controller-55d7978dc-d9tk2 1/1 Running 0 5d21h
virt-controller-55d7978dc-xsvtm 1/1 Running 0 5d21h
virt-exportproxy-795d79f86b-qgc4c 1/1 Running 0 5d21h
virt-exportproxy-795d79f86b-wxt4b 1/1 Running 0 5d21h
virt-handler-4x55q 1/1 Running 0 5d21h
virt-handler-b9b27 1/1 Running 0 5d21h
virt-handler-n8bf8 1/1 Running 0 5d21h
virt-operator-79bb89f7bd-zrxx6 1/1 Running 0 5d21h
禁用nouveau驱动
- 移除模块
]# modprobe -r nouveau
- 配置文件
创建文件/etc/modprobe.d/blacklist-nouveau.conf
, 并添加如下内容:
blacklist nouveau
options nouveau modeset=0
- 重启内核 initramfs(如报错可忽略):
]# sudo dracut --force
- 检查 nouveau 模块是否被禁用:
]# lsmod | grep nouveau
卸载nvidia驱动
使用vfio-pci驱动实现GPU直通,节点操作系统不需要安装nvidia驱动,如已安装,通过如下命令卸载:
nvidia-uninstall
本文环境中节点1、2配置vfio-pci驱动,不安装nvida驱动;节点3提前预安装了nvida驱动(根据gpu-operator部署方式决定)。
主机配置PCI直通
主机设备直通需要在 BIOS 中启用虚拟化扩展和 IOMMU 扩展(Intel VT-d 或 AMD IOMMU)。
要启用 IOMMU,根据 CPU 类型,主机应通过额外的内核参数启动,对于 Intel CPU 使用 intel_iommu=on
,对于 AMD CPU 使用 amd_iommu=on
。
修改grub引导配置文件,如下两种方式供参考:
grub配置开启intel IOMMU
修改 GRUB 配置的模板文件,将参数附加到 grub 配置文件中 GRUB_CMDLINE_LINUX
行的末尾。
]# vi /etc/default/grub
...
GRUB_CMDLINE_LINUX="nofb splash=quiet console=tty0 ... intel_iommu=on
...]# grub2-mkconfig -o /boot/grub2/grub.cfg]# reboot
修改最终的引导配置文件
这里看具体的系统引导文件位置,比如H3Linux的引导文件位置为:/boot/efi/EFI/H3Linux/grub.cfg
,在linux
命令后面添加 intel_iommu=on
:
...
### BEGIN /etc/grub.d/10_linux ###
menuentry 'H3Linux (5.10.0-136.12.0.86.4.hl202.x86_64) 2.0.2-SP01' --class h3linux --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-5.10.0-136.12.0.86.4.hl202.x86_64-advanced-fdd76f12-53d6-41d2-aaab-be7a10e2009c' {load_videoset gfxpayload=keepinsmod gzioinsmod part_gptinsmod ext2set root='hd0,gpt2'if [ x$feature_platform_search_hint = xy ]; thensearch --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 bb0505b3-0529-4916-af54-c39fca87a752elsesearch --no-floppy --fs-uuid --set=root bb0505b3-0529-4916-af54-c39fca87a752fiecho 'Loading Linux 5.10.0-136.12.0.86.4.hl202.x86_64 ...'linux /vmlinuz-5.10.0-136.12.0.86.4.hl202.x86_64 root=/dev/mapper/cloudos-root ro rd.lvm.lv=cloudos/root cgroup_disable=files panic=3 nmi_watchdog=1 console=tty0 crashkernel=512M rhgb quiet no-kvmclock user_namespace.enable=1 intel_pstate=disable cpufreq.off=1 loglevel=3 intel_iommu=onecho 'Loading initial ramdisk ...'initrd /initramfs-5.10.0-136.12.0.86.4.hl202.x86_64.img
}
...
BIOS配置开启intel VT-d
里以H3C 服务器BIOS为例,进入BIOS,打开【Socket Configuration】【IIO Configuration】
加载vfio驱动
加载vfio驱动
]# modprobe vfio_pci
正常情况下可看到vfio内核模块已加载:
]# lsmod | grep vfio_
vfio_pci 81920 0
vfio_virqfd 16384 1 vfio_pci
vfio_iommu_type1 53248 0
vfio 45056 2 vfio_iommu_type1,vfio_pci
irqbypass 16384 2 vfio_pci,kvm
2. GPU Operator安装
本文使用最新的GPU Operator 24.9.0,参考对应的安装部署。安装场景采用"预安装的NVIDIA GPU驱动程序",driver.enabled=false
。
查看节点的GPU设备:
]# kubectl get node node3 -ojson | jq -r ".status.capacity"
# 示例输出:
{"cpu": "48","devices.kubevirt.io/kvm": "1k","devices.kubevirt.io/tun": "1k","devices.kubevirt.io/vhost-net": "1k","ephemeral-storage": "514937088Ki","h3c.com/vcuda-core": "0","h3c.com/vcuda-memory": "0","hugepages-1Gi": "0","hugepages-2Mi": "0","memory": "790609008Ki","nvidia.com/GV100GL_TESLA_V100_PCIE_16GB": "4","nvidia.com/gpu": "0","pods": "250"
}
3. 节点配置GPU工作负载
语法:
# 虚拟机gpu直通负载
kubectl label node <node-name> --overwrite nvidia.com/gpu.workload.config=vm-passthrough
# 容器工作负载
kubectl label node <node-name> --overwrite nvidia.com/gpu.workload.config=container
查看节点可分配的GPU资源:
]# kubectl get node node1 -o json | jq '.status.allocatable | with_entries(select(.key | startswith("nvidia.com/"))) | with_entries(select(.value != "0"))'
{"nvidia.com/GV100GL_TESLA_V100_PCIE_16GB": "4"
}
本文测试环境中将node1/2节点配置虚拟机GPU直通工作负载,node3节点配置容器GPU工作负载:
kubectl label node node1 --overwrite nvidia.com/gpu.workload.config=vm-passthrough
kubectl label node node2 --overwrite nvidia.com/gpu.workload.config=vm-passthrough
kubectl label node node3 --overwrite nvidia.com/gpu.workload.config=container
4. 向 KubeVirt CR 中添加 GPU 资源
- 确定GPU设备的资源名称
[root@node3 ~]# kubectl get node node1 -o json | jq '.status.allocatable | with_entries(select(.key | startswith("nvidia.com/"))) | with_entries(select(.value != "0"))'
示例输出:
{"nvidia.com/GV100GL_TESLA_V100_PCIE_16GB": "4"
}
或者通过如下命令查看:
]# kubectl get node node1 -ojson | jq -r ".status.capacity"
{"cpu": "48","devices.kubevirt.io/kvm": "1k","devices.kubevirt.io/tun": "1k","devices.kubevirt.io/vhost-net": "1k","ephemeral-storage": "514937088Ki","h3c.com/vcuda-core": "0","h3c.com/vcuda-memory": "0","hugepages-1Gi": "0","hugepages-2Mi": "0","memory": "790609008Ki","nvidia.com/GV100GL_TESLA_V100_PCIE_16GB": "4","nvidia.com/gpu": "0","pods": "250"
}
- 确定 GPU 的 PCI 设备 ID。
可以在 PCI IDs 数据库中按设备名称进行搜索。
如果有节点的主机访问权限,可以使用以下命令列出 NVIDIA GPU 设备:
lspci -nnk -d 10de:
示例输出
]# lspci -nnk -d 10de:
60:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)Subsystem: NVIDIA Corporation Device [10de:1214]Kernel driver in use: nvidiaKernel modules: nouveau, nvidia_drm, nvidia
64:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)Subsystem: NVIDIA Corporation Device [10de:1214]Kernel driver in use: nvidiaKernel modules: nouveau, nvidia_drm, nvidia
65:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)Subsystem: NVIDIA Corporation Device [10de:1214]Kernel driver in use: nvidiaKernel modules: nouveau, nvidia_drm, nvidia
66:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)Subsystem: NVIDIA Corporation Device [10de:1214]Kernel driver in use: nvidiaKernel modules: nouveau, nvidia_drm, nvidia
或者通过如下命令查看设备的vid和pid:
]# lspci -nnv | grep -i nvidia
60:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)Subsystem: NVIDIA Corporation Device [10de:1214]Kernel driver in use: nvidiaKernel modules: nouveau, nvidia_drm, nvidia
64:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)Subsystem: NVIDIA Corporation Device [10de:1214]Kernel driver in use: nvidiaKernel modules: nouveau, nvidia_drm, nvidia
65:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)Subsystem: NVIDIA Corporation Device [10de:1214]Kernel driver in use: nvidiaKernel modules: nouveau, nvidia_drm, nvidia
66:00.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 16GB] [10de:1db4] (rev a1)Subsystem: NVIDIA Corporation Device [10de:1214]Kernel driver in use: nvidiaKernel modules: nouveau, nvidia_drm, nvidia
- 修改kubevirt CRD,添加GPU资源配置。
kubectl edit kubevirts.kubevirt.io -n kubevirt kubevirt
添加如下内容:
...
spec:certificateRotateStrategy: {}configuration:developerConfiguration:cpuAllocationRatio: 2featureGates:- HotplugVolumes- LiveMigration- Snapshot- AutoResourceLimitsGate- VMExport- ExpandDisks- HotplugNICs- VMLiveUpdateFeatures- GPU # 增加的配置- DisableMDEVConfiguration # 增加的配置。设置 DisableMDEVConfiguration 功能门控liveUpdateConfiguration:maxCpuSockets: 48maxGuest: 128Gimigrations:parallelMigrationsPerCluster: 30parallelOutboundMigrationsPerNode: 20permittedHostDevices:pciHostDevices:- externalResourceProvider: truepciVendorSelector: 10DE:1214 # 增加的配置,vid:pidresourceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GB # 增加的配置,gpu型号vmRolloutStrategy: LiveUpdatecustomizeComponents: {}imagePullPolicy: IfNotPresent
...
根据您的设备替换 YAML 中的值:
- 在
pciHostDevices
下,将pciVendorSelector
和resourceName
替换为您的 GPU 型号。
设置 externalResourceProvider=true
,以表明该资源由外部设备插件(即 GPU Operator 部署的 sandbox-device-plugin
)提供。
5. 配置虚拟机GPU直通
在 GPU Operator 完成将沙箱设备插件和 VFIO 管理器 pod 部署到工作节点上,并将 GPU 资源添加到 KubeVirt 允许列表之后,可以通过编辑 VirtualMachineInstance 清单中的 spec.domain.devices.gpus
字段,将 GPU 分配给虚拟机。
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
...
spec:domain:devices:gpus:- deviceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GBname: gpu1
...
deviceName
是表示设备的资源名称。name
是在虚拟机中用于标识该设备的名称。
已经存在的虚拟机配置单GPU直通
这里以已经创建的虚拟机为例。
kubectl edit vm -n vm-a34ceaea i-1hwrg6bn
在spec-domain-devices里新增gpu资源。
...- cdrom:bus: sataname: img-vm-0p9i3k9z- bootOrder: 3cdrom:bus: sataname: img-vm-rg29oicygpus:- deviceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GBname: gpu1interfaces:- macAddress: 00:00:00:78:5F:66
...
deviceName
是表示设备的资源名称。name
是在虚拟机中用于标识该设备的名称。
配置多GPU直通
如果虚拟机需要配置多块GPU,则在 spec-domain-devices
里新增多个 gpus
资源。
...- cdrom:bus: sataname: img-vm-0p9i3k9z- bootOrder: 3cdrom:bus: sataname: img-vm-rg29oicygpus:- deviceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GBname: gpu1- deviceName: nvidia.com/GV100GL_TESLA_V100_PCIE_16GBname: gpu2interfaces:- macAddress: 00:00:00:78:5F:66
...
注意:
虚拟机配置的GPU数量不超过所在节点的GPU数量。
6. 验证GPU直通
如果配置虚拟机时处于开机状态,修改完成后,需要重启虚拟机,进入系统后查看GPU设备是否直通成功。
]# lspci | grep -i nvidia
gpu-operator不会给该虚机安装nvidia驱动,虚拟机内使用GPU需要自行安装驱动。
7. 节点负载变更
将gpu直通工作节点配置为容器节点:
-
将该节点上挂载gpu资源的vm进行gpu资源卸载并关机
-
label修改节点工作负载为container
kubectl label node node3 --overwrite nvidia.com/gpu.workload.config=container
-
节点安装英伟达驱动
-
最终三台节点运行的gpu-operator组件列表如下
可以看出运行容器gpu负载的node3与运行虚拟机gpu负载的node1/2节点运行的组件是不同的。
dcgm-exporter-k48tk 1/1 Running 0 node3
gg-node-feature-discovery-master-8c4456d6d-d5rh2 1/1 Running 0 node3
gg-node-feature-discovery-worker-h25wc 1/1 Running 0 node3
gg-node-feature-discovery-worker-kqsqc 1/1 Running 0 node2
gg-node-feature-discovery-worker-sw74t 1/1 Running 0 node1
gpu-feature-discovery-24vgc 1/1 Running 0 node3
gpu-operator-56b9f58d9c-dzsk6 1/1 Running 0 node3
nvidia-container-toolkit-daemonset-htlvx 1/1 Running 0 node3
nvidia-device-plugin-daemonset-hdmwc 1/1 Running 0 node3
nvidia-operator-validator-m7kch 1/1 Running 0 node3
nvidia-sandbox-device-plugin-daemonset-fwb2q 1/1 Running 0 node2
nvidia-sandbox-device-plugin-daemonset-h4dtn 1/1 Running 0 node1
nvidia-sandbox-validator-294bd 1/1 Running 0 node1
nvidia-sandbox-validator-s4qrg 1/1 Running 0 node2
nvidia-vfio-manager-8f7xx 1/1 Running 0 node2
nvidia-vfio-manager-jszqg 1/1 Running 0 node1
smi-exporter-9s6x2 1/1 Running 0 node1
smi-exporter-b8wzc 1/1 Running 0 node3
smi-exporter-xg7rs 1/1 Running 0 node2
说明
gpu-operator设置driver.enabled=false,所以node3上默认没有驱动程序安装pod。
8. 参考
-
GPU Operator with KubeVirt:https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/gpu-operator-kubevirt.html
-
Host Devices Assignment:https://kubevirt.io/user-guide/compute/host-devices/#listing-permitted-devices
相关文章:
KubeVirt下gpu operator实践(GPU直通)
KubeVirt下gpu operator实践(GPU直通) 参考《在 KubeVirt 中使用 GPU Operator》,记录gpu operator在KubeVirt下实践的过程,包括虚拟机配置GPU直通,容器挂载GPU设备等。 KubeVirt 提供了一种将主机设备分配给虚拟机的机制。该机制具有通用性…...
Vue通过file控件上传文件到Node服务器
功能: 1.多文件同时上传、2.拖动上传、3.实时上传进度条、4.中断上传和删除文件、5.原生file控件的美化 搁置的功能: 上传文件夹、大文件切片上传、以及其他限制条件未处理 Node服务器的前置准备: 新建文件夹: file_upload_serve初始化npm: npm …...
如何在 SQL Server 中新增账户并指定数据库权限
在日常的数据库维护与开发中,管理用户的权限是必不可少的一环。本文将指导你如何在 SQL Server 中为新用户创建账户,并为其指定相应的数据库权限,使其只能查看有权访问的数据。我们将以步骤和代码示例的方式展示整个流程。用户权限分配包括:读取权限、写入权限、执行权限。…...
c#编码技巧(十九):各种集合特点汇总
.NET 常用集合对比: .NET 常见的线程安全集合 .NET 只读集合...
汽车软件DevOps解决方案
汽车软件DevOps解决方案是专为现代汽车行业设计的一套集成化需求、开发、测试、部署、OTA与监控,旨在加速软件开发流程,提高软件质量和安全性,同时确保整个生命周期的高效性和灵活性。以下是经纬恒润汽车软件DevOps解决方案的关键组成部分和优…...
同步的意义以及机制
一、同步的意义 同步(Synchronization)的意义在于确保在多线程环境中,多个线程对共享资源的访问是安全的,避免竞争条件(race conditions)和数据不一致的情况。 具体来说,同步的核心目标是&…...
leetcode 面试150之 156.LUR 缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -…...
启发式搜索算法复现
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月21日19点05分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…...
【IDE】使用指南
定期更新实用技能,建议关注收藏点赞。 友情链接: 点击跳转常见代码编辑器的报错解决方案 目录 常用快捷键pycharm右下角边栏脚本头安装IDE的插件git配置TODO 代码编辑器里有许多小技巧,便于办公。本篇主要以pycharm,vscode等主流常用IDE为…...
设计编程网站集:简述可扩展性系统设计(笔记)
视频连接:简述可扩展性系统设计 三个关键原则 无状态 松散耦合 异步处理 扩展 负载均衡 缓存 分片...
「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解
本篇将介绍 Cangjie 中的布尔类型,包括布尔值的定义、运算操作符、逻辑运算、布尔类型的常见应用场景及其在条件判断中的应用,帮助开发者理解和使用布尔类型。 关键词 布尔类型定义布尔运算逻辑运算符条件判断常见应用场景 一、布尔类型概述 布尔类型&…...
Fashion-VDM:引领视频虚拟试穿技术的新篇章
引言 随着虚拟现实和增强现实技术的飞速发展,视频虚拟试穿(VVT)已成为时尚产业的一大创新领域。然而,现有的VVT方法在服装细节和时间一致性方面仍存在诸多不足。为了解决这些问题,Johanna Karras等人提出了Fashion-VDM,一种基于视频扩散模型(VDM)的新型视频虚拟试穿技…...
Scala中的集合复习(1)
Map、Set、Array、List 一、集合的三大类 1.序列Seq表示有先后顺序的集合。(Array、List) 2.集Set:表示无序且不重复的集合。 3.映射Map:表示键值对。 Stack:栈,特点是:后进先出。 packag…...
Java依赖包漏洞检测命令
1、漏洞扫描工具 maven插件方式:Dependency-Check 2、命令 检查单个 Maven 工程的安全漏洞 mvn dependency-check:check 这个命令会在 target 目录下生成一个 dependency-check-report.html 文件,其中包含了依赖项的安全漏洞分析报告。 检查多个 M…...
【Java】强制类型转换
int a23; short b(short) a; 小的接受大的接受不了,强制类型转换. 带有Buffer的,带有流的,都是数组。 网络流,文件流都是数组. 这种就是流。 操作系统底层就是C. 没有直系关系的,不让转换 语法不报错,运行…...
RabbitMQ消息可靠性保证机制4--消费端限流
7.7 消费端限流 在类似如秒杀活动中,一开始会有大量并发写请求到达服务端,城机对消息进行削峰处理,如何做? 当消息投递的速度远快于消费的速度时,随着时间积累就会出现“消息积压”。消息中间件本身是具备一定的缓冲…...
查找萤石云IOS Sdk中的编解码接口
2021/1/20 以前的时候,碰到的问题,想把萤石云视频介入到TRTC,但是... 萤石云的IOS接口中没有相应的解码播放库,也就是找不到PlayerSDK对应部分,怎么做呢? 一个是坐等萤石云开放这部分接口,可能…...
erchas
#include <iostream> #include <vector> https://gitee.com/tongchaowei/front-native-page-template/tree/main/image-display/template-01 using namespace std; class BinaryTree { private: vector<char> tree; // 存储二叉树的数组 int size;…...
【网络安全】SSL(一):为什么需要 Keyless SSL?
未经许可,不得转载。 文章目录 背景正文背景 随着网站和应用程序向云端迁移,使用 HTTPS(SSL/TLS)加密流量已成为行业标准。然而,传统的 HTTPS 配置要求服务器持有网站的私钥,这在云计算环境中引发了一系列安全性和合规性问题。一旦云服务器遭到攻击,私钥泄露可能带来不…...
ggplot2 分面图等添加注释文字,相加哪里加哪里: 自定义函数 AddText()
如果分面图上还想再添加文字,只能使用底层的grid包了。 函数定义 # Add text to ggplot2 figures # # param label text you want to put on figure # param x position x, left is 0, right 1 # param y position y, bottom is 0, up 1 # param color text color…...
解读缓存问题的技术旅程
目录 前言1. 问题的突发与初步猜测2. 缓存的“隐身术”3. 缓存策略的深层优化4. 反思与感悟结语 前言 那是一个普通的工作日,团队例行的早会刚刚结束,我正准备继续优化手头的模块时,突然收到了用户反馈。反馈的内容是部分数据显示异常&#…...
洛谷P1597
语句解析 - 洛谷 语句解析 题目背景 木有背景…… 题目描述 一串长度不超过255的 PASCAL 语言代码,只有 a,b,c 三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是 [变量]:[变量或一位整数…...
2411rust,76~79
1.76.0稳定版 此版本较小 ABI兼容更新 函数指针文档中新增的ABI兼容部分介绍了函数签名与ABI兼容的意义.大部分是参数类型和返回类型的兼容,及在当前Rust中兼容的列表.文档仅描述现有兼容的状态. 一个新增功能是,现在保证符和u32是ABI兼容的.它们一直有相同大小和对齐方式,…...
vue2.0前端管理系统界面布局设置
前言 后台管理系统的核心就是用户管理、角色管理(含权限分配)、菜单管理,以及一些业务管理。业务管理通常以及根据不同的角色进行了权限分配。本次任务完成用户管理页面。 一 界面设计 1.引用Element 的Container 布局容器。 以上次博客中…...
4. SQL视图
MySQL中的视图(View)是一种虚拟表,本质是存储了一条SELECT语句。视图并不直接存储数据,而是动态生成结果集,帮助开发者简化查询逻辑和增强数据安全性。本文将从视图的基础概念到实际应用,逐步深入地探讨如何…...
Simulink学习笔记【PID UG联动仿真】
Simulink进行PID控制及调参: 建立系统动力学框图(把状态方程翻译出来),设置成subsystem建立PID反馈回路。示波器叫scope,多变量输出用demux和mux。可以用自动调参Tune模块,调整响应速度和稳定性࿰…...
【Python】30个Python爬虫的实战项目!!!(附源码)
Python爬虫是数据采集自动化的利器。本文精选了30个实用的Python爬虫项目,从基础到进阶,每个项目都配有完整源码和详细讲解。通过这些项目的实战,可以全面掌握网页数据抓取、反爬处理、并发下载等核心技能。 一、环境准备 在开始爬虫项目前…...
uni-app 界面TabBar中间大图标设置的两种方法
一、前言 最近写基于uni-app 写app项目的时候,底部导航栏 中间有一个固定的大图标,并且没有激活状态。这里记录下实现方案。效果如下(党组织这个图标): 方法一:midButton的使用 官方文档:ta…...
什么是Sass,有什么特点
Sass 概述 什么是 Sass? Sass(Syntactically Awesome Style Sheets)是一种 CSS 预处理器,它扩展了 CSS 的功能,使其更加强大和灵活。Sass 允许开发者使用变量、嵌套规则、混合宏、继承等高级特性,从而编写…...
服务器端渲染 (SSR) 与客户端渲染 (CSR)
嘿程序员!我们都知道,新时代的 Javascript 已经彻底改变了现代网站的结构和用户体验。如今,网站的构建更像是一个应用程序,伪装成一个能够发送电子邮件、通知、聊天、购物、支付等的网站。今天的网站是如此先进、互动,…...
小叮当网站建设/怎样推广app别人才愿意下载
近年来随着人们生活条件的不断提高,人们的饮食得到了很大的改善,但是在生活的同时,人们却容易患上了疾病,就比如说高血压近年来关于高血压的问题一直在不断的出现,而且高血压也越来越呈现出年轻化的趋势。对于患有高血…...
做网站用哪种语言/广州专门做seo的公司
重制实例的操作系统之后出现这种情况,解决办法:在本机shell执行 rm -rf ~/.ssh/known_hosts...
帝国cms乡村政府党建网站模板/淘宝关键词优化工具
奥维-外业调查的利器最近在做某高速公路,时间较为仓促,简单记录下点滴。▐ 适用场景现在修建高速公路,动辄就是上百公里,而且现场基本是荒郊野外,没有一个精确的导航根本找不到道路的线位。而奥维,就是这样…...
哪里有做网站公司/seo怎么学
爱情没有如果很多人喜欢给爱情做假设。 他说,如果你可以温柔点,我可以更爱你,不会轻易放弃你。 她说,如果你可以体贴点,我可以更珍惜你,我也不会离开你。 但,终究在一个时间的定格中交错走开。 …...
网站域名更换相应内容/搜索引擎排名优化方案
系列文章目录 Hadoop第一章:环境搭建 Hadoop第二章:集群搭建(上) Hadoop第二章:集群搭建(中) 文章目录系列文章目录前言一、自定义文件配置1.core-site.xml2.hdfs-site.xml3.hdfs-site.xml4.ma…...
哪个旅游网站做的最好/定制企业网站建设制作
前言 曾听过很多人说Android学习很简单,做个App就上手了,工作机会多,毕业后也比较容易找工作。这种观点可能是很多Android开发者最开始入行的原因之一。 在工作初期,工作主要是按照业务需求实现App页面的功能,按照设…...