基于 Graviton2处理器构建容器化基因分析工作负载

news2024/12/22 23:37:05

概述

相对于基于传统 x86架构的处理器来说,Amazon 设计的基于 ARM 架构的 Graviton 处理器为 EC2中运行的云工作负载提供了更佳的性价比。基于 Graviton2 的实例支持广泛的通用型、突发型、计算优化型、内存优化型、存储优化型和加速计算型工作负载,包括应用程序服务器、微服务、高性能计算 (HPC)、基于 CPU 的机器学习 (ML) 推理、视频编码、电子设计自动化、游戏、开源数据库和内存中的缓存等。由 Graviton2 处理器支持的 EC2实例 (M6g、C6g、R6g和T4g) 在中国区已经上线一段时间,本文以土壤微生物宏基因测序为例,来演示如何利用Amazon Batch 服务调用基于 Graviton2处理器的实例用于基因分析,并且验证 Graviton2相对于 x86架构的处理器能够给用户带来的收益。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

 

先决条件

您需要一个 Amazon 帐户来完成本演练,其它条件包括(本篇不再描述其具体使用方式):

  • Amazon CLI v2安装和配置
  • 完成 VPC 的设置,包括公有子网、私有子网和 NAT 的配置等
  • 熟悉 EC2服务的使用,熟悉 EFS、S3等存储服务的使用
  • 熟悉 Batch 服务的使用,包括计算环境、任务队列、任务定义的配置
  • 熟悉生信软件(bwa,samtools,coverm)的安装配置
  • 熟悉容器的使用

整体架构

本文演示了一个基于 Amazon Batch 服务来进行任务调度的方案, Batch 是 Amazon 托管的一个批量计算服务,用户可以通过它运行任意规模的容器化工作负载,目前已经广泛应用于基因分析、药物研发等高性能计算的场景。本方案整体架构及用到的服务如下:

image.png

方案描述:

  • Batch 批量计算任务调度,启动大量计算节点用于计算
  • S3 存储输入和输出数据
  • EFS 映射到容器中,用于存放运行脚本
  • DynamoDB 保存输入数据的信息及处理状态,运行脚本从中读取需要处理的文件列表并更新处理状态
  • ECR 作为容器镜像仓库
  • CloudWatch 监控性能指标及查看日志
  • 开源软件 goofys,挂载 S3存储桶到容器中,简化 S3上数据读取方式,优化 S3到 EC2的数据读取性能
  • 跳板机,用于操作云上资源

软件适配 把原先在 x86架构下的工作负载迁移到 ARM 架构下,首先我们要在 ARM 架构下完成软件的适配。本次演示主要用到 bwa,samtools 和 coverm 三个软件,以下演示如何在 ARM 架构下完成对这些软件的编译并且构建容器镜像。

EC2

启动一台 EC2使用作为开发环境,AMI:Amazon Linux2,实例类型 t4g.medium(必须是 Graviton 机型)。若在中国区编译 coverm 碰到网络问题,可在 Global 区域启动该 EC2,做完容器镜像后直接推送回中国区的 ECR。

安装 Docker

sudo yum update -y
sudo amazon-linux-extras install docker -y
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user

登录 EC2安装 docker 后,退出,再重新登录以接受新的 docker 组权限

AWSCLI v2

curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

配置好中国区 AK/SK,为了后续推送容器镜像到国内 ECR

基础镜像

docker pull centos

创建一个目录用于保存后续构建容器镜像需要的文件

mkdir docker
cd docker

bwa

wget https://github.com/lh3/bwa/releases/download/v0.7.17/bwa-0.7.17.tar.bz2
wget https://gitlab.com/arm-hpc/packages/uploads/ca862a40906a0012de90ef7b3a98e49d/sse2neon.h

samtools

wget https://github.com/samtools/samtools/releases/download/1.15.1/samtools-1.15.1.tar.bz2

coverm

起一个容器编译 coverm

docker run --name coverm -v /home/ec2-user/docker:/data -itd centos

进入容器

docker exec -it coverm bash
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* 
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum install git gcc cmake3 -y
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
git clone https://github.com/wwood/CoverM
cd CoverM
cargo build --release

复制可执行文件到外部存储

cp target/release/coverm /data/coverm

goofys

goofys 用于将 S3存储桶映射到容器中,简化 S3文件读取,将文件直接从 S3读取到 EC2内存,无需落盘,从而加快文件读取速率

编译

