【存储】cosbench对象存储测试工具

目录

简略说明

原理

用法

详细说明

简介

用法

一 安装

二 简单验证

三 编写配置文件

四 提交配置文件下IO

五 测试结果查看

结果概览

查看详情

每秒钟的io情况查看

工作负载配置

参数配置(controller和driver)

查看错误的方法和错误记录

查看错误的方法

错误记录

简略说明

COSBench是一个用于测试对象存储系统的分布式基准测试工具

原理

存储集群建立网关,cosbench连接网关,根据用户提交的xxx.xml向集群下IO(网关地址,key,和怎么下IO在配置文件xxx.xml中配置了)

用法

1,安装:

下载cosbench:https://github.com/intel-cloud/cosbench工具,放到压力机上,解压。

(COSBench0.4.2.c4.zip资源-CSDN文库)

2,启动cosbench服务:

sh start-all.sh

这个时候就可以访问你启动的cosbench了: http://<IP>:19088/controller/index.html     #<IP>替换成实际地址

3,编写xml配置文件

(集群提前创建好网关,客户端(key))样例如下,文章后面会教你怎么写。

4,提交任务(xml配文件)

 在主页  http://<IP>:19088/controller/index.html 点击submit new workloads,然后选择你编写的xml配置文件,提交,cosbench就开始向你xml里面知道网关,按xml里面定义的操作,向集群下IO

详细说明

简介

COSBench是Intel团队基于java开发,对云存储的测试工具,全称是Cloud object Storage Bench

cosbench 由两个主要组件组成Driver和Controller。

Driver(Load Generator,打工的):

        负责生成工作负载,向目标对象存储发出操作(读取用户的xml配置,向集群下IO);性能统计。可通过http://:18088/driver/index.html访问

Controller(工头):

        负责协调drivers集体执行工作,收集和汇总聚合来自driver实例的运行时状态或基准测试结果。(就是比如你要多台服务器做压力机,在一台机器做Controller,Controller根据配置控制多台压力机下某个集群下IO)

        两个组件可以混合部署在一个节点上,也可以分开来部署.(比如,我们如果只有一台服务器做压力机,那我们就Controller和Driver都在这台机器上启动,这台机器既是工头又是打工的,自己控制自己下IO)

下图是,一个服务器做Controller,控制两台机器下IO)

做工头(Controller)的服务器启动start-Controller.sh脚本,做打工(driver)的服务器启动start-driver.sh脚本,(只有一台服务的情况)即做工头(Controller)又打工(driver)的,即启动start-all.sh

工头控制那些打工的,通过conf/controller.conf文件配置,如下,只有一个打工的driver1:

更详细的配置见后面的《参数配置(controller和driver)》

用法

一 安装

1、 下载COSBench工具

下载地址为:https://github.com/intel-cloud/cosbench,下载最新的包

(COSBench0.4.2.c4.zip资源-CSDN文库)

2、 将包放至linux任意目录中,进行解压unzip xxx.zip

3、 解压后,里面有说明文档:COSBenchUserGuide.pdf

4、 安装依赖java 和curl

yum install java curl

(COSBench底层调用了linux nc来做数据分析,所以如果linux没装nc的需要手工安装nc)

2、文件说明

官方英文使用文档(超详细,可以翻翻看)

[root@ceph-node1 0.4.2.c4]# ll *.pdf3rd-party-licenses.pdfCOSBenchAdaptorDevGuide.pdf
COSBenchUserGuide.pdf服务调用脚本说明[root@ceph-node1 0.4.2.c4]# ll *.sh
cli.sh              #通过命令行操作cosbench
cosbench-start.sh   #其他启动脚本调用的脚本
cosbench-stop.sh    #其他启动脚本调用的脚本
start-all.sh          #在当前节点启动driver和controller组件
stop-all.sh           #在当前节点停止driver和controller组件
start-controller.sh   #在当前节点启动controller
start-driver.sh       #在当前节点启动driver
stop-controller.sh    #在当前节点关闭controller
stop-driver.sh        #在当前节点关闭driver

