Amazon Fargate使用Seekable OCI 实现更快的容器启动速度

前言

虽然在部署和扩展应用程序时,使用容器进行开发的方式已日趋流行,但仍有一些领域可以改进。扩展容器化应用程序的主要问题之一是启动时间长,尤其是在纵向扩展期间,需要添加较新的实例。此问题可能会对客户体验(例如,当网站需要横向扩展以提供额外流量时)产生负面影响。


文章目录

  • 前言
  • Amazon Fargate 对 SOCI 的支持
  • 创建存储库并推送容器镜像
  • 创建 SOCI 索引
  • 验证并推送 SOCI 索引
  • 了解 SOCI 性能
  • 部署和运行应用程序
  • 注意事项

一份研究论文表明,容器镜像下载占容器启动时间的 76%,但容器平均只需要 6.4% 的数据即可有效运行。启动和横向扩展容器化应用程序,需要从远程容器注册表下载容器镜像,因为必须先下载并解压缩整个镜像,然后才能启动应用程序,这会带来较大延迟。

该问题的解决方法之一是延迟加载(也称为异步加载)容器镜像。这种方法在启动应用程序的同时从容器注册表下载数据,例如 stargz-snapshotter 项目就是为了缩短容器的整体启动时间。

去年,我们推出了 Seekable OCI(SOCI),这是一项由亚马逊云科技开源的技术,它使容器运行时系统能够实现延迟加载容器镜像,从而在不修改容器镜像的情况下更快地启动应用程序。作为这项工作的一部分,我们开源了 SOCI Snapshotter,这是一款 snapshotter 插件,可在 containerd 中使用 SOCI 进行延迟加载。

Amazon Fargate 对 SOCI 的支持

Amazon Fargate 现在支持 Seekable OCI(SOCI),它使容器无需等待下载整个容器镜像即可启动,从而帮助应用程序更快地部署和横向扩展。在发布时,这项新功能可用于在 Amazon Fargate 上运行的 Amazon Elastic Container Service(Amazon ECS)应用程序。

以下简要介绍一下 Amazon Fargate 对 SOCI 的支持是如何运作的:

Amazon Fargate 对 SOCI 的支持是如何运作的?👆

SOCI 通过在现有容器镜像中创建文件索引(SOCI 索引)来运作。此索引是加快启动容器的关键因素,它可以从容器镜像中提取单个文件而不必下载整个镜像。应用程序不再需要等待完成对容器镜像的提取和解压操作,就可以开始运行。这使您可以更快地部署和横向扩展应用程序,并缩短应用程序更新的发布时间。

SOCI 索引与容器镜像分开生成和存储。这意味着无需转换容器镜像即可使用 SOCI,因此不会破坏基于安全哈希算法(SHA)的安全性,例如容器镜像签名。然后,索引与容器镜像一起存储于注册表中。在发布时,Amazon Fargate 对 SOCI 的支持与 Amazon Elastic Container Registry(Amazon ECR)配合使用。

当您将 Amazon ECS 与 Amazon Fargate 配合使用来运行 SOCI 索引的容器化镜像时,Amazon Fargate 会自动检测是否存在该镜像的 SOCI 索引,并启动容器,而无需等待提取整个镜像。这也意味着 Amazon Fargate 仍将继续运行没有 SOCI 索引的容器镜像。

我们开始吧!

有两种方法可以为容器镜像创建 SOCI 索引。

  • 使用 Amazon SOCI Index Builder:Amazon SOCI Index Builder 是一款在 Amazon Cloud 中索引容器镜像的无服务器解决方案。此 Amazon CloudFormation 堆栈部署 Amazon EventBridge 规则来识别 Amazon ECR 操作事件,并调用 Amazon Lambda 函数来匹配定义的筛选条件。然后,另一个 Amazon Lambda 函数生成 SOCI 索引并将其推送到 Amazon ECR 注册表中的存储库。

  • 手动创建 SOCI 索引:这种方法可以更灵活地创建 SOCI 索引,包括为 Amazon ECR 存储库中的现有容器镜像创建索引。要创建 SOCI 索引,您可以使用 soci-snapshotter 项目提供的 soci CLI。

Amazon SOCI Index Builder 为您提供了一种自动化流程,让您可以开始为容器镜像构建 SOCI 索引。 soci CLI 在索引生成方面为您提供更大的灵活性,并能够将索引生成原生集成到 CI/CD 管道中。

在本文中,我们将使用 soci-snapshotter 项目中的 soci CLI 手动生成 SOCI 索引。