yum install go
git clone https://github.com/kahing/goofys.git
cd goofys
GOOS=linux GOARCH=arm64 go build

复制可执行文件到外部存储

cp goofys /data/goofys

退出容器

exit

镜像构建

确保 bwa-0.7.17.tar.bz2, samtools-1.15.1.tar.bz2, coverm, goofys, awscliv2.zip 和 sse2neon.h 已经保存到之前创建的 docker 目录,编辑如下 Dockerfile:

FROM centos
ADD bwa-0.7.17.tar.bz2 samtools-1.15.1.tar.bz2 coverm goofys awscliv2.zip sse2neon.h /opt/

WORKDIR /opt
RUN \ 
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && \
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* && \
yum install unzip gcc-c++ make autoconf ncurses-devel bzip2 bzip2-devel xz-devel zlib-devel fuse fuse-devel -y && \
yum clean all && \
#awscli
unzip awscliv2.zip && \
./aws/install && \
rm -rf awscliv2.zip aws && \
#bwa
cd bwa-0.7.17 && \
sed -i -e 's/<emmintrin.h>/"sse2neon.h"/' ksw.c && \
mv /opt/sse2neon.h . && \
make && \
cd .. && \
#samtools
cd samtools-1.15.1 && \
autoheader && \
autoconf -Wno-syntax && \
./configure && \
make && \
make install && \
cd .. && \
#coverm
mkdir tools && \
mv coverm tools && \
#goofys
mv goofys tools

WORKDIR /data

ENV PATH=$PATH:/opt/bwa-0.7.17:/opt/tools/

构建镜像

docker build -t mapping-graviton .  

创建 ECR 镜像仓库 mapping-graviton 并查看推送命令推送镜像到该仓库

image.png

云上环境设置

S3

S3存储桶包含3个目录

image.png

source 目录存放输入序列,results 存放结果数据

image.png

ref_data 目录存放参考基因组的索引库

image.png

DynamoDB

创建一张表用于保存 S3上的输入序列信息,投递任务的脚本从表中读取需要处理的基因序列列表,循环投递任务。在任务运行的时候,根据不同的处理阶段,更新表中对应序列的状态值。

参照以下命令向表中插入数据:

aws ddb put reads_graviton '{sample: 'SRR11676645', r1: 'source/SRR11676645_1.fastq.gz', r2: 'source/SRR11676645_2.fastq.gz', status: '0'}'

image.png

EFS

创建一个 EFS 文件系统(fs-0a8685ad57ce63a3f),开发环境挂载 EFS 文件系统,在文件系统中创建 mapping 目录,保存 mapping.sh 到该目录下(放在容器外面主要是为了调试及修改方便,不用每次都重新构建镜像)

image.png

EC2启动模板

修改根卷为 gp3,200G(根据实际需要调整大小),设备名称指定自定义值/dev/xvda

image.png

在测试阶段,若需要监控内存使用率,可在高级详细信息→用户数据,输入以下 CloudWatch Agent 配置

在生产阶段,如果有大量任务运行,建议不要配置 CloudWatch Agent,因为有可能产生指标数量过多的费用

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/x-shellscript; charset="us-ascii"

#!/bin/bash
yum install amazon-cloudwatch-agent -y
cat << EOF > /opt/aws/amazon-cloudwatch-agent/bin/config.json 
{
    "agent": {
        "metrics_collection_interval": 30,
        "run_as_user": "root"
    },
    "metrics": {
        "append_dimensions": {
            "InstanceId": "\${aws:InstanceId}",
            "InstanceType": "\${aws:InstanceType}"
        },
        "metrics_collected": {
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 30
            },
            "swap": {
                "measurement": [
                    "swap_used_percent"
                ],
                "metrics_collection_interval": 30
            }
        }
    }
}
EOF
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

--==MYBOUNDARY==--

IAM 角色

Batch 需要的两个角色,附加合适的权限

image.png

ecsInstanceRoleBatchJobRole

image.png

计算环境

创建配置文件 ce.json:

subnets:配置了 NAT 网关路由的私有子网

securityGroupIds:默认安全组 id

instanceTypes:使用的 r6g 实例类型 tags:EC2标签

123456789012:换成您自己的12位 Amazon 账户 id