二 简单验证

启动cosbench

启动前为了保证driver和controller之间交互正常,需要关闭HTTP代理

[root@ceph-node1 0.4.2.c4]# unset http_proxy

启动controller和driver (服务器即做工头又做打工的)

[root@ceph-node10.4.2.c4]# sh start-all.sh

  验证

 controller在初始化时读取conf/controller.conf配置文件启动控制器服务,看配置文件可知controller的访问地址是http://<IP>:19088/controller/index.html

访问http://<IP>:19088/controller/index.html验证。

三 编写配置文件

cosbench使用负载配置文件向对象存储下发测试任务。

负载配置文件含如下参数:

  1. 网关节点ip和端口,或者高可用组的vip和端口,或者域名和端口;
  2. 对象存储用户的ak/sk;

在conf目录下有很多配置样例,详细说明,见后面的《工作负载配置》

四 提交配置文件下IO

有两种方法:

1,命令行:

bash cli.sh submit conf/s3-config-sample.xml 

访问http://<IP>:19088/controller/index.html 就可以看到执行情况

2,web界面提交

 在主页  http://<IP>:19088/controller/index.html 点击submit new workloads,然后选择xml配置文件

五 测试结果查看

结果概览

每个阶段执行完后,可以在web界面看到iops、带段等结果:

General Report这一栏,每个值的含义如下:

  • Op-Type : 操作类型
  • Op-Count : 操作总数
  • Byte-Count : 操作产生的Byte
  • Avg-ResTime:平均时延,它为存储服务处理请求的时间,包含数据传输时间,一般小文件(比如KB级别)我们也会关注这个值,此值越低,小文件的IOPS越好
  • Avg-ProcTime:平均处理时间,它为存储服务处理请求的时间,不包含数据传输时间
  • Throughput:吞吐量,当我们的文件粒度为1M及以下时,着重关注这个值,描述了当前文件粒度下的读写等性能(IOPS)
  • Bandwidth:带宽,当我们的文件粒度为1M以上时,着重关注这个值,描述了当前文件粒度下的读写等性能(MB/s等单位)
  • Succ-Ratio:请求成功率,这里一般都要求100%

也可以在任务ID,在cosbench安装目录的archive子目录中看到测试结果:

每个任务ID对应的目录下,都按照阶段生成了相应的csv文件,下载对应的csv文件用execel查看即可:

查看详情

每秒钟的io情况查看

如查看wid=w12&sid=s2-prepare 的每秒钟IO

在将 http://10.255.136.7:19088/controller/stage.html?wid=w12&sid=s2-prepare 中的stage.html 改成 timeline.html ,回车即可

工作负载配置

在conf目录下有很多配置样例

  进入conf目录下,查看s3-config-sample.xml配置文件内容如下:

 配置参数和说明:

<?xml version="1.0" encoding="utf-8"?>

<!--workload name : 测试时显示的任务名称,可自定义;description : 描述信息-->

