当前位置: 首页 > news >正文

LVS集群中的负载均衡技术

目录

一、LVS技术原理

二、NAT模式原理及部署方法

1、工作原理

2、部署方法

1、网络配置

2、软件安装与启用

3、测试

三、DR模式原理及部署方法

1、工作原理

2、部署方法

1、网络配置

2、解决vip响应问题

3、测试

四、ipvsadm命令及参数

1、管理集群服务(负载均衡器)的命令

2、管理集群中 RealServer 的命令

五、LVS中的调度方法

1、静态调度算法

2、动态调度算法

六、LVS优化

1、防火墙标签

2、LVS持久链接


LVS 技术出现的背景:
随着互联网的迅速发展,网站和网络服务的访问量不断增加。早期,单个服务器很难应对大量的并发请求,容易导致性能下降、响应延迟甚至服务崩溃。
在这种情况下,需要一种有效的方法来实现服务器的负载均衡,以提高系统的整体性能和可用性。
传统的负载均衡方法存在诸多局限性,例如硬件负载均衡设备成本高昂,而且缺乏灵活性和可扩展性。
Linux 操作系统因其开源、稳定、高效等特点在服务器领域得到广泛应用。基于 Linux 开发一种高效、灵活且成本相对较低的负载均衡技术成为了一种迫切的需求。
于是,LVS 技术应运而生,它充分利用了 Linux 系统的内核功能和网络特性,为解决服务器负载均衡问题提供了一种强大而经济有效的解决方案。

一、LVS技术原理

LVS(Linux Virtual Server)技术是一种基于 Linux 操作系统的开源负载均衡技术。

LVS 工作在网络的第四层,即传输层,它通过 IP 负载均衡技术和基于内容请求分发技术来实现对大量网络服务请求的高效分发和处理。

LVS 主要有三种工作模式:

  1. NAT 模式(Network Address Translation):通过修改请求数据包的目标 IP 地址和目标端口来实现请求的分发。这种模式配置简单,但对 LVS 服务器的性能要求较高,因为所有的请求和响应都要经过 LVS 服务器。 例如,在一个小型企业网络中,如果有多台 Web 服务器提供相同的服务,就可以使用 LVS 的 NAT 模式来均衡访问流量。

  2. DR 模式(Direct Routing):直接路由模式,请求数据包在通过 LVS 服务器时,LVS 服务器只修改数据包的目的 MAC 地址,然后将数据包直接发送到真实服务器。响应数据包直接由真实服务器返回给客户端,不再经过 LVS 服务器。 比如,在大型电商网站的服务器架构中,为了提高性能和可扩展性,常常采用 DR 模式进行负载均衡。

  3. TUN 模式(IP Tunneling):IP 隧道模式,LVS 服务器和真实服务器之间通过 IP 隧道进行通信。LVS 服务器将请求数据包封装在新的 IP 数据包中,然后发送到真实服务器,真实服务器解封装后处理请求,并直接将响应返回给客户端。 此种模式适用于服务器分散在不同地域的情况,通过公共网络建立隧道来实现负载均衡。

    LVS 技术具有高可用性、高扩展性和高性能等优点,被广泛应用于大型网站、云计算平台等场景,能够有效地提升系统的整体性能和可靠性。

本文主要介绍常用的NAT模式和DR模式。

LVS集群体系总框架:

VS(Virtual Server):指的是虚拟服务器,它是由 LVS 负载均衡器所构建的一个逻辑上的服务实体。客户端实际上是向这个虚拟服务器发送请求。 RS(Real Server):即真实服务器,是实际处理客户端请求并提供服务的服务器节点。 VIP(Virtual IP):虚拟 IP 地址,是客户端用来访问服务的公共 IP 地址。 DIP(Director IP):负载均衡器(Director)的 IP 地址,用于与后端真实服务器进行通信。 RIP(Real Server IP):真实服务器的 IP 地址。 CIP(Client IP):客户端的 IP 地址。

访问流程:CIP<->VIP== DIP<->RIP