创建存储库并推送容器镜像

首先,使用 Amazon CLI 为容器镜像创建了一个名为 pytorch-soci 的 Amazon ECR 存储库。


$ aws ecr create-repository --region us-east-1 --repository-name pytorch-soci

保留 Amazon ECR URI 输出并将其定义为变量,以便在下一步中更容易引用存储库。


$ ECRSOCIURI=xyz.dkr.ecr.us-east-1.amazonaws.com/pytorch-soci:latest

对于示例应用程序,我们使用来自亚马逊云科技深度学习容器的 PyTorch 训练(基于 CPU)容器镜像。因为默认情况下,Docker Engine 将容器镜像存储在 Docker Engine 镜像存储中,而不是 containerd 镜像存储中,所以使用 nerdctl CLI 来提取容器镜像。


$ SAMPLE_IMAGE="763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04" 
$ aws ecr get-login-password --region us-east-1 | sudo nerdctl login --username AWS --password-stdin xyz.dkr.ecr.ap-southeast-1.amazonaws.com
$ sudo nerdctl pull --platform linux/amd64 $SAMPLE_IMAGE

然后,标记在上一步中创建的存储库的容器镜像。


$ sudo nerdctl tag $SAMPLE_IMAGE $ECRSOCIURI

接下来,需要将容器镜像推送到 ECR 存储库中。


$ sudo nerdctl push $ECRSOCIURI

此时,容器镜像已经存在于 Amazon ECR 存储库中。

在这里插入图片描述


创建 SOCI 索引

接下来,我们需要创建 SOCI 索引。

SOCI 索引是允许延迟加载容器镜像的构件。SOCI 索引由 一个 SOCI 索引清单和一组 zTOC 组成。下图说明了 SOCI 索引清单中的组件,以及它如何引用容器镜像清单。

图片

SOCI 索引清单包含 zTOC 列表以及对生成清单的镜像的引用。zTOC 或压缩数据的目录,由两部分组成:

  1. TOC,一个包含文件元数据和解压后的 TAR 归档中相应偏移量的目录。
  2. zInfo,检查点集合,表示压缩引擎在容器镜像层中不同点的状态。