<workload name="s3-sample" description="sample benchmark for s3">

    <!--storage type: 存储类型,这里配置为s3即可-->

    <storage type="s3" config="accesskey='填访问key';secretkey='填安全key';proxyhost='填代理ip或域名,可以不使用代理';proxyport='如果用了代理,填代理端口';endpoint='填对象存储系统的网关的地址http:/ip:端口';" />

    <!--workflow工作流,workstage name:cosbench是分阶段按顺序执行,每个阶段的名字-->

    <workflow>

            <workstage name="init">

                <!--workers:该阶段开启多少工作线程;config:存储桶bucket的名称前缀;containers:轮询数,如本例创建以s3testqwer为前缀,后缀分别为12bucket-->

                <work type="init" workers="1" config="cprefix=s3testqwer;containers=r(1,2)" />

            </workstage>

            

             <!--prepare阶段,配置写入的数据;workers\config\containersinit阶段相同;objects:一轮写入多少个对象以及object的大小-->

            <workstage name="prepare">

                                     <!--一个worker处理该阶段,r就是range,轮询1,2两个容器(桶),前缀是s3testqwer,每个容器写入10个 objecter,尺寸是64KB-->

                <work type="prepare" workers="1" config="cprefix=s3testqwer;containers=r(1,2);objects=r(1,10);sizes=c(64)KB" />

            </workstage>

             <!--main阶段:测试阶段;runtime:运行的时间,默认为秒-->

            <workstage name="main">

                <work name="main" workers="8" runtime="30">

                     <!--op type:操作类型readwritedelete;ratio操作占比,read的比例为80%,write的比例为20%; -->

                    <operation type="read" ratio="80" config="cprefix=s3testqwer;containers=u(1,2);objects=u(1,10)" />

                    <operation type="write" ratio="20" config="cprefix=s3testqwer;containers=u(1,2);objects=u(11,20);sizes=c(64)KB" />

                </work>

            </workstage>

             <!--清理阶段:主要是删除bucket中的数据,保证测试后的数据不会保留在集群中-->

            <workstage name="cleanup">

                <work type="cleanup" workers="1" config="cprefix=s3testqwer;containers=r(1,2);objects=r(1,20)" />

            </workstage>

            

            <!--dispose阶段:删除bucket-->

            <workstage name="dispose">

                <work type="dispose" workers="1" config="cprefix=s3testqwer;containers=r(1,2)" />

            </workstage>

    </workflow>

</workload>

workload name : 测试时显示的任务名称,这里可以自行定义

description : 描述信息,这里可以自己定义

storage type: 存储类型,这里配置为s3即可

config : 对该类型的配置,

workstage name : 

    cosbench是分阶段按顺序执行,此处为init初始化阶段,主要是进行bucket的创建,

    workers表示执行该阶段的时候开启多少个工作线程,创建bucket通过不会计算为性能,所以单线程也可以;

    config处配置的是存储桶bucket的名称前缀;

    containers表示轮询数,上例中将会创建以s3testqwer为前缀,后缀分别为1和2的bucket

prepare阶段 : 

    配置为bucket写入的数据,workers和config以及containers与init阶段相同,除此之外还需要配置objects,表示一轮写入多少个对象,以及object的大小。

main阶段 :

     这里是进行测试的阶段,runtime表示运行的时间,时间默认为秒

    operation type : 操作类型,可以是read、write、delete等。

    ratio表示该操作所占有操作的比例,例如上面的例子中测试读写,read的比例为80%,write的比例为20%; 

    config中配置bucket的前缀后缀信息。注意write的sizes可以根据实际测试进行修改

cleanup阶段 :

     这个阶段是进行环境的清理,主要是删除bucket中的数据,保证测试后的数据不会保留在集群中

dispose阶段 : 

这个阶段是删除bucket

 

参数配置(controller和driver)

 测试案例配置

 cosbench工具使用按照流程可分为以下几个步骤:参数配置--服务启动--提交测试--分析结果

示例使用三个节点联机测试,配置示意如下:

调整时差,客户机和集群的时差不要太大。

4.1 参数配置

        controller和driver依赖不同系统配置来启动服务,在启动controller和driver服务时,需要先行定义角色配置

一、controller配置

        controller在初始化时读取conf/controller.conf配置文件启动控制器服务

[root@node241 0.4.2.c4]# cat conf/controller.conf

[controller]

concurrency=1

drivers=3

log_level=INFO

log_file=log/system.log

archive_dir=archive

 

[driver1]

name=driver1

url=http://66.66.66.241:18088/driver

 

[driver2]

name=driver2

url=http://66.66.66.242:18088/driver

 

[driver3]

name=driver3

url=http://66.66.66.243:18088/driver

 [controller]

concurrency:默认值为1,表示可以同时执行的工作负载数量