二、NAT模式原理及部署方法

1、工作原理

在 LVS NAT 模式中,存在一个作为负载均衡器的 LVS 服务器和一组后端的真实服务器(Real Server)。 当客户端发送请求到 LVS 服务器时,LVS 服务器接收到请求数据包。 它会修改数据包中的目标 IP 地址和目标端口,将其转换为后端某一台真实服务器的 IP 地址和端口。 然后,LVS 服务器将修改后的数据包转发给选定的真实服务器。 真实服务器处理请求后,将响应数据包发送回 LVS 服务器。 LVS 服务器再对响应数据包进行源 IP 地址和源端口的转换,将其转换为客户端的 IP 地址和端口。 最后,LVS 服务器将响应数据包发送回客户端。

2、部署方法

基于RHEL9系统的环境搭建

RHEL9基础环境配置:

vmset.sh脚本配置

#企业9
[root@localhost mlh]# vim /bin/vmset.sh
#配置内容
#!/bin/bash
rm -fr /etc/NetworkManager/system-connections/$1.nmconnection
cat > /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1[ipv4]
address1=$2/24,172.25.254.2
method=manual
dns=114.114.114.114;
EOFchmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1hostnamectl hostname $3cat > /etc/hosts <<EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
$2	$3
EOF

实验准备:一台LVS负载均衡器和两台真实服务器

1、网络配置

LVS一个两个网卡分别为NAT模式和仅主机模式

两台真实服务器仅添加一个仅主机模式网卡

网卡配置:

LVS负载均衡器VS