要了解有关该概念和术语的更多信息,请访问 soci-snapshotter 术语页面(https://github.com/awslabs/soci-snapshotter/blob/main/docs/glossary.md)。

在创建 SOCI 索引之前,需要安装 soci CLI。要了解有关如何安装soci 的更多信息,请访问 soci-snapshotter 入门(https://github.com/awslabs/soci-snapshotter/blob/main/docs/getting-started.md)。

我们使用 soci create 命令来创建 SOCI 索引。


$ sudo soci create $ECRSOCIURI
layer sha256:4c6ec688ebe374ea7d89ce967576d221a177ebd2c02ca9f053197f954102e30b -> ztoc skipped
layer sha256:ab09082b308205f9bf973c4b887132374f34ec64b923deef7e2f7ea1a34c1dad -> ztoc skipped
layer sha256:cd413555f0d1643e96fe0d4da7f5ed5e8dc9c6004b0731a0a810acab381d8c61 -> ztoc skipped
layer sha256:eee85b8a173b8fde0e319d42ae4adb7990ed2a0ce97ca5563cf85f529879a301 -> ztoc skipped
layer sha256:3a1b659108d7aaa52a58355c7f5704fcd6ab1b348ec9b61da925f3c3affa7efc -> ztoc skipped
layer sha256:d8f520dcac6d926130409c7b3a8f77aea639642ba1347359aaf81a8b43ce1f99 -> ztoc skipped
layer sha256:d75d26599d366ecd2aa1bfa72926948ce821815f89604b6a0a49cfca100570a0 -> ztoc skipped
layer sha256:a429d26ed72a85a6588f4b2af0049ae75761dac1bb8ba8017b8830878fb51124 -> ztoc skipped
layer sha256:5bebf55933a382e053394e285accaecb1dec9e215a5c7da0b9962a2d09a579bc -> ztoc skipped
layer sha256:5dfa26c6b9c9d1ccbcb1eaa65befa376805d9324174ac580ca76fdedc3575f54 -> ztoc skipped
layer sha256:0ba7bf18aa406cb7dc372ac732de222b04d1c824ff1705d8900831c3d1361ff5 -> ztoc skipped
layer sha256:4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888 -> ztoc sha256:0b4d78c856b7e9e3d507ac6ba64e2e2468997639608ef43c088637f379bb47e4
layer sha256:089632f60d8cfe243c5bc355a77401c9a8d2f415d730f00f6f91d44bb96c251b -> ztoc sha256:f6a16d3d07326fe3bddbdb1aab5fbd4e924ec357b4292a6933158cc7cc33605b
layer sha256:f18dd99041c3095ade3d5013a61a00eeab8b878ba9be8545c2eabfbca3f3a7f3 -> ztoc sha256:95d7966c964dabb54cb110a1a8373d7b88cfc479336d473f6ba0f275afa629dd
layer sha256:69e1edcfbd217582677d4636de8be2a25a24775469d677664c8714ed64f557c3 -> ztoc sha256:ac0e18bd39d398917942c4b87ac75b90240df1e5cb13999869158877b400b865

从上面的输出中,可以看出 soci CLI 为四层容器镜像层创建了 zTOC,这意味着将在容器镜像启动之前完整下载其他容器镜像层,只会延迟提取这四层。这是因为延迟加载非常小的容器镜像层对启动时间的影响较小。但是,在运行 soci create 时,您可以使用 --min-layer-size 标志来配置此行为。

验证并推送 SOCI 索引

soci CLI 还提供了几个命令来帮助您查看已生成的 SOCI 索引。

要查看所有索引清单的列表,可以运行以下命令。


$ sudo soci index list

DIGEST                                                                     SIZE    IMAGE REF                                                                                   PLATFORM       MEDIA TYPE                                    CREATED
sha256:ea5c3489622d4e97d4ad5e300c8482c3d30b2be44a12c68779776014b15c5822    1931    xyz.dkr.ecr.us-east-1.amazonaws.com/pytorch-soci:latest                                     linux/amd64    application/vnd.oci.image.manifest.v1+json    10m4s ago
sha256:ea5c3489622d4e97d4ad5e300c8482c3d30b2be44a12c68779776014b15c5822    1931    763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.5.1-cpu-py36-ubuntu16.04    linux/amd64    application/vnd.oci.image.manifest.v1+json    10m4s ago

虽然查看 zTOC 列表是选择性的,但在需要时,可以使用以下命令:


$ sudo soci ztoc list
DIGEST                                                                     SIZE        LAYER DIGEST
sha256:0b4d78c856b7e9e3d507ac6ba64e2e2468997639608ef43c088637f379bb47e4    2038072     sha256:4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
sha256:95d7966c964dabb54cb110a1a8373d7b88cfc479336d473f6ba0f275afa629dd    11442416    sha256:f18dd99041c3095ade3d5013a61a00eeab8b878ba9be8545c2eabfbca3f3a7f3
sha256:ac0e18bd39d398917942c4b87ac75b90240df1e5cb13999869158877b400b865    36277264    sha256:69e1edcfbd217582677d4636de8be2a25a24775469d677664c8714ed64f557c3
sha256:f6a16d3d07326fe3bddbdb1aab5fbd4e924ec357b4292a6933158cc7cc33605b    10152696    sha256:089632f60d8cfe243c5bc355a77401c9a8d2f415d730f00f6f91d44bb96c251b

这一系列 zTOC 包含 SOCI 所需的所有信息,可以在容器镜像层中查找给定文件。要查看每一层的 zTOC,可以使用前面输出的摘要总和之一,然后使用以下命令。


$ sudo soci ztoc info sha256:0b4d78c856b7e9e3d507ac6ba64e2e2468997639608ef43c088637f379bb47e4
{
  "version": "0.9",
  "build_tool": "AWS SOCI CLI v0.1",
  "size": 2038072,
  "span_size": 4194304,
  "num_spans": 33,
  "num_files": 5552,
  "num_multi_span_files": 26,
  "files": [
    {
      "filename": "bin/",
      "offset": 512,
      "size": 0,
      "type": "dir",
      "start_span": 0,
      "end_span": 0
    },
    {
      "filename": "bin/bash",
      "offset": 1024,
      "size": 1037528,
      "type": "reg",
      "start_span": 0,
      "end_span": 0
    }

---Trimmed for brevity---

现在,需要使用以下命令将所有与 SOCI 相关的构件推送到 Amazon ECR 中。


$ PASSWORD=$(aws ecr get-login-password --region us-east-1)
$ sudo soci push --user AWS:$PASSWORD $ECRSOCIURI

访问 Amazon ECR 存储库,就可以验证是否已创建索引。在这里,我们可以看到容器镜像旁边列出了另外两个对象:SOCI 索引镜像索引。镜像索引让 Amazon Fargate 可以查找与容器镜像关联的 SOCI 索引。

图片


了解 SOCI 性能

SOCI 的主要目标是最大限度地减少启动容器化应用程序所需的时间。要使用 SOCI 衡量 Amazon Fargate 延迟加载容器镜像的性能,我们需要了解容器镜像启动 SOCI 和不启动 SOCI 需要多长时间。

要了解每个容器镜像启动所需的持续时间,我可以使用 Amazon ECS 上的 DescribeTasks API 提供的指标。第一个指标是 createdAt ,这是创建任务并进入 PENDING 状态的时间戳。第二个指标是 startedAt ,即任务从 PENDING 状态转变为 RUNNING 状态的时间。

为此,我们使用相同的容器镜像创建了另一个 Amazon ECR 存储库,但没有生成 SOCI 索引,名为 pytorch-without-soci 。 如果要比较这些容器镜像,在 pytorch-soci 中还有另外两个对象(一个镜像索引和一个 SOCI 索引),它们在 pytorch-without-soci 中不存在。

图片


部署和运行应用程序

为了运行这些应用程序,我创建了一个名为 demo-pytorch-soci-cluster 的 Amazon ECS 集群、一个 VPC 和所需的 ECS 任务执行角色。如果您不熟悉 Amazon ECS,可以参阅 Amazon ECS 入门(https://docs.aws.amazon.com/AmazonECS/latest/developerguide/getting-started.html),了解如何部署和运行容器化应用程序。

现在,让我们以 FARGATE 为启动类型来部署和运行这两个容器镜像。我们为每个 pytorch-socipytorch-without-soci 定义了五个任务。


$ aws ecs \ 
    --region us-east-1 \ 
    run-task \ 
    --count 5 \ 
    --launch-type FARGATE \ 
    --task-definition arn:aws:ecs:us-east-1:XYZ:task-definition/pytorch-soci \ 
    --cluster socidemo 

$ aws ecs \ 
    --region us-east-1 \ 
    run-task \ 
    --count 5 \ 
    --launch-type FARGATE \ 
    --task-definition arn:aws:ecs:us-east-1:XYZ:task-definition/pytorch-without-soci \ 
    --cluster socidemo

几分钟后,ECS 集群上有 10 个正在运行的任务。

在这里插入图片描述

确认所有任务都在运行后,我们运行以下脚本以获取两个指标: createdAtstartedAt


#!/bin/bash
CLUSTER=<CLUSTER_NAME>
TASKDEF=<TASK_DEFINITION>
REGION="us-east-1"
TASKS=$(aws ecs list-tasks \
    --cluster $CLUSTER \
    --family $TASKDEF \
    --region $REGION \
    --query 'taskArns[*]' \
    --output text)

aws ecs describe-tasks \
    --tasks $TASKS \
    --region $REGION \
    --cluster $CLUSTER \
    --query "tasks[] | reverse(sort_by(@, &createdAt)) | [].[{startedAt: startedAt, createdAt: createdAt, taskArn: taskArn}]" \
    --output table

对没有 SOCI 索引的容器镜像( pytorch-without-soci )运行上述命令会产生以下输出:


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                   DescribeTasks                                                                                   |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
|             createdAt            |             startedAt             |                                                  taskArn                                                   |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
|  2023-07-07T17:43:59.233000+00:00|  2023-07-07T17:46:09.856000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/dcdf19b6e66444aeb3bc607a3114fae0   |
|  2023-07-07T17:43:59.233000+00:00|  2023-07-07T17:46:09.459000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/9178b75c98ee4c4e8d9c681ddb26f2ca   |
|  2023-07-07T17:43:59.233000+00:00|  2023-07-07T17:46:21.645000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/7da51e036c414cbab7690409ce08cc99   |
|  2023-07-07T17:43:59.233000+00:00|  2023-07-07T17:46:00.606000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/5ee8f48194874e6dbba75a5ef753cad2   |
|  2023-07-07T17:43:59.233000+00:00|  2023-07-07T17:46:02.461000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/58531a9e94ed44deb5377fa997caec36   |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+

根据每项任务的平均累计时间差异(从 startedAtcreatedAt 之间), pytorch-without-soci (没有 SOCI 索引)在 129 秒后成功运行。

接下来,对带有 SOCI 索引的 pytorch-soci 运行同样的命令。


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                   DescribeTasks                                                                                   |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
|             createdAt            |             startedAt             |                                                  taskArn                                                   |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+
|  2023-07-07T17:43:53.318000+00:00|  2023-07-07T17:44:51.076000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/c57d8cff6033494b97f6fd0e1b797b8f   |
|  2023-07-07T17:43:53.318000+00:00|  2023-07-07T17:44:52.212000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/6d168f9e99324a59bd6e28de36289456   |
|  2023-07-07T17:43:53.318000+00:00|  2023-07-07T17:45:05.443000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/4bdc43b4c1f84f8d9d40dbd1a41645da   |
|  2023-07-07T17:43:53.318000+00:00|  2023-07-07T17:44:50.618000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/43ea53ea84154d5aa90f8fdd7414c6df   |
|  2023-07-07T17:43:53.318000+00:00|  2023-07-07T17:44:50.777000+00:00 |  arn:aws:ecs:ap-southeast-1:xyz:task/demo-pytorch-soci-cluster/0731bea30d42449e9006a5d8902756d5   |
+----------------------------------+-----------------------------------+------------------------------------------------------------------------------------------------------------+

此处看到启用了 SOCI 的容器镜像 pytorch-soci 是在创建 60 秒后启动的。

这意味着,与不使用 SOCI 索引运行示例应用程序相比,在 Amazon Fargate 上运行使用 SOCI 索引的示例应用程序要快约 50%。

建议在使用 SOCI 和不使用 SOCI 的情况下对应用程序的启动和横向扩展时间进行基准测试。这可以帮助您更好地了解应用程序的运行情况,以及您的应用程序是否受益于 Amazon Fargate 对 SOCI 的支持。


注意事项

可用性:Amazon Fargate 对 SOCI 的支持适用于所有提供 Amazon ECS、Amazon Fargate 和 Amazon ECR 的亚马逊云科技区域。

定价:Amazon Fargate 对 SOCI 的支持无需额外付费,您只需为在 Amazon ECR 中存储 SOCI 索引付费。

入门:在 Amazon Fargate 对 SOCI 的支持页面上详细了解优势以及入门指南。

https://www.usenix.org/conference/fast16/technical-sessions/presentation/harter


在这里插入图片描述

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

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

相关文章

EfficientDet论文讲解

目录 EfficientDet 0、摘要 1、整体架构 1.1 BackBone&#xff1a;EfficientNet-B0 1.2 Neck&#xff1a;BiFPN特征加强提取网络 1.3 Head检测头 1.4 compound scaling 2、anchors先验框 3、loss组成 4、论文理解 5、参考资料 EfficientDet 影响网络的性能(或者说规…

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.life…

【Linux】服务器与磁盘补充知识,硬raid操作指南

服务器硬件 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.硬盘尺寸: 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 2.如何在服务器上制作raid 华为服务器为例子做…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(一)

熟悉项目环境 1. 苍穹外卖项目介绍1.1 项目介绍1.2 技术选型 2. 开发环境搭建2.1 前端环境2.2 后端环境搭建2.3 Git版本控制2.4 nginx反向代理和负载均衡 3.登录功能4. Swagger4.1 介绍4.2 使用步骤4.3 常用注解 1. 苍穹外卖项目介绍 1.1 项目介绍 苍穹外卖是专门为餐饮企业&…

JAVA前端开发介绍

以一个网站为例包括网站设计、前端开发、程序开发等。网站设计就是网站的外观&#xff0c;平面的东西。程序开发也好理解就是功能实现。而前端开发&#xff0c;简单来说&#xff0c;就是把平面效果图转换成网页&#xff0c;把静态转换成动态。它的工作包括了:切图、写样式、做鼠…

rust闭包

rust闭包 参考 Rust有三个闭包trait&#xff1a;Fn、FnMut和FnOnce&#xff0c;编译器会根据闭包内代码的行为自动为闭包实现这些trait。 上面这段话超级重要&#xff01;&#xff01;&#xff01; 对于不可变或移动捕获变量的闭包&#xff0c;编译器会实现Fn trait&#xff0…

三维模型几何坐标精度偏差应采用主要措施

三维模型几何坐标精度偏差应采用主要措施 降低倾斜摄影三维模型几何精度偏差是提高模型质量和准确性的关键任务。下面将浅谈降低倾斜摄影三维模型几何精度偏差应采用的主要措施。 1、倾斜角度选择&#xff1a;倾斜角度对于几何精度具有重要影响。选择适当的倾斜角度可以优化视…

项目管理之如何监控项目健康状态

项目管理是一个复杂且关键的过程&#xff0c;涉及到多个关键因素&#xff0c;包括项目名称、项目管理委员会成员、项目经理、项目生命周期的各个阶段以及资源泳道等。如何有效地监控项目的健康状态是确保项目成功的重要环节。本文将详细介绍项目管理全景图及其在风险识别中的应…

JAVA二叉搜索树(专门用来查找)

目录 二叉搜索树又叫二叉排序树&#xff0c;它具有以下特征 二次搜索树的效率 模拟最简二叉搜索树代码 代码片段分析 查找二叉搜索树数据&#xff1a; 如果我们用递归的方法查找数据有什么不一样? 插入数据 删除数据(难点) 二叉搜索树又叫二叉排序树&#xff0c;它具有以下特征…

C++ day3作业

1> 思维导图 2> 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void s…

【EMD】1.初识经验模态分解EMD

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* author jUicE_g2R(qq:3406291309)* * language MATLAB/Python/C/C* EDA Base on matlabR2022b* editor Obsidian&#xff08;黑曜石笔记软件&#xff09;* * copyright 2023* …

LED点阵显示原理(取字模软件+Keil+Proteus)

前言 写这个的时候我还是有点生气的&#xff0c;因为发现完全按照书上面的步骤来&#xff0c;结果发现不理想&#xff0c;后面还是自己调试才解决了。-_-说多了都是泪&#xff0c;直接进入正文。 软件的操作还是参考我之前的博客。 LED数码管的静态显示与动态显示&#xff0…

nssm将exe应用封装成windows服务

一、简介 NSSM&#xff08;Non-Sucking Service Manager&#xff09;是一个用于在Windows操作系统上管理和运行应用程序作为服务的工具。它提供了一种简单的方法来将任意可执行文件转换为Windows服务&#xff0c;并提供了一些额外的功能和配置选项。 优点&#xff1a; 简单易…

ifream标签中的子页面,操作父页面的元素

问题描述&#xff1a;子页面内容发生变化时&#xff0c;导航栏不会跟切换 解决办法&#xff1a; window.parent.document.getElementById demo html1 <html> <head><meta charset"UTF-8"><!-- import CSS --><link rel"stylesh…

一站式解决方案:体验亚马逊轻量服务器/VPS的顶级服务与灵活性

文章目录 一、什么是轻量级服务器/VPS 二、服务器创建步骤 三、服务器连接客户端(私钥登录) 四、使用服务器搭建博客网站 五、个人浅解及总结 一、什么是轻量级服务器/VPS 亚马逊推出的轻量级服务器/VPS&#xff1a;是一种基于云计算技术的虚拟服务器解决方案。它允许用户…

Spring Boot 整合SpringSecurity和JWT和Redis实现统一鉴权认证

&#x1f4d1;前言 本文主要讲了Spring Security文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

XShelll-修改快捷键-xftp-修改编辑器

文章目录 1.XShelll-修改快捷键2.Xftp-修改文本编辑器3.总结 1.XShelll-修改快捷键 工具>选项 鼠标键盘&#xff0c;右键编辑&#xff0c;新建快捷键。 复制粘贴改成shiftc,shiftv。更习惯一些。 2.Xftp-修改文本编辑器 xftp修改服务器文件默认的编辑器&#xff0c;是记…

重新思考边缘负载均衡

本文介绍了Netflix在基于轮询的负载均衡的基础上&#xff0c;集成了包括服务器使用率在内的多因素指标&#xff0c;并对冷启动服务器进行了特殊处理&#xff0c;从而优化了负载均衡逻辑&#xff0c;提升了整体业务性能。原文: Rethinking Netflix’s Edge Load Balancing[1] 我…

2023李宏毅机器学习HW05样例代码中文注释版

这里只是 2023 李宏毅机器学习 HW05 样例代码的中文注释版的分享&#xff0c;下面的内容绝大部分是样例代码&#xff0c;补充了小部分函数的功能解释&#xff0c;没有做函数功能上的修改&#xff0c;是 Simple baseline 版本。 notebook 代码下载: [EN] [ZH] 文章目录 作业描述…

lazarus:数据集快速导出为excel、csv、sql及其他多种格式

lazarus被成为快速开发工具&#xff0c;为什么说“快速”&#xff0c;重要的一点是&#xff0c;很多工具是现成的&#xff0c;可以拿来直接就用。比如数据导出&#xff0c;如果需要把数据集导出为excel格式文件&#xff0c;写代码可能需要很多时间。lazarus就不用了&#xff0c…