drivers:默认值为1,表示此controller控制的driver数量

log_level:默认值为INFO,可选值为TRACE、DEBUG、INFO、WARN、ERROR,表示日志打印等级

log_file:默认值为log/system.log,表示日志文件存放位置

archive_dir:默认值为archive,表示工作负载结果存放位置,当参数值为archive,则工作负载结果存放于0.4.2/archive目录内

 [driver#x]

        当有多个driver时,第{n}个driver命名为[driver{n}]

name:用于标识driver节点的标签,名称可以自定义

url:访问driver节点的地址

二、driver配置

  driver在初始化时读取conf/driver.conf配置文件启动负载器服务。

[root@node241 0.4.2.c4]# cat conf/driver.conf 

[driver]

name=127.0.0.1:18088

url=http://127.0.0.1:18088/driver

查看错误的方法和错误记录

查看错误的方法

1,点击download-log 下载log

查看下载下来log内容

1、main阶段failed

点击“view details”,找到Mission ID:

在cosbench安装目录的log/mission目录下,找到该mission id对应的日志文件,从日志文件中查看报错:

错误记录

Status Code: 500

Status Code: 5002024-03-11 20:36:36,483 [ERROR] [AbstractOperator] - worker 13 fail to perform operation s3testqwer25com.intel.cosbench.api.storage.StorageException: com.amazonaws.services.s3.model.AmazonS3Exception: We encountered an internal error, please try again.: cause(save bucket metadata to ns failed!s3testqwer25) (Service: Amazon S3; Status Code: 500; Error Code: InternalError; Request ID: 17BBB600BD8B7581), S3 Extended Request ID: 1a6d04ea-b557-4018-9ced-cc23e3798466at com.intel.cosbench.api.S3Stor.S3Storage.createContainer(S3Storage.java:149)at com.intel.cosbench.driver.operator.Preparer.doInit(Preparer.java:113)at com.intel.cosbench.driver.operator.Preparer.operate(Preparer.java:87)at com.intel.cosbench.driver.operator.AbstractOperator.operate(AbstractOperator.java:76)at com.intel.cosbench.driver.operator.Initializer.operate(Initializer.java:1)at com.intel.cosbench.driver.agent.WorkAgent.performOperation(WorkAgent.java:197)at com.intel.cosbench.driver.agent.WorkAgent.doWork(WorkAgent.java:177)at com.intel.cosbench.driver.agent.WorkAgent.execute(WorkAgent.java:134)at com.intel.cosbench.driver.agent.AbstractAgent.call(AbstractAgent.java:44)at com.intel.cosbench.driver.agent.AbstractAgent.call(AbstractAgent.java:1)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)

原因
1,对象数据池没有创建

which: no nc in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

如果不安装nc,会报错

which: no nc in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

Ncat: Connection refused.

No appropriate tool found to detect cosbench driver status.

        如果不安装java,会报

Ncat: Connection refused.

启动失败

摘自:尝试在CentOS 7上启动cosbench遭遇的一些问题 - 之一 - 中道学友 - 博客园 (cnblogs.com)

尝试启动cosbench,遭遇报错:

[root]hopisdtmelabs14# cat driver-boot.log                                                                                                                                      /tmp/cosbench/0.4.2/log
java.net.BindException: Address already in use (Bind failed)at java.net.PlainSocketImpl.socketBind(Native Method)at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)at java.net.ServerSocket.bind(ServerSocket.java:375)at java.net.ServerSocket.<init>(ServerSocket.java:237)at java.net.ServerSocket.<init>(ServerSocket.java:128)at org.eclipse.osgi.framework.internal.core.ConsoleManager.startConsole(ConsoleManager.java:186)at org.eclipse.osgi.framework.internal.core.ConsoleManager.startConsole(ConsoleManager.java:132)at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:269)at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:175)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)at org.eclipse.equinox.launcher.Main.run(Main.java:1410)at org.eclipse.equinox.launcher.Main.main(Main.java:1386)!SESSION 2020-06-03 06:04:23.609 -----------------------------------------------eclipse.buildId=unknown
java.version=1.8.0_181
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -console 18089
!ENTRY org.eclipse.osgi 4 0 2020-06-03 06:04:24.132
!MESSAGE Bundle plugins/cosbench-castor not found.