{
    "computeEnvironmentName": "env-mapping-graviton",
    "type": "MANAGED",
    "state": "ENABLED",
    "computeResources": {
        "type": "EC2",
        "allocationStrategy": "BEST_FIT",
        "minvCpus": 0,
        "maxvCpus": 2560,
        "desiredvCpus": 0,
        "instanceTypes": [
            "r6g"
        ],
        "subnets": [
            "subnet-03388bca5b37db2b9",
            "subnet-0fafc120e429ec25d"
        ],
        "securityGroupIds": [
            "sg-0468dd9696811b7b8"
        ],
        "instanceRole": "arn:aws-cn:iam::123456789012:instance-profile/ecsInstanceRole",
        "tags": {
            "Name": "batch-mapping-graviton"
        },
        "launchTemplate": {
            "launchTemplateName": "lt-batch-zju",
            "version": "9"
        }
    },
    "serviceRole": "arn:aws-cn:iam::123456789012:role/aws-service-role/batch.amazonaws.com/AWSServiceRoleForBatch"
}

创建计算环境

aws batch create-compute-environment --cli-input-json file://ce.json

任务队列

创建配置文件 jq.json:

computeEnvironment:上一步创建的计算环境的 arn

{
    "jobQueueName": "q-mapping-graviton",
    "state": "ENABLED",
    "priority": 1,
    "computeEnvironmentOrder": [
        {
            "order": 1,
            "computeEnvironment": "arn:aws-cn:batch:cn-northwest-1:123456789012:compute-environment/env-mapping-graviton"
        }
    ]
}

创建任务队列

aws batch create-job-queue --cli-input-json file://jq.json

任务定义

创建配置文件 jd.json:

privileged: 容器中运行 goofys 需要开启特权模式,设为 true

{
    "jobDefinitionName": "jd-mapping-graviton",
    "type": "container",
    "parameters": {
        "r2": "source/SRR11676645_2.fastq.gz",
        "dbtable": "reads_graviton",
        "sample": "SRR11676645",
        "script": "mapping.sh",
        "r1": "source/SRR11676645_1.fastq.gz"
    },
    "containerProperties": {
        "image": "123456789012.dkr.ecr.cn-northwest-1.amazonaws.com.cn/mapping-graviton:latest",
        "command": [
            "sh",
            "Ref::script",
            "Ref::sample",
            "Ref::r1",
            "Ref::r2",
            "Ref::dbtable"
        ],
        "jobRoleArn": "arn:aws-cn:iam::123456789012:role/BatchJobRole",
        "volumes": [
            {
                "name": "efs",
                "efsVolumeConfiguration": {
                    "fileSystemId": "fs-0a8685ad57ce63a3f",
                    "rootDirectory": "mapping"
                }
            }
        ],
        "environment": [
            {
                "name": "S3_MOUNT_POINT",
                "value": "/s3"
            }
        ],
        "mountPoints": [
            {
                "containerPath": "/data",
                "sourceVolume": "efs"
            }
        ],
        "privileged": true,
        "resourceRequirements": [
            {
                "value": "64",
                "type": "VCPU"
            },
            {
                "value": "500000",
                "type": "MEMORY"
            }
        ]
    },
    "platformCapabilities": [
        "EC2"
    ]
}

注册任务定义

aws batch register-job-definition --cli-input-json file://jd.json

任务脚本 mapping.sh

实际任务运行所调用的脚本(保存到 EFS 的 mapping 目录下)

sample=$1
r1=$2
r2=$3
dbtable=$4
echo 'sample: '$sample', r1: '$r1', r2: '$r2', dbtable: '$dbtable

echo 'mount s3 bucket'
mkdir -p $S3_MOUNT_POINT
goofys --region cn-northwest-1 sun-test $S3_MOUNT_POINT
base_dir=$S3_MOUNT_POINT
ls -lh $base_dir

echo 'job done set status to 1'
aws dynamodb execute-statement --statement "UPDATE $dbtable SET status=1 WHERE sample='$sample'"

echo 'bwa start'
mkdir /result
bwa mem -t 64 $base_dir/ref_data/derep_all.fa $base_dir/$r1 $base_dir/$r2 > /result/$sample.sam
echo 'samtools start'
samtools sort /result/$sample.sam -@ 64 -o /result/$sample.bam
echo 'rm sample'
rm /result/$sample.sam

echo 'job done set status to 2'
aws dynamodb execute-statement --statement "UPDATE $dbtable SET status=2 WHERE sample='$sample'"

