08--LVS网站高并发解决方案

news2024/11/17 16:23:19

前言:LVS,工作稳定,抗负载能力强,属于运维基础,这里将lvs两种模式的部署方式在这里记录一下,并在示例完成后,补充一下基础概念。本章不可避免的涉及到一些网络方面知识,会形象简单的记录一下,无需纠结其原理。

1、基础概念

LVS是Linux Virtual Server,Linux虚拟服务器

LB:Load Balancing,负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的并发处理能力为目的。

LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的real server(真正提供服务的主机),从而实现集群环境中的负载均衡。

软件负载均衡lvs:四层路由设备
haproxy、nginx:七层负载均衡器
硬件负载均衡F5:BIG IP
深信服

2、LVS-NAT部署

原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发 至此RS来处理,RS处理完后把数据交给负载均衡器,负载均衡器再把数据包原IP地址改为自己的IP,将目的 地址改为客户端IP地址即可期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器

优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址

缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因 为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载 均衡器那,速度就会变慢,工作中见过的最多为一拖20!

2.1、基础环境

关闭防火墙与selinux!!!

vmware网络配置

点击确认完成虚拟网络vmnet2添加,这个相当于模拟现实中的机柜路由器功能,去本机网络设置查看是否添加完成(杀毒软件可能会影响安装)。

模拟角色IP
客户访问(物理机)192.168.1.4
lvs

192.168.1.5

192.168.150.128

服务端1号(web1)192.168.150.129
服务端2号(web2)192.168.150.130

配置完成时服务端1号网络状态如下

现有两个不同网段192.168.1.0与192.168.150.0,两个网段暂时无法通信

2.2、环境配置

2.2.1、web1配置网站和路由

注意:当前web1位于150网段,对于互联网来说处于离线状态,需配置本地源后安装网站

    #    搭建本地源
[root@localhost yum.repos.d]# mount /dev/sr0 /mnt
[root@localhost ~]# vim /etc/yum.repos.d/local.repo
[root@localhost yum.repos.d]# cat /etc/yum.repos.d/local.repo
[local]
name=Local Repository
baseurl=file:///mnt
enabled=1
gpgcheck=0
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# yum makecache

    #    安装环境
[root@localhost yum.repos.d]# yum install -y httpd
[root@localhost yum.repos.d]# systemctl  start httpd
[root@localhost yum.repos.d]# systemctl enable httpd
[root@localhost yum.repos.d]# echo ">>>>>>>>web1<<<<<<<<" >  /var/www/html/index.html
[root@localhost yum.repos.d]# yum install -y net-tools
[root@localhost yum.repos.d]# route add -net 192.168.1.0/24 gw 192.168.150.128

# route add -net (lvs上与客户端相通的网段) gw (lvs的内网ip)

2.2.2、web2配置网站和路由

[root@localhost yum.repos.d]# echo "+++++++++web2++++++++" >  /var/www/html/index.html

    #    其余配置与web1相同

工作环境下内容应该为相同的,这里是为了更明显的观察负载均衡效果

2.2.3、LVS-NAT配置

由于LVS处于两个网络边界,所以需要开启路由转发

[root@localhost ~]# echo  1  > /proc/sys/net/ipv4/ip_forward

    #    启用 IP 转发

[root@localhost ~]# yum install -y ipvsadm

    #    ipvsadm 是一个用于管理 Linux 虚拟服务器(LVS)规则的工具,提供了添加、删除和显示负载均衡规则的功能

[root@localhost ~]# ipvsadm -A -t 192.168.1.5:80 -s rr

    #    这个命令使用 ipvsadm 创建一个新的虚拟服务:

    #    -A:添加一个新的虚拟服务。
    #    -t 192.168.1.5:80:指定虚拟服务的 IP 地址和端口号,即客户端将访问的地址。
    #    -s rr:指定调度算法为“轮询”(Round Robin),这意味着流量将按顺序分配给每个真实服务器。