看起来像是网络端口18089已经被占用了,杀掉那些进程,问题解决。

如何找到占用18089端口的进程?举例如下:

# netstat -tulpn | grep 18089                                                                                                                                /tmp/cosbench/cos/conftcp6       0      0 :::18089                :::*                    LISTEN      4090/java# ps aux | grep java                                                                                                                                         /tmp/cosbench/cos/confroot      4090  0.0  0.4 21453452 315076 ?     Sl   10:39   0:18 java -Dcosbench.tomcat.config=conf/driver-tomcat-server.xml -server -cp main/org.eclipse.equinox.launcher_1.2.0.v20110502.jar org.eclipse.equinox.launcher.Main -configuration conf/.driver -console 18089root      4822  0.3  0.3 20319980 262324 pts/0 Sl   21:13   0:07 java -Dcosbench.tomcat.config=conf/controller-tomcat-server.xml -server -cp main/org.eclipse.equinox.launcher_1.2.0.v20110502.jar org.eclipse.equinox.launcher.Main -configuration conf/.controller -console 19089root      4965  0.0  0.0 112828  2316 pts/0    S+   21:46   0:00 grep --color=auto java

可以看出来在上面的例子中,4090就是占用了18089端口的进程号了,通过ps aux 还能看到详细的命令行参数。

但cosbench driver 还是启动不了。

[root]hopisdtmelabs14# bash ./start-driver.sh                                                                                                                                          /tmp/cosbench/cosLaunching osgi framwork ...
Successfully launched osgi framework!
Booting cosbench driver ...
which: no nc in (/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/tme/bin:/usr/local/tme/tme_portal/perf_web/bin)
No appropriate tool found to detect cosbench driver status.

看报错,应该是nc(ncat)这个软件没有安装。可是通过yum还没法正常安装。我通过下面的命令解决了这个问题:

​
# yum -y install wget
# wget  https://nmap.org/dist/ncat-7.80-1.x86_64.rpm
# yum localinstall ncat-7.80-1.x86_64.rpm
# cd /usr/bin
# ln -s ncat nc

装好了nc之后,还是有错误。

# bash ./start-driver.sh                                                                                                                                          /tmp/cosbench/cosLaunching osgi framwork ...
Successfully launched osgi framework!
Booting cosbench driver ...
...........................................................
Starting    cosbench-log_0.4.2    [ERROR]
...........................................................
Starting    cosbench-tomcat_0.4.2    [ERROR]
..........................................................
Starting    cosbench-config_0.4.2    [ERROR]
...........................................................
Starting    cosbench-http_0.4.2    [ERROR]

我怀疑是我的java的版本过高,所以卸掉java 8, 安装java 7。

# rpm -aq | grep -i jdk                                                                                                                                           /tmp/cosbench/cosjava-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64
copy-jdk-configs-3.3-10.el7_5.noarch
java-1.8.0-openjdk-headless-1.8.0.181-3.b13.el7_5.x86_64# rpm -e java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64
# rpm -e java-1.8.0-openjdk-headless-1.8.0.181-3.b13.el7_5.x86_64
# yum remove java

安装java 7.

#yum install java-1.7.0-openjdk

结果遇到了报错,说有两个软件包太旧了,达不到安装的要求。

尝试安装更新,结果还是报错,无法更新。

[Errno 14] HTTP/HTTPS Error 404

于是执行下面的命令,对yum进行修复。

#yum clean all

#rm -rf /var/cache/yum/*

之后java 7也成功安装了。

但还是报错:

# cat driver-boot.log                                                                                                                                         /tmp/cosbench/cos/log
Listening on port 0.0.0.0/0.0.0.0:18089 ...
!SESSION 2020-06-03 10:12:59.683 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.7.0_261
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -console 18089
!ENTRY org.eclipse.osgi 4 0 2020-06-03 10:13:00.367
!MESSAGE Bundle plugins/cosbench-castor not found.
!ENTRY org.eclipse.osgi 4 0 2020-06-03 10:13:00.368
!MESSAGE Bundle plugins/cosbench-log4j not found.
!ENTRY org.eclipse.osgi 4 0 2020-06-03 10:13:00.368
!MESSAGE Bundle plugins/cosbench-log@6:start not found.
!ENTRY org.eclipse.osgi 4 0 2020-06-03 10:13:00.369
!MESSAGE Bundle plugins/cosbench-config@6:start not found.……

Github的cosbench的站点里的issue#383里的步骤(具体步骤描述在这篇文章),即删掉cosbench-start.sh里的一行(如下),我也试过了,并没有解决问题。

TOOL_PARAMS="-i 0" -----Delete this line

经过查询,找到了这篇文章,推荐不要使用正式版的0.4.2,推荐试试0.4.2.c4, 于是下载了更早的一个版本0.4.2.c4。

问题解决了,终于成功启动了cosbench driver。

# bash ./start-driver.sh                                                                                                                                     /tmp/cosbench/0.4.2.c4
Launching osgi framwork ...
Successfully launched osgi framework!
Booting cosbench driver ...
.
Starting    cosbench-log_0.4.2    [OK]
.
Starting   cosbench-tomcat_0.4.2    [OK]
Starting    cosbench-config_0.4.2    [OK]
Starting    cosbench-http_0.4.2    [OK]
Starting    cosbench-cdmi-util_0.4.2    [OK]
Starting    cosbench-core_0.4.2    [OK]
Starting    cosbench-core-web_0.4.2    [OK]
Starting    cosbench-api_0.4.2    [OK]
Starting    cosbench-mock_0.4.2    [OK]
Starting    cosbench-ampli_0.4.2    [OK]
Starting    cosbench-swift_0.4.2    [OK]
Starting    cosbench-keystone_0.4.2    [OK]
Starting    cosbench-httpauth_0.4.2    [OK]
Starting    cosbench-s3_0.4.2    [OK]
Starting    cosbench-librados_0.4.2    [OK]
Starting    cosbench-scality_0.4.2    [OK]
Starting    cosbench-cdmi-swift_0.4.2    [OK]
Starting    cosbench-cdmi-base_0.4.2    [OK]
Starting    cosbench-driver_0.4.2    [OK]
Starting    cosbench-driver-web_0.4.2    [OK]
Successfully started cosbench driver!
Listening on port 0.0.0.0/0.0.0.0:18089 ...
Persistence bundle starting...
Persistence bundle started.
----------------------------------------------
!!! Service will listen on web port: 18088 !!!
----------------------------------------------

不知道为什么,在CentOS 7上运行0.4.2 明显的有问题,却还不被修复,结果还要去使用稍早的版本release candidate 4, 这个事儿弄的挺恶心的。

To the English readers:
I document the process and issues here in detail, hope other people hit on the same issue can see it, and save time.

参考资料


================How to check if port is in use on Linux or Unix
https://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/
NETCAT THE MULTI-PURPOSE NETWORKING TOOL
landoflinux.com
Uninstall JDK rpm to reinstall
centos - Uninstall JDK rpm to reinstall - Unix & Linux Stack Exchange
yum-errors
https://wiki.centos.org/yum-errors
CosBench on Red Hat Linux
http://www.vtechdiary.com/2018/09/cosbench-on-red-hat-linux.html
Can't start the system #380
Can't start the system · Issue #380 · intel-cloud/cosbench · GitHub​

参考资料

使用COSBench工具對ceph s3接口進行壓力測試--續 - JavaShuo