echo 'coverm filter start'
coverm filter --min-read-percent-identity 0.95 --min-read-aligned-percent 0.75 -b /result/$sample.bam -o /result/${sample}_filter.bam -t 64
echo 'copy '${sample}_filter.bam' to s3'
mkdir -p $base_dir/results/$dbtable
cp /result/${sample}_filter.bam $base_dir/results/$dbtable/

echo 'job done set status to 3'
aws dynamodb execute-statement --statement "UPDATE $dbtable SET status=3 WHERE sample='$sample'"

echo 'rm result '$sample.bam' from local disk'
rm /result/$sample.bam

echo 'coverm contig start'
coverm contig --trim-max 90 --trim-min 10 --min-read-aligned-percent 70 -t 64 --bam-files /result/${sample}_filter.bam > /result/${sample}_coverage.csv
echo 'copy to s3'
cp /result/${sample}_coverage.csv $base_dir/results/$dbtable

echo 'job done set status to 4'
aws dynamodb execute-statement --statement "UPDATE $dbtable SET status=4 WHERE sample='$sample'"

echo 'rm result '${sample}_filter.bam' from local disk'
rm /result/${sample}_filter.bam

run_mapping.sh

通过 run_mapping.sh 来读取数据库中序列信息并循环提交多个 Batch 任务,该脚本可在跳板机或本地执行

dbtable='reads_graviton'
item=`aws ddb select $dbtable --filter 'status = 0' `
count=`echo $item | awk '{print $2}'`
echo 'count: '$count
if [ $count -eq 0 ]
then
        echo 'end'
        break
fi
info=`echo $item | awk '{for(i=10;i<=NF;i=i+9){print $i}}'`
fastq_1=`echo $item | awk '{for(i=6;i<=NF;i=i+9){print $i}}'`
fastq_2=`echo $item | awk '{for(i=8;i<=NF;i=i+9){print $i}}'`

for ((i=1;i<=$count;i++))
do
        sample=`echo $info|awk '{print $'$i'}'`
        echo 'sample= '$sample
        r1=`echo $fastq_1|awk '{print $'$i'}'`
        echo 'r1= '$r1
        r2=`echo $fastq_2|awk '{print $'$i'}'`
        echo 'r2= '$r2      
        jobname=${dbtable}_${sample%.*}
        echo 'jobnane= '$jobname
        aws batch submit-job --job-name $jobname --job-queue q-mapping-graviton --job-definition jd-mapping-graviton:1 --parameters script=mapping.sh,sample=$sample,r1=$r1,r2=$r2,dbtable=$dbtable
done

测试

按照类似的方法再创建一套基于 x86架构的 Batch 计算环境、任务队列、任务定义(不再赘述创建方法),相同的任务分别投递到 arm 和 x86环境,进行对比测试。

单个序列比对任务需要用到的内存为300G+,故使用类型为r6g.16xlarge 和 r5.16xlarge 的 EC2实例进行对比测试, 测试结果如下:

CPU/MEM 监控-CloudWatch

SRR11676645

image.png

SRR11676933

image.png

FDMS190655335

image.png

在计算阶段,r6g.16xlarge 和 r5.16xlarge 的资源利用率几乎一致,CPU 利用率都能到100%,内存利用率都为60%左右

用时

image.png

r6g.16xlarge 相对 r5.16xlarge 所需时间大约减少16%左右

EC2价格对比

image.png

r6g.16xlarge相对r5.16xlargeEC2价格大约下降20%左右

结论

基于 Batch 的任务调度,在计算任务完成之后,Batch 会自动终止不再运行任务的 EC2实例,所以时间的节约也能带来 EC2和 EBS 的成本节约。根据以上测试结果,在基因测序序列比对这个场景下,使用 ARM 架构的 Graviton 实例,相对于5代 x86实例,能有:

  • 16%左右时间节约
  • 16%左右 EBS 成本节约
  • 1 – (1-16%) x (1-20%) = 32.8%左右 EC2成本节约

在这篇文章中,我们演示了如何基于 Graviton2处理器所支持的 EC2实例,在 Amazon 上使用 Batch 服务来运行基因测序的工作负载。并且根据测试的结果,使用 Graviton2处理器用于基因测序的序列比对场景,能够很好的满足用户对于性能和成本的需求。只要您的工作负载所用的操作系统和软件能够适配 ARM 架构,在 Amazon 上就可以利用 Graviton 处理器高性价比的特点来达到降本增效的目的。

参考文档

Amazon Batch 用户指南:

什么是 AWS Batch? - AWS Batch

