负载_负载均衡 - CSDN
精华内容
参与话题
  • 负载均衡

    万次阅读 多人点赞 2018-05-28 10:08:23
    流量负载均衡介绍1 负载均衡产生的背景LB(Load Balance,负载均衡)是一种集群技术,它将特定的业务(网络服务、网络流量等)分担给多台网络设备(包括服务器、防火墙等)或多条链路,从而提高了业务处理能力,保证...

    流量负载均衡介绍

    1 负载均衡产生的背景

    LB(Load Balance,负载均衡)是一种集群技术,它将特定的业务(网络服务、网络流量等)分担给多台网络设备(包括服务器、防火墙等)或多条链路,从而提高了业务处理能力,保证了业务的高可靠性。

    负载均衡技术具有一下优势:

    (1)高性能:负载均衡技术将业务较均衡的分担到多台设备或链路上,从而提高了整个系统的性能;

    (2)可扩展性:负载均衡技术可以方便的增加集群中设备或链路的数量,在不降低业务质量的前提下满足不断增长的业务需求;

    (3)高可靠性:单个甚至多个设备或链路法神故障也不会导致业务中断,提高了整个系统的可靠性;

    (4)可管理性:大量的管理共组都集中在使用负载均衡技术的设备上,设备集群或链路集群只需要维护通过的配置即可;

    (5)透明性:对用户而言,集群等于一个或多个高可靠性、高性能的设备或链路,用户感知不到,也不关心具体的网络结构,增加或减少设备或链路数量都不会影响正常的业务。

    负载均衡技术分类:

    (1)             服务器负载均衡:在数据中心等组网环境中,可以采用服务器负载均衡,将网络服务分担给多台服务器进行处理,提高数据中心的业务处理能力;

    (2)             链路负载均衡:在有多个运营商出接口的组网环境中,可以采用出方向多链路动态负载均衡,实现链路的动态选择,提高服务的可靠性;

    (3)             防火墙负载均衡:在防火墙处理能力成为瓶颈的组网环境中,可以采用防火墙负载均衡,将网络流量分担给多台防火墙设备,提高防火桥的处理能力;

    1.1 服务器负载均衡

    随着Internet的快速发展和业务量的不断提高,基于网络的数据访问流量迅速增长,特别是对数据中心、大型企业以及门户网站等的访问,其访问流量甚至达到了10Gb/s的级别;同时,服务器网站借助HTTP,FTP,SMTP等应用程序,为访问者提供了越来越丰富的内容和信息,服务器逐渐被数据淹没;另外,大部分网站(尤其电子商务等网站)都需要提供不间断24小时服务,任何服务中断或通信中的关键数据丢失都会造成直接的商业损失。这些都对应用服务提出了高性能和高可靠性的需求。

    但是,相对于网络技术的发展,服务器处理器速度和内存访问速度的增长却远远低于网络带宽和应用服务的增长,网络带宽增长的同时带来的用户数量的增长,也使得服务器资源消耗严重,因而服务器成为了网络瓶颈;传统的单机模式,也往往成为网络故障点。

    1.1.1 服务器负载均衡解决方案

    多台服务器通过网络设备相连组成一个服务器集群,每台服务器都提供相同或相似的网络服务。服务器集群前端部署一台负载均衡设备,负责根据已配置均衡策略将用户请求在服务器集群中的分发,为用户提供服务,并对服务器可用性的维护。

    该方案的优势:

    (1)低成本:按照业务量增加服务器个数即可;已有资源不会浪费,新增资源无需选择昂贵的高端设备。

    (2)可扩展性:当业务量增长时,系统可通过增加服务器来满足需求,且不影响已有业务,不降低服务质量。

    (3)高可靠性:单台服务器故障时,由负载均衡设备将后续业务转向其他服务器,不影响后续业务提供,7 × 24小时业务不中断。

    1.2 链路负载均衡

    就互联网接入来说,众所周知,由于国内的两大运营商---电信与网通之间的瓶颈问题,导致电信网通用户互访时出现延迟较,响应缓慢,更有甚者会直接导致用户正常的业务无法运行。而且单条链路存在单点故障的隐患,当互联网链路DOWD掉时,可能引起的直接问题就是用户所有依赖互联网的业务及对互联网的访问都会因此而无法使用,这对于一个用户来说是无法想象的。

    目前在互联网接入时存在的主要问题:

    (1)电信网通瓶颈问题

    (2)单条链路存在单点故障

    (3)主备链路需要人工切换

    1.2.1 链路负载均衡解决方案

    通过接入电信网通两条(或多条链路)来保障网络的连通性,持续性以及快速访问。并提供各链路间的智能备份,实现链路级别的快速高可用。

    1.2.1.1 outbound方向链路负载均衡(从内到外的链路负载均衡)

    通过电信、网通双链路的接入,并使用静态和动态相结合的多链路负载均衡功能,使内部用户无论是访问网通资源还是电信资源,都可以从相应的线路进行访问.解决了从内到外的电信网通的互访瓶颈。

    1.2.1.2 inbound方向链路负载均衡(从外到内的链路负载均衡)

    解决外部用户访问内部服务器时所遇到的不同ISP的互访瓶颈.当ISP A的用户访问内部的www.abc.com时把ISP A接口的地址解析给用户,使其通过ISP A线路来访问www.abc.com. 当ISP B用户来访问内部的www.abc.com时,再把ISP B接口的地址解析给用户,使其通过ISP B的线路来访问www.abc.com.

    1.2.1.3 多条链并行使用以及智能备份

    多链路负载均衡还提供了链路的自动探测及备份功能,当某条链路断掉时,自动将流量切换到正常链路上,同时对外提供的访问,也将只解析正常链路的地址,使访问人员通过当前正常的链路来访问内部的服务。从进出双向来保障链路的正常工作。

    1.3 网关负载均衡

    SSL-VPN网关,IPSec网关,防火墙网关等网关设备,因为业务处理的复杂性,往往成为网络瓶颈,以防火墙网关为例:防火墙作为网络部署的“警卫”,在网络中不可或缺,但其往往不得不面临这样的尴尬:网络防卫越严格,需要越仔细盘查过往的报文,从而导致转发性能越低,成为网络瓶颈。

    在这种情况,如果废弃现有设备去做大量的硬件升级,必将造成资源浪费,随着业务量的不断提升,设备也将频繁升级。频繁升级的高成本是相当可怕的。因此将网关设备等同于服务器,组建网关集群的方案应运而生:将多个网关设备并联到网络中,从而形成集群处理能力,提高网络处理能力。

    1.3.1 网关负载均衡解决方案

    防火墙负载均衡包括以下几个基本元素:

    (1)      集群:提供网络流量负载均衡的群体,包括LB、Fireall;

    (2)      LB:负责分发请求发起方的网络流量到多台Firewall设备,LB又分为一级和二级,如果请求发起方的流量方向为Host A-àHost B,则LB A为一级,LB B为二级;方向类似;

    (3)      Firewall:正常处理数据的防火墙。

    2 负载均衡调度算法

    负载均和产品中的关键技术是调度,目前常用的调度算法有

    轮询(Round Robin

     

    加权轮询(Weighted Round Robin

     

     

     

    最少连接(Least Connections

     

     

     

    加权最少连接(Weighted Least Connections

     

     

     

    随机(Random

     

     

     

    加权随机(Weighted Random

     

     

     

    源地址散列(Source Hashing

     

     

     

    源地址端口散列(Source&Port Hashing

     

     

    2.1 负载均衡算法介绍

    (1)轮询算法

    新的连接被依次轮询分发到各个实服务上,比如第一个连接分发到第一台服务器,第二个连接分发到第二台服务器上;

    轮询算法适用于服务器集群中所有服务器都有相同的软硬件配置,并且平均服务器请求相对均衡的情况;

     

    (2)加权轮询算法

     

    根据服务器不同的处理能力,给服务器分配不同的权值,使其能接受相应权值的服务器请求;

    加权轮询算法能确保高性能的服务器能得到更多的使用率,避免低性能的服务器过载过重;

     

    (3)最少连接数算法

     

    最少连接数算法对内部需要负载的每一台服务器上的连接数都一个记录,记录当前该服务器正在处理的连接数,当有新的服务连接请求时,把请求分发给连接数最少的服务器,使均衡更加符合实际情况,负载更具啊均衡;

    最少连接数算法适合长时间处理的请求,例如:FTP。

    加权最少连接数算法,即将加权与连接数配合使用,根据连接数与加权的比例计算出当前请求应该分发给哪个具体的服务器;

     

    (4)随机算法

    将新连接请求随机分发给各个服务器;

    加权随机算法,即将加权与随机算法配合使用,根据随机数与加权的比例计算出当前请求应该分发给哪个具体的服务器;

     

    (5)源地址散列

    根据新连接请求的源IP地址进行散列HASH的结果,决定将请求分发给具体的服务器;

    来在相同客户端的连接会被分发到相同的服务器上;

     

    2.2 持续性

    将多个连接持续重定向到同一个服务器的策略,就是持续性功能。根据持续性原则,建立会话表项,保证后续业务报文都送往同一个服务器处理。比如使用源地址建立持续性表项,保证持续性。

    u  基于源IP地址的持续性功能:

    负载均衡设备接收到某一客户端的某一业务的首次请求时,建立持续性表项,记录为该客户分配的服务器情况,在会话表项生存周期内,后续该业务报文都将发往该服务器处理。基于源IP地址持续性功能的特点是:实现简洁快速。

    u  Cookies保持

    Cookies持续性利用客户机存储的cookies信息来吧客户机连接到合适的服务器上,其原理如下:

    (1)      首次命中Http请求(不带cookes)进行LB,此时LB任选一台服务器,将请求转发至该服务器;

    (2)      来自该服务器的Http回复报文此时包括一个空白的cookies,LB重写cookies,并再粘贴一个特殊的cookies后将http报文发送回去;

    (3)      再次命中Http请求(带有与上面形相同的cookies)进入LB,LB设备借助cookies信息确定合适的服务器;

    3 服务器负载均衡技术介绍

    3.1 概念介绍

    u  虚服务:负载均衡设备对外提供的服务称为虚服务,虚服务由VPN实例,虚服务IP地址、服务协议、服务端口号唯一标识,配置负载均衡设备上,客户的访问请求通过公关网络或私有网络到达负载均衡设备时,匹配到虚服务后,由负载均衡设备按照既定的策略分发给实服务;

    u  实服务:实服务器是真实服务器提供一种服务,该服务含义比较广泛,可以是传统的FTP,HTTP等业务,也可以是广泛的转发服务,如防火墙网关负载均衡中,实服务只是报文的转发路径;

    u  实服务组:为了便于对实服务进行管理,将多个实服务的一些共有属性提取出来形成实服务组,一个虚服务对应一个实服务组,一个实服务组对应多个实服务,相同的实服务组不能属于不同的虚服务;

    3.2 服务器负载均衡工作机制

    服务器负载均衡有两种工作方式:

    u  NAT(Network Address Translation,网络地址转换)方式

    u  直接路由(DirectRouting,简称DR)方式

    (1)NAT方式

    NAT方式组网灵活,后端服务器可以位于不同的物理位置,不同的局域网内。

    1、实现原理

    客户端将到VSIP的请求发送给服务器群前端的负载均衡设备,负载均衡设备上的虚服务接收客户端请求,通过调度算法,选择真实服务器,再通过网络地址转换,用真实服务器地址重写请求报文的目标地址后,将请求发送给选定的真实服务器;真实服务器的响应报文通过负载均衡设备时,报文的源地址被还原为虚服务的VSIP,再返回给客户,完成整个负载调度过程。

    2、技术特点

    组网灵活,对服务器没有额外要求,不需要修改服务器配置,适用于各种组网。

    步骤

    说明

    源IP

    目的IP

    1

    Host发放请求报文

    Host-IP

    VIP

    2

    LB收到请求报文后,根据调度算法计算出请求报文分发给哪台服务器

    -

    -

    3

    LB使用DNAT技术分发报文

    Host-IP

    Server IP

    4

    Server接收并处理请求,返回相应报文

    Server IP

    Host-IP

    5

    LB接收相应报文,转换源IP后转发

    VIP

    Host-IP

     

    (2)DR方式

    相对于NAT 组网方式,DR 组网方式,只有客户端的请求报文通过LB,服务器的响应报文不经过LB,从而减少了LB的负载,有效的避免了LB成为网络瓶颈。

    1、实现原理

    DR方式的服务器负载均衡时,除了LB设备上配置了VSIP,真实服务器也都配置了VSIP址,配置的VSIP要求不能响应ARP请求,例如在环回接口上配置VSIP。发送给VSIP的报文,由LB分发给相应的真实服务器,从真实服务器返回给客户端的报文直接通过交换机返回。

    2、技术特点

    只有单边报文经过负载均衡设备,负载均衡设备负担小,不易成为瓶颈,转发性能更强。

    步骤

    说明

    源IP

    目的IP

    1

    Host发放请求报文

    Host-IP

    VIP

    2

    General device收到请求后转发给LB,Server上的VIP不能发送和相应ARP报文,因此General device只能将报文转发给LB

    Host-IP

    VIP

    3

    LB使用调度算法决定将报文分发给哪台服务器,在封装报文时目的IP为VIP,目的MAC为Server的目的MAC(根据ARP请求Server IP获取)

    -

    -

    4

    LB转发报文给Server服务器

    Host-IP

    VIP

    MAC=Server-MAC

    5

    Server接收并处理请求,返回相应报文给General device

    VIP

    Host-IP

    6

    General device收到报文后,直接转发给Host

    VIP

    Host-IP

    3.3 服务器状态检查

    所谓状态检查就是指负载均衡设备定期对真实服务器运行状态进行探测,收集相应信息,及时隔离工作异常的服务器。健康检查的结果除标识服务器能否正常工作外,还可以统计出服务器影响时间,作为选择服务器的依据。负载均衡技术支持丰富的健康状态检查算法,可以有效地探测和检查服务器的运行状态。

    ICMP:向服务器发送ICMPEcho报文,若收到ICMP Reply,则服务器正常;

    TCP:向服务器的某端口建立TCP连接,若成功,则服务器正常;

    HTTP:和服务器的80端口建立TCP连接,然后发出HTTP请求,若所收到的HTTP应答内容争取,则服务器正常;

    FTP:和服务器21端口建立连接,然后获取一个服务器相关目录放置的文件,若所收到的文件内容正确,则服务器正常;

     

    4 链路负载技术介绍

    链路负载均衡根据业务流量方向可以分为outbound链路负载均衡和inbound链路负载均衡两种情况。

    4.1 outbound链路负载均衡

    内网用户和外网之间存在多条链路时,通过outbound链路负载均衡可以实现在多条链路上分担内网用户访问外网服务器的流量。

    1、  实现原理

    Outbound链路负载均衡中VSIP为内网用户发送报文的目的IP,用户将访问VSIP的报文发送到负载均衡设备上后,负载均衡设备依次根据持续性、ACL策略、就近性、调度算法选择最佳的物理链路,并将内网流量分发到该链路上。

    2、  技术特点

    可以和NAT应用网关共同组网,不同的链路使用不同的源地址,从而保证往返报文穿过同一条链路;

    通过健康性检查,可以检查链路内任意节点的连通性,从而有效保证整条链路上的可达性;

    通过调度算法,在多条链路间均衡流量,并支持按照带宽进行负载均衡;

    利用就近性算法动态计算链路的质量,将流量分发到当前最优链路上。

    步骤

    说明

    1

    LB设备接收到内网流量

    2

    LB设备依据就近性,ACL策略,持续性,调度算法选择链路

    3

    LB设备将流量分发到选择出的链路上

    4

    LB接收外网用户流量

    5

    LB将外网用户流量转发给设备

    4.2 inbound链路负载均衡

    内网和外网之间存在多条链路时,通过inbound链路负载均衡可以实现在多条链路上分担外网用户访问内网服务器的流量。

    1、  实现原理

    Inbound链路负载均衡中,负载均衡设备作为权威服务器记录域名与内网服务器IP地址的映射关系,一个域名可以映射多个IP地址,其中每个IP地址对应一条物理链路;

    外网用户通过域名方式访问内网服务器时 ,本地DNS服务器将域名解析请求发送给权威名称服务器——负载均衡设备,负载均衡设备依据持续性、ACL策略、就近性等算法选择最大的链路,并将通过该链路与外网接口的IP地址作为DNS解析结果反馈给外网用户,外网用户通过该链路访问内网服务器。

    2、  技术特点

    可以和服务器负载均衡配置使用,实现外网用户访问内网服务器的流量在多条链路间均衡的同时,也实现了流量在多台服务器间均衡;

    通过健康检查,可以检查链路内任意节点的连通性,从而有效保证整条链路的可达性;

    利用就近性算法动态计算链路的质量,保证转发流量的链路时当前最佳的链路。

    步骤

    说明

    1

    外网用户通过域名访问内网服务器时,首先要进行DNS解析,向本地DNS服务器发送DNS解析请求

    本地DNS服务器将DNS请求转发给权威的名称服务器——LB

    2

    LB设备根据请求的域名,持续性,ACL策略,就近性等算法选择最用的物理链路,并将给物理链路与外网连接的接口IP地址作为域名解析结果

    3

    LB设备将解析结果返回给本地DNS

    4

    本地DNS将结果返回给Host

    5

    用户使用返回的结果对内网发起访问

    5 网关负载均衡

    LB Device负载分发请求发起方的网络流量到多个网关设备,LB又分为一级和二级,如果请求发起方的网络流量为Host A->Host B,则LB Device A为一级,LB Device B为二级;

    网络设备:正常处理数据的网络设备;

    1、  实现原理

    防火墙是基于会话开展业务的,即一个会话的请求和应答报文必须通过同一个防火墙,为了保证防火墙业务正常进行,内部组网不受影响,需要采用双侧防火墙,即防火墙三明治。在这种组网环境中,对于流入流量一级LB设备做防火墙负载均衡,二级LB设备保证从哪个防火墙进来的流量,还要从哪个防火墙返回;流出链路正好相反。

    2、  技术特点

    服务对象为防火墙,提高防火墙组网灵活性。没有特殊要求,适用于任何组网环境。

    步骤

    说明

    1

    LB A接收网络流量

    2

    LB A根据调度算法将流量转发给某台Firewall

    3

    Firewall将流量转发给LB B

    4

    LB B记录转发流量的防火墙,并把流量转发到目的地

    5

    LB B接收来自目的地的回应流量

    6

    LB B根据记录将流量转发给相应的防火墙

    7

    Firewall将流量转发给LB A,LB A将流量转发回源地址

    防火墙负载均衡也可以服务器负载均衡配置使用:

    Cluster A为防火墙负载均衡的集权,ClusterB为服务器的负载均衡集群,综合组网的工作流程就是防火墙和服务器负载均衡的叠加,这种组网方式避免了防火墙称为网络中的瓶颈,也提高了网络服务的性能和可用性。

    6 智能选路

    智能选路系统——不仅仅是一项功能

    智能选路系统——是一系列功能组成的解决方案

    6.1 关键用户走某条优质链路——默认路由+策略路由

    选路原理

    关键用户走某条优质链路

    普通用户按照流量在出口设备被均衡分配

    优势

    实现简单,业内路由器均可支持

    缺点

    优质链路跑满,关键用户业务受影响

    存在跨运营商现象,影响用户上网体验

     

    6.2 从运营商下载IP列表——静态路由+默认路由

    选路原理

    从运营商下载ISP的IP地址列表

    通过静态路由的方式静态选路,访问电信的走电信,访问联调的走联调

    其余流量走大带宽链路(默认路由)

    优势

    解决了跨运营商问题,

    选择正确的IPS链路,保证用户体验

    实现简单,业内标准路由器都可以支持

    缺点

    1、ISP列表变化频繁,第一次实施后不易更新和维护

    2、若链路跑满,路由策略无法自动变更,例如:

    (a)电信链路跑满,联调链路空闲,若用户命中电信地址,仍然会选择电信链路,从而造成丢包

    (b)电信链路空闲,默认路由链路跑满,后续命中默认路由的数据仍会现则满载链路,造成丢包

    6.3 智能选路

    链路健康监测优先级最高,若链路失效,则链路上所有路由策略都会失效

    策略路由高于过载保护,即使某条链路负载已经超过设定的保护阀值,通过策略路由仍可使用该链路

    若应用路由、静态路由、地址库路由、默认路由中,存在等价路由,则可以通过MLLB进行负载

     

    6.4 链路过载保护

    链路负载超过设置的阈值,后续流量切换到其他链路

    切换的前提是NPE自动探测到链路到目的IP地址可到

    策略路由不受过载保护的影响

    6.5 应用路由

    首包识别数据流的应用,根据应用做选路,传统应用路由的难点:

    u  基于应用的路由,首先要把应用识别出来;

    u  目前应用的识别无外乎DPI,DFI等;

    u  DPI识别是通过7层特征识别,需要等待流的连接建立完成,7层协议开始传出后才能识别出来,简单的说,DPI的是被落后与连接的建立,当DPI识别出该应用的时候,连接已经建立起来,这时如果再做选路,必须首先要断掉之前建立的流连接;

    6.5.1 大流量协议识别

    技术点

    协议识别:

    大容量传输的应用通常有控制流量和传输流量,比如:FTP,迅雷,BT,电驴,QVOD等

    原理

    控制流量不做应用路由

    识别传输流量做应用路由

     

    6.5.2 DNS识别

    技术点

    特定网站,只需要截获DNS报文,就可以知道其类型。

    如:优酷、土豆、奇艺、新浪视频等

    原理

    监测DNS报文,发现URL请求是特定网站,记录DNS回应报文(即该网站的IP)进行路由,影响IP流量通过设备时会被路由到特定的链路上;

    若门户网站包含视频,则只监控视频类。如新浪,只监控video.sina.com.cn

     

    6.5.3 主动控制


    技术点

    P2P协议,如果断流,双方会发起重传机制

    原理

    对于P2P,在初期通过DPI、DFI识别后,主动将其切断;

    通过NPE记录的流信息,根据应用路由重传请求;

    用户端不会有任何感知;

     

    6.5.4 地址库

    技术点

    某些应用的目的IP固定,且流量大,如网盘、移动终端应用下载等

    原理

    人工收集此类应用的目的IP

     

    6.6 DNS代理

    u  DNS代理不属于路由体系,但能影响选路结果;所有的路由体系的选路都是目的IP通过DNS确认后,才开始工作的;而DNS代理是帮助用户获得更合理IP的技术,所以其生效是在路由体系之前;

    u  适用范围:目标URL拥有多个ISP的服务器(一般大型网站都如此);

    u  用户价值:在链路负载过高时,提升用户体验,合理分配目的IP所属运营商,结合地址库,使链路利用更均衡。(如,不开此功能,用户DHCP分配电信DNS,则10个网站解析出9个电信+1个联通,电信链路压力大;开启该功能后,解析出5个电信+5个联通,减小电信链路压力);

    6.6.1 DNS代理实现原理

     

    原理

    u  设备上开启DNS代理功能;

    u  配置电信和联调的DNS服务器;

    u  当有DNS请求到达设备时,设备会根据链路负载情况决定向电信DNS服务器或联调DNS服务器发送DNS请求报文;

    u  DNS回应报文到达设备后,设备透传给Host

     

    6.7 智能选路实现效果

    展开全文
  • 背景 日常工作中,在衡量服务器的性能时,经常会涉及到几个系统指标,load、cpu、mem、qps、rt等。...本文、主要介绍一下这几个系统指标——系统负载(load)、cpu利用率、内存使用率、网络IO、磁...

    背景

    日常工作中,在衡量服务器的性能时,经常会涉及到几个系统指标,load、cpu、mem、qps、rt等。每个指标都有其独特的意义,很多时候在线上出现问题时,往往会伴随着某些指标的异常。大部分情况下,在问题发生之前,某些指标就会提前出现异常。

    对于这些指标的理解、查看以及异常解决方法是程序员的必备技能。本文主要介绍一下这几个系统指标——系统负载(load)、cpu利用率、内存使用率、网络指标。

    系统指标异常分类

    • CPU使用率分析和异常排查
    • 系统负载(load)分析和异常排查
    • 内存使用率分析和异常排查
    • 网络IO分析和异常排查

    1 CPU使用率分析和异常排查

    1.1 什么是CPU使用率

    什么是CPU时间片?我们现在所使用的Windows、Linux、Mac OS X都是“多任务操作系统”,就是说他们可以“同时”运行多个程序,比如一边打开Chrome浏览器浏览网页还能一边听音乐。但是,实际上一个CPU内核在同一时刻只能干一件事,那操作系统是如何实现“多任务”的呢?大概的方法是让多个进程轮流使用CPU一小段时间,由于这个“一小段时间”很短(在linux上为5ms-800ms之间),用户感觉不到。就好像是几个程序同时在运行了。上面提到的“一小段时间”就是我们所说的CPU时间片,CPU的现代分时多任务操作系统对CPU都是分时间片使用的。

    CPU使用率,就是程序对CPU时间片的占用情况,即CPU使用率 = CPU时间片被程序使用的时间 / 总时间。比如A进程占用10ms,然后B进程占用30ms,然后空闲60ms,再又是A进程占10ms,B进程占30ms,空闲60ms,如果在一段时间内都是如此,那么这段时间内的CPU占用率为40%。

    大多数操作系统的CPU占用率分为用户态CPU使用率和系统态CPU使用率。用户态CPU使用率是指执行应用程序代码的时间占总CPU时间的百分比。相比而言,系统态CPU使用率是指应用执行操作系统调用的时间占总CPU时间的百分比。系统态的CPU使用率高意味着共享资源有竞争或者I/O设备之间有大量的交互

    1.1.1 TOP命名查看CPU使用率

    参数详解

    top命令中常用列的排序方式如下,CPU和内存是实践中最常用的排序方式

    • M 根据驻留内存大小进行排序。
    • P 根据CPU使用百分比大小进行排序。

    注意以上字母都是大写。

    注:96.0id,表示空闲CPU,即CPU未使用率,100%-96.0%=4%,即系统的cpu使用率为4%。

    如果要查看每个处理器核心的CPU占用情况,在top页面按下数字1即可展示每个核的CPU占用率,如下图所示共有4个核。

    1.1.2 查看CPU信息

    总核数 = 物理CPU个数 X 每颗物理CPU的核数
    总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

    查看物理CPU个数
    cat /proc/cpuinfo| grep “physical id”| sort | uniq| wc -l

    查看每个物理CPU中core的个数(即核数)
    cat /proc/cpuinfo| grep “cpu cores” | uniq

    查看逻辑CPU的个数
    cat /proc/cpuinfo| grep “processor”| wc -l

    1.2 CPU突然飙升怎么办

    常见原因大约有三类

    • 宿主机CPU超卖
    • 内存问题,导致大量Full GC
    • 代码存在死循环

    1.2.1 宿主机CPU超卖排查

    top结果信息中的cpu st的值,即宿主机cpu时间片分配给宿主机上其他虚拟机时间占比。如果st使用率较大,则cpu占用飙升是由于宿主机超卖导致,联系运维解决。

    1.2.2 Full GC排查

    打开应用监控,查看Full GC与Young GC次数,如果发现的确存在频繁的Full GC,Dump应用的堆内存,对零内存进行分析,定位异常代码,jmap及jstat命令查看jvm的GC情况。

    查看进程堆使用概况

    使用jmap -heap pid命令查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。示例如下:

    jmap -heap 2294
    

    using parallel threads in the new generation. ##新生代采用的是并行线程处理方式
    using thread-local object allocation.
    Concurrent Mark-Sweep GC ##同步并行垃圾回收

    可以发现以上示例中老年代的的内存使用率为18.6%

    通过./jinfo -flags pid命令可以查看FGC(老年代垃圾回收)的阈值,示例如下:

    ./jinfo -flags 4289
    

    根据以上结果可知,80%是FGC的触发阈值,只要老年代的内存超过80%就会触发FGC。

    查看GC次数及时间

    jstat -gc 2294
    
    • S0C:第一个幸存区的大小 (字节)
    • S1C:第二个幸存区的大小 (字节)
    • S0U:第一个幸存区的使用大小 (字节)
    • S1U:第二个幸存区的使用大小 (字节)
    • EC:伊甸园区的大小 (字节)
    • EU:伊甸园区的使用大小 (字节)
    • OC:老年代大小 (字节)
    • OU:老年代使用大小 (字节)
    • MC:方法区大小 (字节)
    • MU:方法区使用大小 (字节)
    • CCSC:压缩类空间大小 (字节)
    • CCSU:压缩类空间使用大小 (字节)
    • YGC:年轻代垃圾回收次数
    • YGCT:年轻代垃圾回收消耗时间(s)
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间(s)
    • GCT:垃圾回收消耗总时间(s)

    堆内存统计

    jstat -gccapacity 2294
    
    • NGCMN:新生代最小容量
    • NGCMX:新生代最大容量
    • NGC:当前新生代容量
    • S0C:第一个幸存区大小
    • S1C:第二个幸存区的大小
    • EC:伊甸园区的大小
    • OGCMN:老年代最小容量
    • OGCMX:老年代最大容量
    • OGC:当前老年代大小
    • OC:当前老年代大小
    • MCMN:最小元数据容量
    • MCMX:最大元数据容量
    • MC:当前元数据空间大小
    • CCSMN:最小压缩类空间大小
    • CCSMX:最大压缩类空间大小
    • CCSC:当前压缩类空间大小
    • YGC:年轻代gc次数
    • FGC:老年代GC次数

    新生代垃圾回收统计

    jstat -gcnew 2294
    
    • S0C:第一个幸存区大小
    • S1C:第二个幸存区的大小
    • S0U:第一个幸存区的使用大小
    • S1U:第二个幸存区的使用大小
    • TT:对象在新生代存活的次数
    • MTT:对象在新生代存活的最大次数
    • DSS:期望的幸存区大小
    • EC:伊甸园区的大小
    • EU:伊甸园区的使用大小
    • YGC:年轻代垃圾回收次数
    • YGCT:年轻代垃圾回收消耗时间

    老年代垃圾回收统计

    jstat -gcold 2294
    
    • MC:方法区大小
    • MU:方法区使用大小
    • CCSC:压缩类空间大小
    • CCSU:压缩类空间使用大小
    • OC:老年代大小
    • OU:老年代使用大小
    • YGC:年轻代垃圾回收次数
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间
    • GCT:垃圾回收消耗总时间

    总体的垃圾回收情况统计

    jstat -gcutil 2294
    
    • S0:幸存1区当前使用比例
    • S1:幸存2区当前使用比例
    • E:伊甸园区使用比例
    • O:老年代使用比例
    • M:元数据区使用比例
    • CCS:压缩使用比例
    • YGC:年轻代垃圾回收次数
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间(s)

    以下命令每1000毫秒收集一次JVM内存和GC信息,共收集100次,每隔5行显示一次标题,且标题行带时间戳

    jstat -gcutil -t -h5 2294 1000 100
    

    类加载统计

    jstat -class 2294
    
    • Loaded:加载class的数量
    • Bytes:所占用空间大小(字节)
    • Unloaded:未加载数量
    • Bytes:未加载占用空间
    • Time:时间(s)

    查看JVM内存占用情况的各种命令总结

    ## 类加载情况情况
    /java/bin/jstat -class pid
    
    ##查看总体的垃圾回收情况
    /java/bin/jstat -gcutil pid
    ##查看年轻代垃圾回收情况
    /java/bin/jstat -gcnew pid
    ##查看年轻代垃圾回收情况
    /java/bin/jstat -gcold pid    
    ##查看年轻代内存统计
    /java/bin/jstat -gnewcapacity pid
    ##查看老年代内存统计
    /java/bin/jstat -gcoldcapacity pid
    
    ##每1000毫秒收集一次JVM内存和GC信息,共收集100次
    ##每隔5行显示一次标题,且标题行带时间戳
    /java/bin/jstat -gcutil -t -h5 pid 1000 100
    
    
    ##查看堆内存使用概况
    /java/bin/jmap -heap pid
    ##查看堆内存中的对象数量及大小
    /java/bin/jmap -histo pid
    ##找到占用内存空间最多的前30个类
    /java/bin/jmap -histo pid | head -30
    

    1.2.3 理解GC日志

    以下贴一段Minor GC的日志信息

    最前面的2020-08-21T10:18:16.335+0800: 750587.747:是固定的,2020-08-21T10:18:16.335+0800表示GC发生的日期时间,750587.747表示本次gc与JVM启动时的相对时间,单位为秒。

    括号中的Allocation Failure表示gc的原因,新生代内存不足而导致新对象内存分配失败。再后面的[ParNew:表示本次GC使用的垃圾收集器为ParNew,我们知道ParNew是针对新生代的垃圾收集器,从这可以看出本次GC是Minor GC。

    1760204K->34570K(1922432K)含义是“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”,2242167K->516569K(4019584K)含义是“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”

    本次GC后,堆内存大小从2242167K变成516569K,总体内存变小,释放了1685.15M(约1.6456G),年轻代大小从1760204K变成34570K,释放1685.19M,那么老年代内存增加了36K。

    最后的[Times: user=0.11 sys=0.00, real=0.04 secs]表示GC事件在不同维度的耗时,单位为秒。这里面的user、sys和real与Linux的time命令所输出的时间含义一致,分别表示用户态消耗的CPU时间、内核态消耗的CPU时间和操作从开始到结束所经过的等待耗时,例如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些耗时,但当系统有多CPU或者多核的话,多线程操作会叠加这些CPU时间,所以有时候user或sys时间超过real时间也是完全正确的。

    1.2.4 代码死循环排查

    需要先定位到占用大量cpu时间片的java线程,然后排查对应线程的代码定位原因,具体步骤如下:
    Step1.使用top命令找到CPU占用最高的线程(PID为进程ID),看一下是否为java进程

    Step2. 查看CPU占比靠前的java线程,其中的PID为子进程ID,即java线程ID

    top -p 3209 -H
    

    命令解析:

    • -p:监视指定进程
    • -H:进入线程模式

    Step3. 以上得到的3464是十进制的,我们需要转换为十六进制,然后通过jstack定位线程堆栈

    printf "%x" 3464
    d88
    

    然后到java/bin/stack目录下运行以下命令

    /java/bin/jstack 3209 | grep d88 -C 10
    

    注意:jstack的对象是java进程的PID,而不是java线程的PID

    Step4. 根据进程ID找到程序入口。pwdx命令根据指定的进程pid查找进程路径,从而定位位置

    pwdx 3209
    3209: /home/admin/xxxxx/target
    

    到上面显示的路径中去找到jar包,解压jar包就可以找到程序入口类,把.class文件放到IDEA中反编译查看一下代码,找出代码问题。

    1.2.5 关闭有问题的进程

    如果你具有管理员或所有者的身份,则可将该进程由top中删除,这通常是因为该进程占用太多的系统资源。

    • 方式一:在top指令页输入k发送关闭信号删除进程
      执行top命令,然后在数据画面中按“k”键。画面中会出现“PID to kill:”信息,接着输入要删除的进程PID,输入PID后按键,会出现“Kill PID xxxxx with signal [15]:”提示信息(此处的xxxxx是指PID编号),此时需输入signal号码,如果直接按键,则以默认的15进行处理。如果无法顺利删除,则输入9来强制删除该进程。
    • 方式二:直接使用kill -9 pid关闭进程
      语法:kill -n,n表示信号编号
      不加参数默认使用15关闭进程(SIGTERM信号),大部分应用程序会先释放自己的资源后停止程序,但SIGTERM多半是会被阻塞忽略的。9发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。使用的是7种进程间通信方式中的信号量。

    2 系统负载(load)分析和异常排查

    2.1 什么是系统负载

    系统负载(Load)是指在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。当CPU完全空闲的时候,平均负荷为0;当CPU工作量饱和的时候,平均负荷为1。

    如果CPU每分钟最多处理100个进程,那么系统负荷0.2,意味着CPU在这1分钟里只处理20个进程;系统负荷1.0,意味着CPU在这1分钟里正好处理100个进程;系统负荷1.7,意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理

    对于多核或单核处理器,2个CPU,意味着电脑的处理能力翻了一倍,能够同时处理的进程数量也翻了一倍。所以,2个CPU表明系统负荷可以达到2.0,此时每个CPU都达到100%的工作量。推广开来,n个CPU的电脑,可接受的系统负荷最大为n x 1.0。

    把CPU想象成一座大桥,桥上只有一根车道(一个CPU),所有车辆都必须从这根车道上单向通行。系统负荷为0,意味着大桥上一辆车也没有。系统负荷为0.5,意味着大桥一半的路段有车。系统负荷为1.0,意味着大桥的所有路段都有车,也就是说大桥已经"满"了。但是必须注意的是,直到此时大桥还是能顺畅通行的。系统负荷为1.7,意味着车辆太多了,大桥已经被占满了(100%),后面等着上桥的车辆为桥面车辆的70%。

    CPU的系统负荷,基本上等同于上面的类比。大桥的通行能力,就是CPU的最大工作量;桥梁上的车辆,就是一个个等待CPU处理的进程(process)。

    2.2 CPU使用率与负载的区别

    • CPU利用率:显示的是程序在运行期间实时占用的CPU百分比
    • CPU负载:显示的是一段时间内正在使用和等待使用CPU的平均任务数

    简单理解,一个是CPU的实时使用情况,一个是CPU的当前以及未来一段时间的使用情况。

    2.3 查看系统负载

    uptime命令

    loadaverage的值分别表示1分钟、5分钟、15分钟内系统的平均负载。

    2.4 机器正常负载范围(单核)

    经验法则如下:
    当系统负荷持续大于0.7,你必须开始调查了,问题出在哪里,防止情况恶化;
    当系统负荷持续大于1.0,你必须动手寻找解决办法,把这个值降下来;
    当系统负荷达到5.0,就表明你的系统有很严重的问题,长时间没有响应或者接近死机了。

    2.5 CPU使用率低而负载高

    主要原因是等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就导致负载过大,但CPU使用率低。常见导致这种情况的场景如下:

    • 磁盘读写请求过多导致大量IO等待
    • MySQL中存在没有用到的慢查询语句或死锁
    • 外接硬盘故障

    CPU的工作效率要高于磁盘,而进程在CPU上面运行需要访问磁盘文件,这个时候CPU会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,CPU低的情况

    MySQL的数据是存储在硬盘中,如果需进行sql查询,要先把数据从磁盘加载到内存中。当在数据特别大的时候,如果执行的sql语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠进程过多,导致负载过大。

    3 内存使用率异常排查

    3.1 物理内存与虚拟内存

    物理内存指通过物理内存条而获得的内存空间,即随机存取存储器。是与CPU直接交换数据的内部存储器,也叫主存(内存)。

    虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换也就是说,当物理内存不足时,可能会借用磁盘空间来充当内存使用)。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。

    3.2 swap分区

    Swap分区(即交换区)在系统的物理内存不够用的时候(没有了buffers和cache时),可以临时存放使用率不高的内存分页,把这一部分物理内存释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。

    生产环境的应用服务器,一般都不设置swap分区,而是通过限定jvm内存小于物理内存的方式控制内存大小。动态的设置JVM堆内存的规则一般会在setenv.sh文件中。

    3.3 查看内存使用情况

    free命令,-h选项,这意味着适于人类可读,-h选项会在数字后面加上适于人类可读的单位。

    Mem 是内存的使用情况;
    Swap 是交换空间的使用情况;

    buffers和cache的区别

    A buffer is something that has yet to be “written” to disk.
    A cache is something that has been “read“ from the disk and store for later use.
    

    cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到加快访问速度的作用;
    buffer 的主要目的进行流量整理,把突发的大数量小规模的I/O」整理成平稳的「小数量较大规模的 I/O」,以减少响应次数。

    free命令结果各列解释,free -b 命令运行结果将以byte为单位,free -k结果以KB为单位,不填写时,默认单位为KB

    • total,表示物理内存总大小;
    • used,表示总计分配给缓存(包含buffer与cache)使用的数量,其中可能部分缓存并未实际使用;
    • free,表示未被分配的内存;
    • shared,表示共享内存,一般系统不会用到;
    • buffers,系统分配但未被使用的buffers数量;
    • cached,系统分配但未被使用的cache数量;

    3.4 内存占用飙高排查

    3.4.1 常见原因

    • 内存溢出
    • 内存泄露
    • 堆外内存使用不当

    3.4.2 内存溢出排查

    内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。

    堆内存溢出(outOfMemoryError:java heap space)

    在jvm规范中,堆中的内存是用来生成对象实例和数组的。如果细分,堆内存还可以分为年轻代和年老代,年轻代包括一个eden区和两个survivor区。当生成新对象时,内存的申请过程如下:

    • jvm先尝试在Eden区分配新建对象所需的内存;
    • 如果内存大小足够,申请结束,否则下一步;
    • jvm启动youngGC,试图将Eden区中不活跃的对象释放掉,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
    • Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
    • 当OLD区空间不够时,JVM会在OLD区进行full GC;
    • Full GC后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现out of memory错误。

    方法区内存溢出(outOfMemoryError:permgem space)

    在jvm规范中,方法区主要存放的是类信息、常量、静态变量等。所以如果程序加载的类过多,或者使用反射、cglib等这种动态代理生成类的技术。就可能导致该区发生内存溢出

    线程栈溢出(java.lang.StackOverflowError)

    线程栈是线程独有的一块内存结构,所以线程栈发生问题必定是某个线程运行时产生的错误。一般线程栈溢出是由于递归太深或方法调用层级过多导致的

    3.4.2 内存泄露排查

    内存泄露是指程序中动态分配内存给一些临时对象,代码段运行结束后,这些对象已经没有被使用,但由于GC roots可达,没有被GC回收,始终占用内存。简单来说即被分配的对象无用但可达,这种问题一般是代码设计存在缺陷导致的。

    Step1.使用top命令,查看内存占用较高的进程ID

    发现PID为2294的进程占用内存45.2%,而且是一个Java进程,基本断定是程序问题。

    Step2.使用jmap查看内存情况,并分析是否存在内存泄露

    ##查看java堆使用情况
    /java/bin/jmap -heap 2294 
    
    ##查看堆内存(histogram)中的对象数量及大小
    /java/bin/jmap -histo 2294 
    
    ##找到占用内存空间最多的前30个类
    /java/bin/jmap -histo 2294 | head -30 
    
    ##JVM先触发gc,然后再统计信息
    /java/bin/jmap -histo:live 2294 
    
    ##将内存使用的详细情况输出到文件
    /java/bin/jmap -dump:format=b,file=heapDump 2294 
    

    查看堆内存使用概况

    查看占用内存空间最多的前20个类

    理论上占用空间最多的类肯定是String、Object这些jdk类库中的类或某些框架源码类,如果出现了应用层编写的类,那肯定有问题。

    jmap -dump:format=b,file=文件名 [pid]
    使用以上命令得到堆dump文件后,可使用MAT工具进行对象分析。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露。排查创建该对象的代码,进行修改,常见的内存泄露的原因有:

    • 长生命周期的对象持有短生命周期对象的引用;
    • 修改hashSet中对象的参数值,且参数是计算哈希值的字段;
    • 机器的连接数和关闭时间设置;

    3.4.2 堆外内存使用不当排查

    和堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机),这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。堆外内存的优点:

    • 减少了垃圾回收 因为垃圾回收会暂停其他的工作;
    • 加快了复制的速度 堆内在flush到远程时,会先复制到直接内存,然后再发送,而堆外内存相当于省略掉了复制这个步骤;

    堆外内存的缺点:内存难以控制,使用了堆外内存就间接失去了JVM管理内存的可行性,改由自己来管理,当发生内存溢出时排查起来非常困难。

    堆外内存的使用场景:NIO引入了一种基于通道与缓冲区的IO方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆中的java.nio.DirectByteBuffer对角作为这块堆内存的引用进行操作。

    4 网络异常分析及排查

    4.1 查看网络指标

    常用的查看网络流量的命令如下:

    nload:监控入站流量和出站流量
    nethogs: 按进程查看流量占用
    iptraf: 按连接/端口查看流量
    ifstat: 按设备查看流量
    ethtool: 诊断工具
    tcpdump: 抓包工具
    ss: 连接查看工具
    其他: dstat, slurm, nload, bmon
    

    以上工具均需要安装。

    4.2 查看TCP重传率

    TCP重传率是对网络质量的一个体现,简单包装netstat -s的输出可以计算出TCP重传率。现成的脚本如下:

    #!/bin/bash
    export PATH='/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin'
    SHELLDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    
    netstat -s -t > /tmp/netstat_s 2>/dev/null
    
    s_r=`cat /tmp/netstat_s | grep 'segments send out' | awk '{print $1}'`
    s_re=`cat /tmp/netstat_s  | grep 'segments retransmited' | awk '{print $1}'`
    
    [ -e ${SHELLDIR}/s_r ] || touch ${SHELLDIR}/s_r
    [ -e ${SHELLDIR}/s_re ] || touch ${SHELLDIR}/s_re
    
    l_s_r=`cat ${SHELLDIR}/s_r`
    l_s_re=`cat ${SHELLDIR}/s_re`
    
    echo $s_r > ${SHELLDIR}/s_r
    echo $s_re > ${SHELLDIR}/s_re
    
    tcp_re_rate=`echo "$s_r $s_re $l_s_r $l_s_re" | awk '{printf("%.2f",($2-$4)/($1-$3)*100)}'`
    echo $tcp_re_rate
    

    4.2.1 为什么会产生TCP重传

    • TCP是一种可靠的协议,在网络交互的过程中,由于TCP报文是封装在IP协议中的,IP协议的无连接特性导致其可能在交互的过程中丢失,在这种情况下,TCP协议如何保障其传输的可靠性呢?
    • TCP通过在发送数据报文时设置一个超时定时器来解决这种问题,如果在定时器溢出时还没有收到来自对端对发送报文的确认,它就重传该数据报文

    4.2.2 TCP重传率高的可能原因

    发生重传说明网络传输有丢包,基本上从3个点去定位:客户端网络情况、服务端网络情况、中间链路网络情况。

    • 客户端机器网络异常;
    • 服务端网卡流量跑满,网卡有丢包现象,关注ifconfig的error输出;
    • 中间网络连路拥塞,比如交换机上联、核心交换机链路等,需要逐个排查链路流量情况;

    数据报文传输中途丢失:发送端的数据报文在网络传输的过程中,被中间链路或中间设备丢弃;
    接收端的ACK确认报文在传输中途丢失:发送端发送的数据报文到达了接受端,接受端也针对接收到的报文发送了相应的ACK确认报文,但是,这个ACK确认报文被中间链路或中间设备丢弃了;
    接收端异常未响应ACK或被接收端丢弃:发送端发送的数据报文到达了接收端,但是,接收端由于种种原因,直接忽略该数据报文,或者接收到报文但并没有发送针对该报文的ACK确认报文。

    4.3 查看TCP连接数

    常用命令如下:

    netstat -an									查看有哪些IP连接到本机
    netstat -nat | grep -i "80" | wc -l			统计80端口连接数
    netstat -na | grep ESTABLISHED | wc -l		统计已连接上的状态为established的连接数
    

    查看各种状态的TCP连接数

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    

    TCP连接状态详解
    LISTEN: 侦听来自远方的TCP端口的连接请求
    SYN-SENT: 再发送连接请求后等待匹配的连接请求
    SYN-RECEIVED: 再收到和发送一个连接请求后等待对方对连接请求的确认
    ESTABLISHED: 代表一个打开的连接
    FIN-WAIT-1: 等待远程TCP连接中断请求,或先前的连接中断请求的确认
    FIN-WAIT-2: 从远程TCP等待连接中断请求
    CLOSE-WAIT: 等待从本地用户发来的连接中断请求
    CLOSING: 等待远程TCP对连接中断的确认
    LAST-ACK: 等待原来的发向远程TCP的连接中断请求的确认
    TIME-WAIT: 等待足够的时间以确保远程TCP接收到连接中断请求的确认
    CLOSED: 没有任何连接状态

    另外,Tomcat的最大HTTP请求处理线程数默认为200,可修改xml进行配置。

    4.4 无法创建HTTP连接

    4.4.1 原因分析

    常见原因:服务器上出现大量的close_wait和time_wait状态的TCP连接。

    一个CLOSE_WAIT状态的TCP连接默认会在2个小时内被检测失活后回收。如果有流氓程序不停的反问请求,让服务器上产生了一堆的CLOSE_WAIT状态的TCP连接,消耗TCP资源,那么通常是等不到连接释放那一刻,系统就已经解决崩溃了。

    4.4.2 解决方案

    查看并修改linux内核配置文件

    vim /etc/sysctl.conf
    

    方法1 缩短TCP连接存活检测的时间间隔并回收TIME_WAIT状态的连接

    ## 发送keepalive探测消息的时间间隔,默认为7200秒
    net.ipv4.tcp_keepalive_time=30
    ## 减少超时前的探测次数
    net.ipv4.tcp_keepalive_probes=2
    ## 减少TIME_WAIT阶段过期时间,默认60
    net.ipv4.tcp_tw_timeout=3
    ##开启TCP连接中TIME_WAIT sockets的快速回收。默认设置为0表示不开启
    net.ipv4.tcp_tw_recycle = 1
    

    方法2 复用TIME_WAIT状态的连接

    ## 表示开启重用TCP连接,允许将TIME_WAIT sockets重新用于新的连接,默认设置为0,表示不开启
    net.ipv4.tcp_tw_reuse = 1
    

    参考文档

    https://my.oschina.net/laichendong/blog/283799
    https://my.oschina.net/laichendong/blog/283790
    https://blog.csdn.net/shimiso/article/details/21830871
    https://www.cnblogs.com/virusolf/p/4335613.html
    https://www.jianshu.com/p/b87c059d35f6
    https://blog.csdn.net/lufeisan/article/details/53150971
    https://blog.csdn.net/m0_37886429/article/details/78529681
    https://www.cnblogs.com/hellojesson/p/6369506.html
    http://www.hollischuang.com/archives/2642
    https://zhuanlan.zhihu.com/p/36731397
    https://www.jianshu.com/p/85e931636f27
    https://www.cnblogs.com/virusolf/p/4335613.html

    展开全文
  • 到底多高的负载才算高负载?

    万次阅读 2014-05-07 00:03:25
    到底多高的负载才算高负载?

    接触过和使用过unix或linux的朋友,都知道如何查看Unix/Linux load的值,这边我也重复一下查看load的方法:

    [root@aaronw ~]# uptime13:33:37 up 7 days, 1:52, 1 user, load average: 4.15, 2.00, 3.14

    load average 后面三个值代表系统在1分钟、5分钟和15分钟的负载情况,都知道数字越高表示系统负载越大,第一直觉就是这个系统不行了。那么到底多高的负载才算高负载? 我们又如何去判断系统是否已经高负载呢?

    1. 什么是load average

    load average的就是一定时间内计算机有多少个active_tasks,也就是说是计算机的任务执行队列的长度,cpu计算的队列。

    2. load average多少是正常?

    既然load是cpu计算的队列,那就应该和cpu个处理方式和cpu的个数有关系。所以我个人认为应该按系统识别的cpu个数来确定load的临界值,系统识别为8个cpu,那么load为8就是临界点,高于8就属于over load了。

    3. 什么叫系统识别CPU个数?

    这里涉及到cpu物理个数和超线程技术的问题。对于单处理器在满负载的情况下1.00,则双处理器的负载满额的情况是 2.00,它还有一倍的资源可以利用。
    从性能的角度上理解,一台主机拥有多核心的处理器与另台拥有同样数目的处理性能基本上可以认为是相差无几。当然实际 情况会复杂得多,不同数量的缓存、处理器的频率等因素都可能造成性能的差异。但即便这些因素造成的实际性能稍有不同,其实系统还是以处理器的核心数量计算负载均值 。这使我们有了两个新的法则:
      “有多少核心即为有多少负荷”法则: 在多核处理中,你的系统均值不应该高于处理器核心的总数量。
      “核心的核心”法则: 核心分布在分别几个单个物理处理中并不重要,其实两颗四核的处理器 等于 四个双核处理器 等于 八个单处理器。所以,它应该有八个处理器内核。

    4. 如何查看系统的CPU个数

    在 Linux 下,可以使用下面的命令获取你系统上的逻辑处理器的数量:
    grep ‘model name’ /proc/cpuinfo | wc -l

    5.CPU高不等同于load高

    在Unix/Linux可能经常会遇到cpu的使用率为100%,但是load却不高!这是为什么呢?因为几乎所有的任务和会和CPU进行交互,但是由于各个设备的使用频率不同,造成了不能同步进行的问题。比如说,当对硬盘进行读写的时候,出现IO的等待时候,事实上cpu已经被切换到别的进程上了。该任务就处于等待状态,当这样的任务过多,导致队列长度过大,这样就体现到负载过大了,但实际是此时cpu被分配去干执行别的任务或空闲,因此CPU高不等同于load高,load高也不能于cpu高。
    展开全文
  • 【技术篇】查看linux系统负载情况

    千次阅读 2019-06-23 17:15:32
    什么是系统平均负载? 系统平均负载是指在特定时间间隔内运行队列中的平均进程数。 如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有...

    什么是系统平均负载?

          系统平均负载是指在特定时间间隔内运行队列中的平均进程数。 如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。 1可以被认为是最优的负载值。负载是会随着系统不同改变得。

    (一)uptime

       用于获取主机运行时间和查询linux系统负载等信息。

      

       内容说明:

    16:18:38   //系统当前时间

    up  2:16   //主机已运行时间,时间越大,说明你的机器越稳定。

    2 user     //用户连接数,是总连接数而不是用户数

    load average // 系统平均负载,统计最近1,5,15分钟的系统平均负载

    (二)cat /proc/loadavg

    内容说明:

    0.00 0.00 0.00         //表示最近1分钟,5分钟,15分钟 系统的平均负载; 系统负载越高,代表CPU越繁忙;

    1/281                       //1代表此时运行队列中的进程个数;281 代表系统中进程的总数

    6799                       //代表到此为止创建的最后一个进程的ID.

    (三)w

    内容说明:

    第一行信息和前面的相同

    USER :用户名 

    TTY:录后系统分配的终端号           

    FROM:远程主机名(即从哪儿登录来的)

    LOGIN@:何时登录

    IDLE:空闲了多长时间,表示用户闲置的时间。                                                                                                                

    JCPU:和该终端(tty)连接的所有进程占用的时间,这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间                                                                                                                                                    

    PCPU:指当前进程(即在WHAT项中显示的进程)所占用的时间   

    WHAT:当前正在运行进程的命令行

    (四)top

    内容说明:

    第一行和前面的命令一样

    第二行:进程总数:183 正在运行进程数:1  睡眠进程数:182 停止的进程数:0  僵尸进程数:0

    第三行:分别显示的是:用户空间占用CPU百分比、内核空间占用CPU百分比、用户进程空间内改变过优先级的进程占用CPU百分比、 空闲CPU百分比、等待输入输出的CPU时间百分比、CPU服务软中断所耗费的时间总额、 StealTime

    第四行:分别显示的是:物理内存总量、使用的物理内存总量、空闲内存总量、用作内核缓存的内存量

    第五行: 分别显示的是:换区总量、  使用的交换区总量、空闲交换区总量、缓冲的交换区总量  

    第六行:进程ID、进程所有者、优先级、nice值,负值表示高优先级,正值表示低优先级、进程使用的虚拟内存总量、进程使用的、未被换出的物理内存大小、共享内存大小、进程状态、上次更新到现在的CPU时间占用百分比、进程使用的物理内存百分比、进程使用CPU总时间、命令名、命令行
     

    (五)tload

    显示的是平均负载:表示最近1分钟,5分钟,15分钟的系统平均负载.

    参考文章:https://blog.csdn.net/weixin_42061232/article/details/81203385

    展开全文
  • 解决Linux 负载过高问题过程记录

    万次阅读 多人点赞 2020-02-27 16:07:39
    1.top命令查看该机器的负载状况 2.cd /proc/pid 查看对应高占用程序的位置 3.进入对应程序中查看日志,根据CPU和内存这两个因素分析 4.ps -ajxf 查看进程及其之下的线程,通过stat查看是否存在D僵尸进程 ...
  • Linux top命令及负载的解释

    千次阅读 2018-10-29 11:39:24
    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。 top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48 ...
  • 高并发技术: 1.代码技术:多线程,线程池,并发库,并发队列 2.缓存技术: redis 集群 一主多从 3.数据库技术: mysql 一主多从 读写分离 数据库单表大于2000万时,使用分库分表方案 Mycat数据库中间件 ...
  • 微服务架构的实现首先需要提供一些基础组件,这些基础的功能性组件主要包括服务之间的通信、面向事件驱动的架构设计方法、负载均衡、服务路由、API网关和分布式配置中心等,我们对这六大基本组件进行初步的分析定案...
  • nginx负载均衡

    万次阅读 2018-11-20 21:33:57
    发现访问量越来越多,服务器完全无法承受住压力,导致系统卡顿延时等,此时需要通过nginx技术将应用压力进行平均分配到其他服务器,将多台服务器一起提供资源,通过nginx来协调资源进行负载均衡。操作步骤1. 目标与...
  • Nginx详解(正向代理、反向代理、负载均衡原理)

    万次阅读 多人点赞 2019-08-01 11:02:38
    Nginx配置详解 nginx概述 ...同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理... 负载均衡 nginx特点 1. 反向代理 关于代理 说到代理,首先...
  • nginx与IIS服务器搭建集群实现负载均衡(三)

    万次阅读 多人点赞 2019-12-11 16:33:10
    在《架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)》中提到有好多有趣的地方,接下来就为大家一块儿讲讲在深入研究过程中遇到那些有趣的事情。 ·实战之行——发现问题 ·探索之旅——寻出问题原因 ...
  • 基于集群的动态反馈负载均衡策略 基于动态反馈机制的集群负载均衡算法研究 目前应用最为广泛的集群计算技术主要分为三大类:高可用性集群技术、高性能计算集群技术和负载均衡集群技术。 德国的CarlAdamPetri于...
  • nginx与IIS服务器搭建集群实现负载均衡(一)

    万次阅读 热门讨论 2019-12-11 16:33:51
    本人由于初出茅庐,防骗意识薄弱,一不小心被亮亮坑上了IIS负载均衡之路(亮亮是真黑哈!)。前车之鉴啊!小伙伴们要小心。不过既上了贼船,便决定一条道走到黑。于是乎从大前天晚上被骗到今天下午正好三天的时间,...
  • 使用Nginx实现负载均衡

    万次阅读 多人点赞 2018-12-04 14:34:18
    负载均衡的作用 负载均衡:分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。 负载均衡这...
  • 服务器端负载均衡:例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;客户端负载均衡:例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送...
  • LVS负载均衡的几种模式和算法

    万次阅读 2019-11-27 10:12:47
    LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。 LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源...
  • 在上一篇《标准Web系统的架构分层》文章中,我们概述了WEB系统架构中的分层架设体系,介绍了包括负载均衡层、业务层、业务通信层、数据存储层的作用和存在意义。从本片文章开始,我们将首先详细讲解负载均衡层的架构...
  • Nginx负载均衡配置

    万次阅读 多人点赞 2016-09-01 14:35:55
    原文链接:http://blog.csdn.net/xyang81/article/details/51702900Nginx安装请参考:《Nginx源码安装》 负载均衡的目的是为了解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供...
  • 性能测试,又称为多用户并发性能测试,通过模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试,压力测试和负载测试都属于性能测试。 二、压力测试(Stress Test) 压力测试,又叫强度测试,...
  • 客户端负载均衡(Ribbon)

    万次阅读 2019-03-30 09:41:22
    服务器端负载均衡 客户端负载均衡 Ribbon负载均衡示例搭建 创建服务提供者 引入依赖 添加配置 服务提供者 创建启动类 启动服务 服务消费者 引入Ribbon依赖 添加配置 使用Ribbon客户端 切换Ribbon负载...
1 2 3 4 5 ... 20
收藏数 797,689
精华内容 319,075
关键字:

负载