尝试在CentOS 7上启动cosbench遭遇的一些问题 - 之一 - 中道学友 - 博客园 (cnblogs.com)

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

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

相关文章

【匹配】匈牙利匹配算法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 匈牙利匹配算法 1. 正文 1.1 基础概念 二分图 顶点分为两个集合&#xff0c;集合间顶点相连&#xff0c;集合内点不相连 匹配 一个匹配就是一个边的…

Oracle Linux 8.8 一键安装 Oracle 11GR2 RAC(231017)

前言 Oracle 一键安装脚本&#xff0c;演示 Oracle Linux 8.8 一键安装 Oracle 11GR2 RAC&#xff08;231017&#xff09;过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&…

代理IP干货:如何正确使用防范风险?

在今天的数字时代&#xff0c;代理IP地址已成为互联网世界中不可或缺的一部分。无论您是寻求绕过地理限制、保护个人隐私还是执行网络任务&#xff0c;代理IP地址都发挥着关键作用。我们将为您探讨代理IP地址的重要性以及如何防范潜在的风险和威胁。 一、代理IP地址的潜在风险 …

STM32H7独立看门狗 (IWDG)的应用方法介绍

目录 概述 1 认识独立看门狗 (IWDG) 1.1 定义独立看门狗 (IWDG) 1.2 IWDG 主要特性 2 IWDG 功能说明 2.1 IWDG 框图 2.2 IWDG 内部信号 2.3 窗口选项 2.3.1 Enable WIN IWDG 2.3.2 Disable WIN IWDG 2.4 硬件看门狗 2.5 低功耗冻结 2.6 停止和待机模式下的行为 …

网工学习云计算HCIE感受如何?

作为一名网工&#xff0c;我经常会在各种网络论坛里查询搜索一些网络技术资料&#xff0c;以及跟论坛里的网友交流讨论平时在工作、学习中遇到的问题、故障&#xff0c;因此也经常能在论坛的首页看到誉天的宣传信息。机缘巧合之下关注了誉天的B站号&#xff0c;自从关注了誉天的…

实现像 creat-astro 一样在终端中实现动态输出内容

新工具&#xff0c;可以动态输出一些文字&#xff0c;支持盒子输出、动物输出、emoji输出等&#xff0c;也可以完全自定义 可以参考地址&#xff1a;https://github.com/winchesHe/dynamic-log 演示&#xff1a;

谈谈对“数字化转型”的本质认知

我之前在多家咨询公司与软件公司做过多个大型企业数字化项目&#xff0c;也在甲方企业推动数字化转型&#xff0c;做出了数字化最佳实践案例。 下面我想从一个客观角度来真正意义上的描述数字化及数字化转型。 我相信这篇文章能给做数字化的你们带来极大的收获&#xff0c;我…

了解血糖对身体的危害,掌握三个关键数值,预防并发症。

糖尿病患者的血糖控制至关重要&#xff0c;因为长期的血糖异常会对身体造成各种损害&#xff0c;甚至引发严重的并发症。记住这三个数值。 第一个就是空腹血糖&#xff0c;大于13.9&#xff0c;就会有大量的脂肪分解成酮体&#xff0c;酮体在体内积累过多&#xff0c;可能引发酮…

第55篇:创建Nios II工程之Hello_World<一>

Q&#xff1a;本期我们开始介绍创建Platform Designer系统&#xff0c;并设计基于Nios II Processor的Hello_world工程。 A&#xff1a;设计流程和实验原理&#xff1a;需要用到的IP组件有Clock Source、Nios II Processor、On-Chip Memory、JTAG UART和System ID外设。Nios I…

内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题

内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题 内网穿透下的地址冲突https 登录管理后台总结 同步发布在个人笔记内网穿透下的 wordpress 地址冲突问题与 https 下的后台登陆问题 笔记记录解决两个 wordpress 相关问题 如果我们使用内网穿透把本地的 wordpre…