利用 Amazon Batch 来为容器化负载调用海量云端算力:

利用 AWS Batch 来为容器化负载调用海量云端算力 | 亚马逊AWS官方博客

在云中对基因组学工作负载进行基准测试的通用方法:在 Graviton2 上运行 BWA 读取对齐器:

A generalized approach to benchmarking genomics workloads in the cloud: Running the BWA read aligner on Graviton2 | AWS Public Sector Blog

本篇作者

image.png

孙亮

Amazon 解决方案架构师,硕士毕业于浙江大学计算机系。在加入 Amazon 之前,拥有多年软件行业开发经验。目前在 Public Sector 部门主要服务于生命科学和医疗健康相关的行业客户,致力于提供有关 HPC、容器、无服务器、数据安全等各类云计算解决方案的咨询与架构设计。

image.png

刘光

Amazon 资深解决方案架构师,目前负责基于 Amazon 云计算方案架构的咨询和设计,同时致力于 Amazon 云服务在政企、教育和医疗行业客户的推广。在加入 Amazon 之前就职于 Citrix,具有多年企业虚拟化、VDI 架构设计和支持经验。

文章来源:https://dev.amazoncloud.cn/column/article/6309981076658473a321ffc1?sc_medium=regulartraffic&amp;sc_campaign=crossplatform&amp;sc_channel=CSDN 

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

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

相关文章

重生之我要学c++第二课

在上期内容&#xff0c;我们讲述了c相比于C语言的更简易之处&#xff0c;本期就让我们继续学习相关的知识&#xff0c;了解c宇宙 引用(起别名) 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它…

基于 KubeKey 扩容 Kubernetes v1.24 Worker 节点实战

前言 知识点 定级&#xff1a;入门级KubeKey 扩容 Worker 节点openEuler 操作系统的基本配置Kubernets 基本命令 实战服务器配置(架构 1:1 复刻小规模生产环境&#xff0c;配置略有不同) 主机名IPCPU内存系统盘数据盘用途ks-master-0192.168.9.912450100KubeSphere/k8s-mas…

新能源汽车的发展

目录 1.什么是新能源 2.什么是新能源汽车 3.新能源汽车的优点 4.新能源汽车的危害 5.新能源汽车未来的发展 1.什么是新能源 新能源是指与传统能源&#xff08;如化石燃料&#xff09;相比&#xff0c;更具可再生性、清洁性和低碳排放的能源形式。它主要通过利用自然资源和可…

C语言---每天小练习,从大到小输出

题目&#xff1a;从大到小输出 写代码将三个整数数按从大到小输出。 例如&#xff1a; 输入&#xff1a;2 3 1 输出&#xff1a;3 2 1 int main() {// 初始化int a 0;int b 0;int c 0;int d 0;scanf("%d %d %d", &a, &b, &c);if (a < b) {…

Unity Shader - UI/Default shader 优化示例

文章目录 环境优化示例Texture Format : Alpha 8 和 shaderlab : _TextureSampleAddshaderlab : _UIMaskSoftnessX 和 _UIMaskSoftnessYshaderlab _Colorshader ARM Mobile Studio - Graphics Analyzer优化前优化后 环境 Unity : 2020.3.37f1 Pipeline : BRP 优化 做性能优化…

laravel10.x nginx服务推荐配置文件

laravel10.x 服务器配置 如果您正在将应用程序部署到运行Nginx的服务器&#xff0c;则可以使用以下配置文件作为配置web服务器的起点。很可能&#xff0c;此文件需要根据服务器的配置进行自定义。如果你想在管理服务器方面获得帮助&#xff0c;可以考虑使用第一方Laravel服务器…

3分钟搭建一个springboot项目并运行起来

第一步&#xff1a; 创建一个maven项目。 第二步&#xff1a; 导入maven依赖&#xff0c;代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http:/…

执行 yum install gcc 报 【-bash: $‘yum\302\240install\302\240gcc‘: 未找到命令】

执行 yum install gcc 报错 找了一圈&#xff0c;执行&#xff1a;sudo apt-get install yum 执行&#xff1a;wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz 在线下载yum完成 对其进行解压&#xff1a;tar zxvf yum-3.2.28.tar.gz 解压后如下&#xff1a; 执行…

vue3+h5实现虚拟列表

目录 vue3h5实现虚拟列表component / List.vuecomponent / itemComponent.vue使用组件效果 vue3h5实现虚拟列表 安装&#xff1a;npm i vue3-virtual-scroll-listpackage.json "dependencies": {"vue": "^3.2.36","vue3-virtual-scroll-li…