[root@localhost ~]# ipvsadm -a -t 192.168.1.5:80 -r 192.168.150.129:80 -m

    #    这个命令向虚拟服务添加一个真实服务器:

    #    -a:向虚拟服务添加一个真实服务器。
    #    -t 192.168.1.5:80:指定与虚拟服务关联的 IP 地址和端口号。
    #    -r 192.168.150.129:80:指定真实服务器的 IP 地址和端口号。
    #    -m:使用 NAT 模式(Masquerading),即通过伪装真实服务器的 IP 来实现负载均衡。


[root@localhost ~]# ipvsadm -a -t 192.168.1.5:80 -r 192.168.150.130:80 -m

2.2.4、测试

使用本机浏览器访问,未防止缓存干扰使用firefox的隐私浏览模式

 再次刷新

查看 LVS 配置及当前连接列表,负载均衡已经完成

[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.5:80 rr
  -> 192.168.150.129:80           Masq    1      0          2         
  -> 192.168.150.130:80           Masq    1      0          2         
[root@localhost ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state       source             virtual            destination
TCP 00:37  TIME_WAIT   192.168.1.4:3521   192.168.1.5:80     192.168.150.130:80
TCP 01:19  TIME_WAIT   192.168.1.4:3545   192.168.1.5:80     192.168.150.129:80
TCP 00:44  TIME_WAIT   192.168.1.4:3556   192.168.1.5:80     192.168.150.130:80
TCP 00:17  TIME_WAIT   192.168.1.4:3489   192.168.1.5:80     192.168.150.129:80

3、LVS-DR部署

原理:负载均衡器和RS都使用同一个IP对外服务但只有DR对ARP请求进行响应,所有RS对本身这个IP的 ARP请求保持静默也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度 算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致),并将请求分发给这台RS这时RS收到 这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据 包无异,处理后直接返回给客户端,由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必 须在一个广播域,也可以简单的理解为在同一台交换机上

优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户 端,与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。

缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。

3.1、基础环境

IP该IP使用途径
192.168.189.151模拟客户访问
192.168.189.148

lvs通信地址

192.168.189.149

web1通信地址

192.168.189.150

web2通信地址

192.168.189.145

lvs,web1,web2共用的虚拟ip地址

 这里使用的均为虚拟网络nat模式

3.2、LVS服务器配置

3.2.1、LVS准备VIP与路由

添加vip

[root@localhost ~]# ifconfig ens33:0 192.168.189.145 broadcast 192.168.1.255 netmask 255.255.255.0 up

    #    这条命令的作用是在Linux系统上创建一个名为 ens33:0 的虚拟网络接口,并将其IP地址设置为 192.168.189.145,子网掩码为 255.255.255.0,然后激活这个虚拟网络接口。


[root@localhost ~]# route add -host 192.168.189.145 dev ens33:0


    #    这条命令的作用是将目标主机 192.168.189.145 添加到路由表中,指定数据包通过虚拟网络接口 ens33:0 发送到该主机。

配置路由转发

[root@localhost ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 
[root@localhost ~]# echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf 
[root@localhost ~]# echo "net.ipv4.conf.ens32.send_redirects = 0" >> /etc/sysctl.conf 
[root@localhost ~]# echo "net.ipv4.conf.default.send_redirects = 0" >> /etc/sysctl.conf 


    #    开启路由功能
    #    禁止转发重定向报文
    #    禁止ens32转发重定向报文
    #    禁止转发默认重定向报文

这里是为了避免lvs参与其他的路由功能

3.3.2、LVS设置负载均衡规则

[root@localhost ~]# yum install -y ipvsadm
[root@localhost ~]# ipvsadm -A -t 192.168.189.145:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.189.145:80 -r 192.168.189.149:80 -g
    #    有人找145把他转到149 使用dr模型(网关型)
[root@localhost ~]# ipvsadm -a -t 192.168.189.145:80 -r 192.168.189.150:80 -g

3.3.3、配置永久生效

[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@localhost ~]# cat /etc/sysconfig/ipvsadm
-A -t localhost.localdomain:http -s rr
-a -t localhost.localdomain:http -r 192.168.189.149:http -g -w 1
-a -t localhost.localdomain:http -r 192.168.189.150:http -g -w 1
[root@localhost ~]# systemctl enable ipvsadm
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.

3.3、web服务器配置

与上个示例相似,出了网页内容不同,其他操作如下,两台web服务器通用

3.3.1、部署web服务

[root@localhost ~]# yum install -y nginx
[root@localhost ~]# echo ">>>>>>>>>>>>>>web1<<<<<<<<<<<<" > /usr/share/nginx/html/index.html
[root@localhost ~]# cat /usr/share/nginx/html/index.html 
>>>>>>>>>>>>>>web1<<<<<<<<<<<<
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

3.3.2、配置vip

给两个web服务器的lo网卡设置子网掩码为32位vip,按理来说是无法在两台不同机器上部署相同IP,但此处ip并非用来通信,这里我们使用超网掩码32位(32位1),经过逻辑与运算后会发现ip仍为设定的ip,这种写法会使计算机认为全网只有自己一台主机。

[root@localhost ~]# ifconfig lo:0 192.168.189.145/32
    #    使用模拟接口lo构建模拟接口,好处是这个接口永远不会宕机

效果如图

3.3.3、设置内核参数

这里是为了防止虚拟ip配置后,后端的web服务器越过lvs去接受请求

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

    #    忽略非本地arp响应 ,不允许收

[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce


    #    为了让vip发包出去,但允许发

3.4、测试

 查看 LVS 配置及当前连接列表,负载均衡已经完成

4、概念补充

此处概念需要着重记忆

4.1、LVS模式

lvs除了上述两种模式外,还有两种模式:

TUN-IP隧道模式

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。

原理:首先要知道,互联网上的大多Internet服务的请求包很短小,而应答包通常很大,那么隧道模式 就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解 开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过 来的数据包进行还原,所以说必须支持IPTUNNEL协议,所以,在RS的内核中,必须编译支持IPTUNNEL这个选项

优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户,所以,减少了 负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一 台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上

图示:

FULL-NAT模式

严格意义上它并不属于独立的一种模式,称为全网nat,属于nat模式的变种,有的面试官问lvs有几种的时候喜欢拿这个当脑筋急转弯,工作中并不常见。

解决的是LVS和RS跨VLAN的问题,而跨VLAN问题解决后,LVS和RS不再存在VLAN上的从属关系,可以做到多个LVS对应多个RS,解决水平扩容的问题。

4.2、轮询算法

我们在两个示例中使用的都是rr选项

 常见的轮询算法如下

Fixed Scheduling Method 静态调服方法 

RR 轮询

Round-Robin:调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

WRR 加权轮询

调度器通过"加权轮叫"调度算法,根据真实服务器的不同处理能力.来调度访问请求。这样可以保证处理能力强的服务器,处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

DH 目标地址hash

"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

根据客户点的菜找对应厨师处理

SH 源地址hash

"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

根据客户找对应的厨师处理

Dynamic Scheduling Method 动态调服方法

LC 最少连接

调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

找排队最短的打饭窗口

WLC 加权最少连接

在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

比较好吃的打饭窗口,人数差不多也会在这里处理

LBLC 基于本地的最少连接

"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。

LBLCR 带复制的基于本地的最少连接

"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。

4.3、负载均衡常见模式

http重定向、DNS负载均衡、7层反向代理负载均衡、4层IP网络层负载均衡、数据链路层负载均衡、F5硬件负载均衡(性能最好的负载均衡,成本极高)

1)4层IP网络层负载均衡:

lvs-nat

在网络层和传输层(IP和端口)通过修改目标地址进行负载均衡。 用户访问请求到达负载均衡服务器,负载均衡服务器在操作系统内核进程获取网络数据包,根据算法得到一台真实服务器地址,然后将用户请求的目标地址修改成该真实服务器地址,数据处理完后返回给负载均衡服务器,负载均衡服务器收到响应后将自身的地址修改成原用户访问地址后再讲数据返回回去。类似于反向服务器负载均衡。

优点:在响应请求时速度较反向服务器负载均衡要快。

缺点:无法处理更高级的请求(负载均衡只能看到ip和端口信息

2)数据链路层负载均衡:

lvs-dr

在数据链路层修改Mac地址进行负载均衡。 负载均衡服务器的IP和它所管理的web 服务群的虚拟IP一致; 负载均衡数据分发过程中不修改访问地址的IP地址,而是修改Mac地址; 通过这两点达到不修改数据包的原地址和目标地址就可以进行正常的访问。

优点:不需要负载均衡服务器进行IP地址的转换。 数据响应时,不需要经过负载均衡服务器。

缺点:负载均衡服务器的网卡带宽要求较高

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

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

相关文章

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

引言&#xff1a;在使用 MyBatis 进行数据库操作时&#xff0c;#{} 和 ${} 的区别是面试中常见的问题&#xff0c;对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性&#xff0c;还涉及到性能优化。 题目 被拷打已老实&…

富唯智能打造的AGV搬运机器人转运机器人

AGV搬运机器人&转运机器人 AGV搬运机器人&#xff0c;内部搭载ICD系列核心控制器&#xff0c;拥有不同的移载平台&#xff0c;负载最高可达 1000kq;重复精度高达5mm;支持 Wi-Fi漫游&#xff0c;实现更稳健的网络数据交互;无轨化激光 SLAM 导航&#xff0c;配合 3D 避障相机…

2024年仿真建模与多媒体技术国际学术会议(ISMMT 2024)

全称&#xff1a;2024年仿真建模与多媒体技术国际学术会议&#xff08;ISMMT 2024&#xff09; 会议网址:http://www.ismmt.com 会议时间&#xff1a;最终通知见官网&#xff01; 会议地点: 深圳 投稿邮箱&#xff1a;ismmtsub-conf.com投稿标题&#xff1a;ArticleTEL。投稿时…

什么是“基准测试集”呢?

基准测试集有三部分构成&#xff1a;DocumentSet、QuerySet、RelevantJudgement。在比较多个IR系统孰优孰劣的时候&#xff0c;要做的就是&#xff1a;使用统一的DecumentSet建立索引&#xff0c;然后使用统一的QuerySet去进行查询&#xff0c;最后使用统一的judgement进行评判…

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程 一、目标网站:aHR0cHM6Ly9tb2JpbGUueWFuZ2tlZHVvLmNvbS8= 二、接口分析 1、快速定位加密位置(通过搜索/cells/hub/v3快速定位到加密js文件) 2、通过分析可知&#

HSP_09章 模块和包

文章目录 P102 模块的常见应用场景分析P103 模块的基本介绍1. 导入模块import2.实例演示 P104 自定义模块1.自定义模块的介绍:2. 注意事项和使用细节2.1 使用 __name__可以避免模块中测试代码的执行2.2 使用__all__可以控制 import *时,哪些功能被导入&#xff0c;注意: import…

禅道身份认证绕过漏洞(QVD-2024-15263)复现

禅道项目管理系统在开源版、企业版、旗舰版的部分版本中都存在此安全漏洞。攻击者可利用该漏洞创建任意账号实现未授权登录。 1.漏洞级别 高危 2.漏洞搜索 fofa: title"禅道"3.影响范围 v16.x < 禅道 < v18.12 &#xff08;开源版&#xff09; v6.x <…

Vue40-vueComponent构造函数

一、组件的本质&#xff1a;VueComponent构造函数 组件的本质是&#xff1a;构造函数 二、每一次调用vue.extend&#xff0c;返回的事一个全新的 VueComponent VueComponent的源码如下&#xff1a; 三、组件中的this 组件中的this是VueComponent实例对象&#xff0c;结构和vm…

通过视频网站传播的RecordBreaker窃密木马分析

1 攻击活动概览 近期&#xff0c;安天CERT监测到通过视频网站进行传播的攻击活动。攻击者窃取订阅者数量超过10万的视频创作者账号&#xff0c;发布与破解版热门软件相关的演示视频&#xff0c;诱导受害者下载RecordBreaker窃密木马。 RecordBreaker窃密木马是Raccoon…

基于DMAIC的SMT TX插件撞伤不良改善

在快速发展的电子制造领域&#xff0c;SMT&#xff08;表面贴装技术&#xff09;已经成为电子产品组装的核心技术之一。然而&#xff0c;SMT TX插件撞伤不良问题一直是制约生产效率与产品质量的瓶颈。本文将基于DMAIC&#xff08;定义、测量、分析、改进、控制&#xff09;方法…

注意力机制简介

为了减少计算复杂度&#xff0c;通过借鉴生物神经网络的一些机制&#xff0c;我们引入了局部连接、权重共享以及汇聚操作来简化神经网络结构。神经网络中可以存储的信息量称为网络容量。一般来讲&#xff0c;利用一组神经元来存储信息的容量和神经元的数量以及网络的复杂度成正…

重生奇迹MU 探秘奇幻世界

"探秘奇幻世界&#xff0c;成就无尽荣耀&#xff01;欢迎来到重生奇迹MU&#xff0c;一个永不落幕的游戏乐园。在这里&#xff0c;你可以尽情挑战各种困难&#xff0c;发掘神秘宝藏&#xff0c;还可与来自世界各地的玩家一起创造无尽的历史。为了帮助你更好地探索游戏世界…

用Vue3和ApexCharts打造交互式3D折线图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 ApexCharts 构建交互式折线图 应用场景 ApexCharts 是一个功能强大的 JavaScript 库&#xff0c;用于创建交互式、可定制的图表。在 Vue.js 中&#xff0c;它可以通过 vue3-apexcharts 插件轻松…

IPython大揭秘:神奇技巧让你掌握无敌编程力量!

IPython技巧 基础技巧文件操作技巧输入输出技巧魔术命令技巧调试技巧程序性能优化技巧输入输出重定向技巧魔术命令控制技巧自定义显示格式技巧多线程多进程技巧异常处理技巧数据可视化技巧自定义魔术命令技巧安装扩展包技巧Jupyter Notebook集成技巧文档显示技巧代码块执行技巧…

2024 年 Python 基于 Kimi 智能助手 Moonshot Ai 模型搭建微信机器人(更新中)

注册 Kimi 开放平台 Kimi&#xff1a;https://www.moonshot.cn/ Kimi智能助手是北京月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;于2023年10月9日推出的一款人工智能助手&#xff0c;主要为用户提供高效、便捷的信息服务。它具备多项强大功能&#xff0c;包括多…

【Orange Pi 5与Linux内核编程】-理解Linux内核中的container_of宏

理解Linux内核中的container_of宏 文章目录 理解Linux内核中的container_of宏1、了解C语言中的struct内存表示2、Linux内核的container_of宏实现理解3、Linux内核的container_of使用 Linux 内核包含一个名为 container_of 的非常有用的宏。本文介绍了解 Linux 内核中的 contain…

【软件工程】【22.10】p2

关键字&#xff1a; 软件开发基本途径、初始需求发现技术、UML表达事物之间关系、RUP需求获取基本步骤、项目过程建立涉及工作、项目规划过程域的意图和专用目标 判定表、分支覆盖、条件覆盖 三、简答 四、应用 这里条件覆盖有待商榷

ultralytics 8.2.35增加YOLOv9t/s/m模型全过程

yolov9的小模型开源也有两周左右了&#xff0c;ultralytics两天前新版本已经可以支持使用了。 过一段时间&#xff0c;Yolov10估计也快了。 yolov9的作者代码有一些部分本身就是从yolov5里“借鉴”而来&#xff0c;性能提高没提高见仁见智吧。 yolov10的nms free方式倒是比较…

有了MES、ERP,质量管理为什么还需要QMS?

在制造业&#xff0c;质量管理始终是企业管理中永恒的主题。品质管理要想做得更好&#xff0c;企业必须掌握足够多、足够有用的数据和信息&#xff0c;实现质量管理信息化。很多中小企业也很困惑&#xff0c;是否有必要上线QMS质量管理系统&#xff1f; 一、为什么企业需要QMS的…

C语言实现五子棋教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…