vmset.sh eth0 172.25.254.100 lvs.mlh.org vmset.sh eth1 192.168.0.100 lvs.mlh.org nmcli connection reloadnmcli connection up eth0nmcli connection up eth1[root@lvs ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
#配置内容
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=192.168.0.100/24
method=manualnmcli connection reload
nmcli connection up eth1

由于两个网卡不在同一网络,打开内核路由功能

[root@lvs ~]# sysctl -a | grep ip_forward[root@lvs ~]# vim /etc/sysctl.conf[root@lvs ~]# sysctl -p	#配置生效
net.ipv4.ip_forward = 1

真实服务器RS

vmset.sh eth0 192.168.0.10 webserver1.mlh.org vmset.sh eth0 192.168.0.20 webserver2.mlh.org nmcli connection reload
nmcli connection up eth0

网关设置

[root@webserver1 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
#配置内容
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.10/24,192.168.0.100
method=manual
nmcli connection reload
nmcli connection up eth0[root@webserver2 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection 
#配置内容
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
nmcli connection reload
nmcli connection up eth0
2、软件安装与启用

程序包:ipvsadm

Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save

规则重载工具:/usr/sbin/ipvsadm-restore

配置文件:/etc/sysconfig/ipvsadm-config

ipvs调度规则文件:/etc/sysconfig/ipvsadm

[root@lvs ~]# dnf install ipvsadm -y[root@webserver1 ~]# dnf install httpd
[root@webserver1 ~]# systemctl enable --now httpd[root@webserver2 ~]# dnf install httpd
[root@webserver2 ~]# systemctl enable --now httpd

第一次安装未存储过/etc/sysconfig/ipvsadm文件,使用systemctl restart ipvsadm.service会报错,systemctl restart ipvsadm.service启动这个服务的作用就是加载ipvsadm文件内容,如果没有/etc/sysconfig/ipvsadm文件或者其中没有有效的配置,服务可能无法正确初始化或找不到所需的配置信息,从而导致报错。

3、测试
[root@webserver1 ~]# echo webserver-192.168.0.10 > /var/www/html/index.html[root@webserver2 ~]# echo webserver2-192.168.0.20 > /var/www/html/index.html
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

测试结果

[root@lvs home]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10

保存策略:需要做本地解析

[root@lvs home]# ipvsadm-save > /etc/sysconfig/ipvsadm

三、DR模式原理及部署方法

1、工作原理

在 LVS DR 模式中,同样存在负载均衡器(LVS 服务器)和后端的真实服务器(Real Server)。 当客户端发送请求到负载均衡器时,负载均衡器根据调度算法选择一台合适的真实服务器。 与 NAT 模式不同的是,负载均衡器不会修改请求数据包的目标 IP 地址,而是仅仅修改目标 MAC 地址为所选真实服务器的 MAC 地址。 然后,数据包直接通过交换机被转发到真实服务器。 真实服务器接收到请求后,直接处理请求,并将响应数据包直接返回给客户端,而不再经过负载均衡器。

2、部署方法

基于RHEL9系统的环境搭建

在NAT模式环境基础上增删配置,新增客户和路由两台主机

1、网络配置

LVS配置

删除之前网卡,设置新网卡为仅主机模式

vmset.sh eth0 192.168.0.50 lvs.mlh.org[root@lvs ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection 
#配置内容
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=192.168.0.50/24,192.168.0.100
method=manual
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo
[root@lvs ~]# nmcli connection reload 
[root@lvs ~]# nmcli connection up eth0 

路由主机配置

vmset.sh eth1 192.168.0.100 router.mlh.orgvmset.sh eth0 172.25.254.100 router.mlh.org[root@router ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
#配置内容
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=192.168.0.100/24
method=manual[root@router ~]# nmcli connection reload 
[root@router ~]# nmcli connection up eth1
[root@router ~]# nmcli connection up eth0

由于两个网卡不在同一网络,打开内核路由功能

[root@router ~]# vim /etc/sysctl.conf 
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1

client客户端配置

vmset.sh eth0 172.25.254.200 client.mlh.org
[root@client ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
#配置内容
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual[root@client ~]# nmcli connection reload 
[root@client ~]# nmcli connection up eth0

RS设备vip配置

[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo

网络测试

2、解决vip响应问题

在 LVS 的 DR 模式中,VIP 的响应存在一些需要特别注意的问题。首先,在 DR 模式下,真实服务器(RS)需要直接响应客户端的请求。为了实现这一点,RS 上需要配置 VIP 地址。但由于网络规则的限制,同一个网络段内不能存在相同的 IP 地址,这就可能导致网络冲突。 为了避免冲突,RS 上配置的 VIP 地址不能对外广播,通常是通过修改内核参数或者使用一些特殊的网络配置技巧来实现。 另外,当 RS 响应客户端请求时,源 IP 地址应该是 VIP 地址。然而,如果 RS 没有正确配置,可能会使用其真实的 IP 地址作为源 IP 进行响应,这会导致客户端无法正确接收响应,因为客户端发送请求的目标是 VIP 。

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:

(1)在前端网关做静态绑定

(2)在各RS使用arptables

(3)在各RS修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore

0:默认值,表示可使用本地任意接口上配置的任意地址进行响应

1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应限制通告级别:arp_announce

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告

1:尽量避免将接口信息向非直接连接网络进行通告

2:必须避免将接口信息向非本网络进行通告

在Real Server上做配置使rs主机vip不对外响应:

[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#重启后不生效
3、测试

在lvs主机上做策略如下

[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 1

实验结果

[root@client ~]# for i in {1..20}; do curl 192.168.0.200; done
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10
webserver2-192.168.0.20
webserver1-192.168.0.10

四、ipvsadm命令及参数

1、管理集群服务(负载均衡器)的命令

ipvsadm -A -t <VIP>:<Port> -s <调度算法> :添加一个新的集群服务,其中 <VIP> 是虚拟 IP 地址,<Port> 是端口,<调度算法> 可以是 rr(轮询)、wrr(加权轮询)、lc(最少连接)等。
例如:ipvsadm -A -t 192.168.1.100:80 -s wrr

ipvsadm -E -t <VIP>:<Port> -s <调度算法> :修改已存在的集群服务的调度算法。
例如:ipvsadm -E -t 192.168.1.100:80 -s lc

ipvsadm -D -t <VIP>:<Port> :删除一个集群服务。
例如:ipvsadm -D -t 192.168.1.100:80

2、管理集群中 RealServer 的命令

ipvsadm -a -t <VIP>:<Port> -r <RIP>:<Port> -m :添加一个真实服务器到集群服务中,-m 表示使用 NAT 模式。
例如:ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -m

ipvsadm -e -t <VIP>:<Port> -r <RIP>:<Port> [-g| -i| -m] :修改真实服务器的属性,如模式(-g 表示 DR 模式,-i 表示 TUN 模式)。
例如:ipvsadm -e -t 192.168.1.100:80 -r 192.168.1.11:80 -g

ipvsadm -d -t <VIP>:<Port> -r <RIP>:<Port> :从集群服务中删除一个真实服务器。
例如:ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.11:80

五、LVS中的调度方法

1、静态调度算法

1、轮询(Round Robin,RR)

原理:按照服务器列表的顺序,依次将请求分配给每台服务器,循环进行。

优点:实现简单,容易理解和配置,确保每台服务器都有机会处理请求,公平性较好。

缺点:不考虑服务器的实际负载和性能差异,可能导致性能较好的服务器无法充分发挥优势,而性能较差的服务器成为瓶颈

适用场景:服务器性能相当,且请求处理时间相对均匀,对负载均衡的精度要求不高的场景。

示例:假设有三台服务器 S1、S2、S3,请求依次按照 S1、S2、S3 的顺序分配。

2、加权轮询(Weighted Round Robin,WRR)

原理:为每台服务器设置一个权重值,根据权重比例分配请求。

优点:能够根据服务器的性能差异分配不同比例的请求,无法动态适应服务器负载变化。

缺点:权重设置可能不够精确,导致负载不均衡,无法动态适应服务器负载变化。

适用场景:服务器性能有差异,但差异相对稳定,能够大致评估服务器性能并设置合理权重。

示例:S1 权重为 2,S2 权重为 3,S3 权重为 5,对于 10 个请求,大约 2 个分配给 S1,3 个分配给 S2,5 个分配给 S3。

3、源地址哈希(Source Hashing,SH)

原理:根据请求的源 IP 地址进行哈希计算,将具有相同源 IP 地址的请求始终分配到同一台服务器。

优点:保证来自同一源的请求处理一致性,有利于会话保持。

缺点:可能导致服务器负载不均衡,对服务器故障的容错性较差。

适用场景:需要保持源 IP 相关会话或状态的应用。

示例:用户 A 的源 IP 哈希后始终对应服务器 S1,其后续请求都分配到 S1。

4、目标地址哈希(Destination Hashing,DH)

原理:基于请求的目标 IP 地址进行哈希运算,将请求分配到特定服务器。

优点:对于目标地址固定的请求,提高缓存命中率。

缺点:不够灵活,目标地址分布变化时可能负载不均。

适用场景:目标地址分布较为固定的场景。

示例:特定目标 IP 范围的请求总是分配到特定服务器。

2、动态调度算法

1、最少连接(Least Connections,LC)

原理:实时统计每台服务器当前的连接数,将新请求分配给连接数最少的服务器。

优点:能动态适应服务器负载变化,将请求分配到相对空闲的服务器,较好地平衡服务器负载。

缺点:对于短连接请求,连接数统计可能不准确,计算和更新连接数有一定开销

适用场景:服务器处理请求的时长差异较大,长连接和短连接混合的场景

示例:假设 S1 有 5 个连接,S2 有 8 个连接,S3 有 3 个连接,新请求会分配给 S3。

2、加权最少连接(Weighted Least Connections,WLC)

原理:为每台服务器设置权重,计算加权后的连接数(连接数×权重),将请求分配给加权连接数最少的服务器。

优点:综合考虑服务器性能和当前负载,更精准地平衡负载。

缺点:计算加权连接数较复杂,增加系统开销,权重设置需准确评估服务器性能。

适用场景:服务器性能和重要性不同,对负载均衡精度要求较高。

示例:S1 权重为 2,连接数为 5;S2 权重为 3,连接数为 8;S3 权重为 5,连接数为 3。S1 的加权连接数为 10,S2 为 24,S3 为 15,新请求分配给 S1。

3、基于局部性的最少连接(Locality-Based Least Connections,LBLC)

原理:根据请求的目标 IP 地址所属网段,将请求分配给同一网段中连接数最少的服务器。

优点:提高同一网段请求的处理效率和缓存命中率。

缺点:依赖准确的网段划分和识别,对跨网段请求的处理不够灵活。

适用场景:同一网段内请求较为集中的场景。

示例:若多个请求来自同一网段,且该网段内 S1 的连接数最少,则优先分配给 S1。

4、带复制的基于局部性最少连接(Locality-Based Least Connections with Replication,LBLCR)

原理:在 LBLC 基础上,在多台服务器上复制相同内容,提高命中率。

优点:进一步提高命中率和处理速度。

缺点:增加数据复制的开销,管理复杂度较高。

适用场景:对命中率和响应速度要求极高的场景。

示例:热门数据在多台服务器上复制,同一网段请求到来时优先分配到有复制数据的服务器。

5、最短期望延迟(Shortest Expected Delay,SED)

原理:在 WLC 基础上,计算服务器的预期延迟(连接数/权重),选择预期延迟最小的服务器。

优点:更精确地平衡服务器负载。

缺点:计算预期延迟增加系统开销。

适用场景:对服务器响应时间要求极高的场景。

示例:S1 权重为 2,连接数为 5;S2 权重为 3,连接数为 6;S1 的预期延迟为 2.5,S2 为 2,新请求分配给 S2。

6、永不排队(Never Queue,NQ)

原理:若有空闲服务器,直接将请求分配给空闲服务器,不排队。

优点:快速响应请求,减少等待时间。

缺点:可能导致服务器负载不均衡。

适用场景:对实时性要求极高,不能容忍请求排队的场景。

示例:新请求到来时,若 S3 空闲,直接分配给 S3。

六、LVS优化

1、防火墙标签

轮询错误:比如服务器的硬件配置(如 CPU、内存)、网络带宽以及正在运行的服务不同,导致处理能力各异,但轮询机制未区分。或者某些时间段或特定事件可能导致请求量突然增加,轮询无法快速适应这种负载的急剧变化。

原理:防火墙标签本质上是为网络数据包添加一个特定的标识。在 LVS 环境中,当数据包进入系统时,防火墙根据事先设定的规则为其打上标签。LVS 负载均衡器在进行请求分发时,不再仅仅依赖传统的轮询机制,而是可以根据这些标签来做出更智能的决策。

传统轮询可能导致性能较强的服务器未得到充分利用,而性能较弱的服务器负载过重。通过标签,可以将资源需求较大或关键的请求分配给更强大的服务器。

若某台服务器出现故障,轮询可能仍将请求发送到该服务器,导致服务中断。标签可标识故障服务器,使请求避开。

配置:

配置防火墙规则并设置标签:

使用 iptables 命令为特定的流量设置标签。

假设要为来自特定源 IP 范围的流量设置标签 10:

iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j MARK --set-mark 10

2、LVS持久链接

LVS 持久连接是为了保持同一客户端与后端服务器的持续性连接。当客户端首次与 LVS 建立连接时,LVS 根据调度算法将其分配到某一后端服务器。在持久连接的有效期内,后续来自该客户端的请求都将被定向到同一台后端服务器,以保持会话的一致性。

在 LVS 的配置中,可以通过设置持久连接的超时时间来启用持久连接功能。例如,使用 ipvsadm 命令设置持久连接超时时间为 3600 秒(1 小时):

ipvsadm -A -t <VIP>:<Port> -s <调度算法> -p 3600

其中,<VIP> 是虚拟 IP 地址,<Port> 是端口,<调度算法> 是选择的调度算法。

总之,防火墙标签和 LVS 持久连接都是为了优化 LVS 负载均衡的效果,以适应不同的网络环境和业务需求。

相关文章:

LVS集群中的负载均衡技术

目录 一、LVS技术原理 二、NAT模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、软件安装与启用 3、测试 三、DR模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、解决vip响应问题 3、测试 四、ipvsadm命令及参数 1、管理集群服务&#x…...

Java网络编程——HTTP协议原理

协议 我们在网上冲浪时&#xff0c;会在浏览器地址栏输入一个网址&#xff0c;然后就能打开网页了。比如&#xff0c;输入 https://www.douban.com/就可以访问到豆瓣的主页&#xff1a; 那么大家是否好奇&#xff1a;https 是什么意思&#xff0c;作用又是什么呢&#xff1f;…...

java之多线程篇

一、基本概念 1.什么是线程&#xff1f; 线程就是&#xff0c;操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。简单理解就是&#xff1a;应用软件中互相独立&#xff0c;可以同时运行的功能 2.什么是多线程&#xff1f; 有了多线…...

【深度学习】TTS,CosyVoice,训练脚本解析

https://github.com/FunAudioLLM/CosyVoice/blob/main/examples/libritts/cosyvoice/run.sh Bash 脚本是一个语音合成(TTS)训练和推理的完整流水线。让我们逐步解析这个脚本的各个部分。 初始化部分 #!/bin/bash # Copyright 2024 Alibaba Inc. All Rights Reserved. . ./…...

《Unity3D网络游戏实战》学习与实践

纸上得来终觉浅&#xff0c;绝知此事要躬行~ Echo 网络上的两个程序通过一个双向的通信连接实现数据交换&#xff0c;这个连接的一端称为一个Socket “端口”是英文port的意译&#xff0c;是设备与外界通信交流的出口。每台计算机可以分配0到65535共65536个端口 每一条Sock…...

Machine_Matrix打靶渗透【附代码】(权限提升)

靶机下载地址&#xff1a; https%3A%2F%2Fdownload.vulnhub.com%2Fmatrix%2FMachine_Matrix.zip 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:D9:36:81 1.2. 端口扫描 nmap -p- 192.168.7.155 1.3. 目录扫描 dir…...

代码随想录算法训练营Day22 | Leetcode 77 组合 Leetcode 216 组合总和Ⅲ Leetcode17 电话号码的字母组合

前言 回溯算法中递归的逻辑不重要&#xff0c;只要掌握回溯的模板以及将问题转化为树形图&#xff0c;整个问题就很好解决了&#xff0c;比二叉树简单。 Leetcode 77 组合 题目链接&#xff1a;77. 组合 - 力扣&#xff08;LeetCode&#xff09; 代码随想录题解&#xff1a;…...

【微信小程序实战教程】之微信小程序中的 JavaScript

微信小程序中的 JavaScript 微信小程序的业务逻辑都是通过JavaScript语言来实现的&#xff0c;本章我们将详细的讲解JavaScript的基本概念&#xff0c;以及在小程序中如何使用JavaScript语言。JavaScript是一种轻量的、解释型的、面向对象的头等函数语言&#xff0c;是一种动态…...

K-近邻算法(一)

一、 K- 近邻算法 (KNN) 概念 1.1 K- 近邻算法 (KNN) 概念 K Nearest Neighbor 算法⼜叫 KNN 算法&#xff0c;这个算法是机器学习⾥⾯⼀个⽐较经典的算法&#xff0c; 总体来说 KNN 算法是相对⽐ 较容易理解的算法 定义 : 如果⼀个样本在特征空间中的k 个最相似 ( 即特征空间…...

从零开始之AI视频制作篇

从零开始之AI视频制作篇 文章目录 从零开始之AI视频制作篇前言一、工具列表二、成片展示三、制作流程1、获取图片素材2、图片生成视频2.1 Runway操作流程 3、文本生成语音3.1 Fish Audio操作流程 4、视频剪辑4.1 音频素材4.2 字幕生成 四、Runway提示词参考&#xff1a;参考 前…...

Java之TCP编程综合案例

1.反转案例 搭建一个TCP客户端&#xff0c;从键盘录入整行数据&#xff08;遇到quit结束录入&#xff09;然后发送给服务器&#xff0c;再接收服务器返回的数据并输出。 package com.briup.chap12;public class Test064_ReversalClient {public static void main(String[] ar…...

【数据分析---Pandas实战指南:精通数据查询、增删改操作与高效索引和列名操作管理】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索数据分析&#xff0c;本篇文章主要讲述了&#xff1a;数据查询操作&#xff0c;数据增删改操作&#xff0c;索引和列名操作等等。欢迎大家一起探索讨论&#x…...

Spring Cloud全解析:注册中心之Eureka服务获取和服务续约

服务获取和服务续约 eureka客户端通过定时任务的方式进行服务获取和服务续约&#xff0c;在com.netflix.discovery.DiscoveryClient类中&#xff0c;启动了两个定时任务来进行处理 private void initScheduledTasks() {// 是否需要拉取if (clientConfig.shouldFetchRegistry(…...

三相整流电路交流侧谐波仿真分析及计算

一、三相桥式全控整流电路和功率因数测量电路SIMULINK 模型 如图4-1&#xff0c;根据高频焊机的主电路机构和工作原理&#xff0c;可将高频焊机三相整流部分等效为阻感负载的三相桥式全控整流电路模型&#xff0c;其由三相交流电压源、三相晶闸管整流桥、同步六脉冲触发器和阻感…...

了解Java中的反射,带你如何使用反射

反射的定义 反射&#xff08;Reflection&#xff09;是Java的一种强大机制&#xff0c;它允许程序在运行时动态地查询和操作类的属性和方法。通过反射&#xff0c;Java程序可以获取类的信息&#xff0c;比如类的名称、方法、字段&#xff0c;以及可以动态地创建对象、调用方法…...

【c++】基础知识——快速入门c++

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、手搓一个Hello World 二、命名空间namespace 1.命名空间的定义 2.命名空间的使用 3.命名空间补充知识 三、c中的输入和输出 四、缺省参…...

AI学习记录 - 自注意力机制的计算流程图

过段时间解释一下&#xff0c;为啥这样子计算&#xff0c;研究这个自注意力花了不少时间&#xff0c;网上很多讲概念&#xff0c;但是没有具体的流程图和计算方式总结…...

JavaScript快速入门,满满干货总结,快速掌握JS语法,DOM,BOM,事件

目录 一. JavaScript、HTML、CSS简介 1.1 HTML简介和举例说明 1.2 CSS简介和举例说明 1.3 JavaScript 简介和举例说明 二. JavaScript 基本语法 2.1 变量类型和定义方式 2.2 逻辑运算符&#xff0c;比较运算符 2.3 流程控制&#xff0c;if&#xff0c;if...else...&…...

【C++】C++入门基础【类与对象】

目录 1.类 1.1类的定义 1.2struct 与 class对比 2.访问限定符 3. 类域 4.实例化 5.存储大小----内存对齐 6.this指针 1.类 1.1类的定义 class作为类的关键字&#xff0c;后面跟的是类的名字&#xff0c;如Stack&#xff0c;{}中的为类的主体&#xff0c;类定义结束时…...

Qt | QScatterSeries 散点图

点击上方"蓝字"关注我们 01、QScatterSeries QScatterSeries 的类,它将代表散点图中的一个系列。这个类将包含数据点、颜色和样式等属性,以及用于绘制散点图的方法。 02、main.cpp #include <QtWidgets/QApplication>#include <QtWidgets/QMainWindow…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...

iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)

崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题&#xff0c;不一定会立刻崩&#xff0c;但一旦积累&#xff0c;就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能&#xff0c;而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...

信息系统分析与设计复习

2024试卷 单选题&#xff08;20&#xff09; 1、在一个聊天系统(类似ChatGPT)中&#xff0c;属于控制类的是&#xff08;&#xff09;。 A. 话语者类 B.聊天文字输入界面类 C. 聊天主题辨别类 D. 聊天历史类 ​解析 B-C-E备选架构中分析类分为边界类、控制类和实体类。 边界…...