7.20 ARM-A7核心三盏LED灯

思维导图 汇编代码&#xff1a; .text .global _start _start: /**********LED1点灯**************/ RCC_INIT_E:ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x1 << 4)str r1,[r0]RCC_INIT_F:ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x1 << 5)str r1,[r0]LED_INI…

SAP 后台作业简单介绍 job

主要事务代码&#xff1a;SM36、SM37 作业设置 1. 一般数据&#xff1a;作业名称&#xff0c;优先级&#xff0c;目标服务器 优先级适用于资源受限情况&#xff0c;目标服务器适用于服务器环境依赖的程序&#xff0c;比如操作服务器文件等类似的处理 2. 开始条件&#xff0c;…

LRU页面置换算法(C语言实现)

1、实验目的 &#xff08;1&#xff09;熟悉虚拟存储器页面置换过程&#xff1b; &#xff08;2&#xff09;通过编写和调试页面置换算法的模拟程序以加深对页面置换算法的理解&#xff1b; &#xff08;3&#xff09;掌握LRU算法的原理&#xff1b; &#xff08;4&#xf…

Ubuntu中安装Vivado软件

文章目录 Ubuntu中安装Vivado加载License修改软件运行权限安装下载器驱动运行Vivado软件连接开发板测试驱动交叉编译器 Ubuntu中安装Vivado 跨系统文件复制的设置在文章Ubuntu 的安装及其设置中已经介绍过了。 在Ubuntu中找到一个需要存放Vivado软件安装包的文件夹&#xff0c…

二分图博弈学习笔记

前言&#xff1a;最近每场训练赛都有博弈题&#xff0c;而且我都被薄纱了。。。真烦 二分图博弈是少有的直接跟图论挂钩的一种博弈模型 一个博弈是二分图博弈应当满足一下条件&#xff1a; 博弈人数为两人&#xff0c;轮流操作 博弈状态转移可以表示成一张二分图 不可访问已…

MySQL 的 crash-safe浅谈

MySql执行流程 MySQL作为当下最流行的开源关系型数据库&#xff0c;有一个很关键和基本的能力&#xff0c;就是必须能够保证数据不会丢。那么在这个能力背后&#xff0c;MySQL是如何设计才能保证不管在什么时间崩溃&#xff0c;恢复后都能保证数据不会丢呢&#xff1f;有哪些…

在Win11的WSL子系统Ubuntu上安装Gnome桌面环境

目录 1. 使用 WSL 在 Win11 上安装 Linux 2. 安装Ubuntu 22.04默认Gnome桌面环境 2.1更新Ubuntu 22.04软件包 2.2 安装Ubuntu桌面环境 2.3 重启服务 2.4 重启Ubuntu 22.04系统 2.5 登录Gnome桌面环境 在Win11上安装ubuntu版linux系统并实现默认Gnome桌面环境&#xff08…

MySQL数据库(八)

目录 一、什么是索引 1.1索引的原理 1.2索引的优缺点 二、索引的使用 2.1查看索引 2.2手动创建索引 2.3删除索引 三、MySQL索引底层的数据结构 3.1 B树 3.2 B树 一、什么是索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创…

深度理解 Spring AOP

一、什么是AOP(面向切面编程)&#xff1f;&#x1f349; AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程&#xff0c;是通过预编译方式 和运行期 动态代理 实现程序功能的统一维护的一种技术。 AOP &#xff08;面向切面编程&#xff09;是 OOP&a…

Jmeter 接口自动化和 Python 接口自动化,到底选哪个?

目录 前言&#xff1a; 背景 Jmeter 接口自动化 特点 Python 接口自动化 特点 谈项目 写在最后 前言&#xff1a; JMeter接口自动化和Python接口自动化都是常见的选择。 背景 很多刚接触接口自动化的朋友都会疑惑&#xff0c;市面上 Jmeter 接口自动化&#xff0c;Py…

题目2 文件上传(保姆级教程)

url&#xff1a;http://192.168.154.253:82/ #打开http://XXX:81/&#xff0c;XXX为靶机的ip地址 审题 1、打开题目看到有一个提示&#xff0c;此题目需要绕过WAF过滤规则&#xff0c;上传木马获取webshell&#xff0c;最后从根目录下key.php文件中获得flag 2、开始答题 第一步…