机器学习理论基础—支持向量机的推导(一)

机器学习理论基础—支持向量机的推导 算法原理 SVM:从几何角度&#xff0c;对于线性可分数据集&#xff0c;支持向量机就是找距离正负样本都最远的超平面&#xff0c;相比于感知机&#xff0c;其解是唯一的&#xff0c;且不偏不倚&#xff0c;泛化性能更好。 超平面 n维空间…

百篇博客 · 千里之行

时光荏苒流逝&#xff0c;白驹匆匆过隙&#xff0c;不知不觉间&#xff0c;Damon小智已经在CSDN上记录了第一百多篇文章。恰逢128天创作纪念日的此刻&#xff0c;我感慨良多&#xff0c;这百余篇博客不仅是我的创作历程&#xff0c;更见证了我在这五年技术生涯中走过心路历程。…

算法学习001-圆桌问题 中小学算法思维学习 信奥算法解析 c++实现

目录 算法学习001-圆桌问题 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 算法学习001-圆桌问题 一、题目要求 1、编程实现 圆桌边围坐着2n个人&#xff0c;其中n个人是好人&#xff0c…

启明云端新品WT99C262-SG LoRa开发板,搭配WT32-ETH0X实现LoRa/WiFi/蓝牙转以太网

WT99C262-SG系列开发板是启明云端推出的一款基于WTLRC262-SG系列模组的开发板。板上搭载的模组支持Wi-FiBLELoRa功能&#xff0c;且模组大部分管脚均已引出至两侧排针&#xff0c;开发人员可根据实际需求&#xff0c;通过跳线连接多种外围设备&#xff0c;也可将开发板插在面包…

第27天:安全开发-PHP应用TP框架路由访问对象操作内置过滤绕过核心漏洞

第二十七天 一、TP框架-开发-路由访问&数据库&文件上传&MVC模型 1.TP框架-开发-配置架构&路由&MVC模型 参考&#xff1a;https://www.kancloud.cn/manual/thinkphp5_1 配置架构-导入使用路由访问-URL访问数据库操作-应用对象文件上传操作-应用对象前端页…

web-traffic-generator:一款功能强大的HTTP和HTTPs流量混淆工具

关于web-traffic-generator web-traffic-generator是一款功能强大的HTTP和HTTPs流量混淆工具&#xff0c;该工具基于纯Python开发&#xff0c;可以帮助广大研究人员在HTTP或HTTPs网络流量中提添加噪声&#xff0c;以此来实现流量混淆的目的。 本质上来说&#xff0c;web-traff…

Linux编译和NXP官方系统移植

文章目录 一、Linux安装环境配置二、Linux编译流程三、单个.dtb文件编译方法1.修改顶层makefile2.编译设备树文件3.验证 四、NXP官方Linux系统移植1.将NXP官方Linux系统导入到Ubuntu系统中2.解压系统3.编译系统4.验证5.在NXP官方系统中添加自己的板子 五、 CPU 主频和网络驱动修…

C++ | Leetcode C++题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 自定义对 array<int, 26> 类型的哈希函数auto arrayHash [fn hash<int>{}] (const array<int, 26>&…

对浅拷贝的理解

问题背景 我之前一直以为浅拷贝出来的新对象和旧对象的引用地址是相同的&#xff0c;但是通过Object和发现浅拷贝的新对象和旧对象的引用地址不同&#xff01;&#xff01; const obj1 { name: "Alice", test: { age: 12 } };const obj4 Object.assign({}, obj1);…

2、选择什么样的机器人本体

如果说世界是物质的&#xff0c;那么应该先制造出机器人的本体&#xff0c;再让她产生灵魂。如果是精神的呢&#xff0c;世界是无中生有的呢&#xff0c;那就先在仿真中研究算法吧。 而我比较崇尚初中哲学的一句话&#xff0c;世界是物质的&#xff0c;物质是运动的&am…