首页 > 其他分享 >你所不知道的端口耗尽(三)

你所不知道的端口耗尽(三)

时间:2024-03-04 09:04:50浏览次数:28  
标签:端口 重试 实例 耗尽 SNAT 连接 知道

问题背景

在你所不知道的端口耗尽前面的两篇章节中,介绍了经典的客户端端口耗尽和SNAT端口耗尽问题,但是对于解决方案只是一笔带过,这篇文章会更详细的介绍解决方案。解决方案主要分为两大类,优化部署和优化应用程序。

优化部署

本篇主要介绍在Azure上的部署以及主要是Azure集群的部署,针对的是SNAT端口耗尽问题。

Load Balancer增加前端IP

在(二)中详细介绍过,Load Balancer的每个前端IP可提供64K的端口,如果端口耗尽问题发生,最直接的方法是新增可用的IP。

Load Balancer调整出站规则

Load Balancer的默认出站规则是根据后端池大小分配 SNAT 端口。具体如下:

池大小(VM 实例) 默认 SNAT 端口
1-50 1,024
51-100 512
101-200 256
201-400 128
401-800 64
801-1,000 32

如果按照默认的出站规则,最大才1024,明显不符合大规模产品的需求,所以一般需要调整为手动端口分配,ports per instance。例如,若已知后端池中最多有 10 个 VM,则可以为每个 VM 最多分配 6,400(64000/10) 个 SNAT 端口,而不是默认的 1,024 个。

使用NAT网关

Azure 负载均衡器将固定数量的 SNAT 端口分配给后端池中的每个虚拟机实例。 这种分配方法可能会导致 SNAT 耗尽,尤其遇到流量模式不均衡导致特定虚拟机发送更高的传出连接量的情况。 与负载均衡器不同,NAT 网关在子网中的所有 VM 实例之间动态分配 SNAT 端口。

NAT 网关让子网中的每个实例都可以使用 SNAT 端口。 利用此动态分配,VM 实例可从可用端口池中使用每个实例所需数量的 SNAT 端口进行新连接。 动态分配可降低 SNAT 耗尽的风险

image

另外,NAT 网关从可用端口池中随机选择端口。 如果没有可用的端口,只要没有与同一目标公共 IP 和端口的现有连接,就会重复使用 SNAT 端口。 NAT 网关的此端口选择和重用行为使得遇到连接超时的可能性较低。

优化应用程序

重复使用连接

建议将应用程序配置为重复使用连接,而不是为每个请求生成单独的原子 TCP 连接。这里介绍一个最典型的例子,net core中的HttpClient,对外部网络的请求使用单instance或者使用HttpClientFactory,如果每个请求都构造一个HttpClient,那么即使同一目标公共 IP 和端口,也会分配不同的端口,这样端口很快就会消耗殆尽。

使用连接池

在应用程序中使用连接池方案,其在一组固定的连接中内部分布请求,并且在可能的情况下,重复使用这些请求。连接池一般存在于正在使用的框架中,所以技术选型和SDK时,一定要非常注意是否有连接池。

另外,也可以根据情况调整连接池的最大连接数。

使用节制的重试逻辑方案

当 端口耗尽或应用程序故障发生时,无衰减或回退逻辑的积极重试或暴力重试会使耗尽状况再次发生或一直持续。如果重试过于频繁,则连接可能没有足够的时间关闭和释放 SNAT 端口以供重复使用。 使用节制的重试逻辑,可以降低对端口的需求。

  • 延时重试: 系统可能会在失败后等待一段时间,之后再尝试执行相同的操作。这样做的目的是给予系统或目标资源一些恢复时间。

  • 退避算法: 采用退避算法(如指数退避)来决定两次重试尝试之间的等待时间。例如,每次尝试失败后,系统会将等待时间翻倍,以减少对系统的冲击和避免潜在的连续失败。

  • 限制重试次数: 为了避免无限重试,可能会设置一个最大重试次数的限制。一旦达到这个限制,系统将放弃重试,并可能采取其他处理措施,如发送警告或切换到备份方案。

  • 智能判断: 重试逻辑可能还会包含对当前状态和环境的评估,只有在条件看起来有可能改善时才进行重试。

  • 随机化和分散: 在分布式系统中,如果多个实例几乎同时遇到问题并进行重试,可能会造成资源争用或"flood"效应。因此,引入随机化因素使得重试尝试更加分散可以减少这种风险。

标签:端口,重试,实例,耗尽,SNAT,连接,知道
From: https://www.cnblogs.com/kyo-lynn/p/18050538

相关文章

  • unhide 是一款强大的取证工具,主要用于查找和发现被隐藏的进程、TCP/UDP端口以及其他隐
    unhide是一款强大的取证工具,主要用于查找和发现被隐藏的进程、TCP/UDP端口以及其他隐藏技术。其基本技术原理如下:ROOTKIT和LKM:ROOTKIT(RootKit)是一种恶意软件,常用于隐藏恶意活动和进程。它通过修改操作系统的核心组件和内核模块(LinuxKernelModule,LKM)来实现对系统的隐匿。u......
  • Linux 检查端口是否被占用
    使用netstat$sudonetstat-tulnp|grep':22'tcp000.0.0.0:220.0.0.0:*LISTEN963/sshd:/usr/sbin使用lsof$sudolsof-i:22COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEsshd9......
  • zabbix-server启动后没有10051端口,web端报错
    1、登入zabbixweb端,报错信息如下 2、登入服务器上查看zabbix-server、zabbix-agent2、apache2等服务都正常运行 3、检查端口情况,发现apache2---80正常、zabbix-agent2---10050正常,只有zabbix-server没有端口信息(图一也是细节那栏也没有localhost:10051) 4、查看zab......
  • 你所不知道的端口耗尽(二)
    问题背景在你所不知道的端口耗尽(一)中,介绍了经典的客户端端口耗尽问题,在本篇文章中会介绍另外一种端口耗尽问题,即SNAT端口耗尽什么是SNATSNAT是源网络地址转换(SourceNetworkAddressTranslation)的缩写,它是网络地址转换(NAT)的一种形式。SNAT主要用于将内部网络的私有IP地址转......
  • 华为交换机ACL关于地址池和端口池的使用
    当ACL下地址和端口太多,需要写很多条的时候,也可以尝试使用地址池和端口池。 aclip-pool1aipadd10.1.1.132ipadd10.1.1.232aclip-pool2bipadd10.2.1.132ipadd10.2.2.232aclport-pool1.porteq80eq8080注意:地址池和端口池命名规则STRI......
  • 在K8S中,nodePort默认端口范围是多少? 为什么是这个端口范围?
    在Kubernetes(K8s)中,NodePort服务类型的默认端口范围通常是30000-32767。这个范围是Kubernetes项目早期设定的标准,并且被广泛接受为默认配置。选择这个端口范围的原因有以下几点:避免冲突:低于30000的端口往往被系统保留给一些知名的网络服务和应用程序使用。设置较高......
  • 在Windows系统中解决端口占用问题
    在Windows系统中,你可以通过以下步骤查询并结束占用8001端口的进程:查询占用8001端口的进程:打开命令提示符(CMD)或者PowerShell,并执行以下命令: netstat-ano|findstr:8001这将列出所有占用8001端口的进程以及它们的PID(进程ID)。结束占用8001端口的进程:使用PID(进程ID)......
  • 各个端口作用以及如何利用
    端口范围一般用到的是1到65535,其中0一般不使用。端口号可分为3大类1、公认端口(WellKnownPorts):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。2、注册端口(RegisteredPorts):从1024到49151。它们松散......
  • nginx 反向代理proxy_pass, 同一个端口多个域名的问题
    案例:serverip1:1.2.3.4domain1:aa.com>>指向ip1,port80domain2:bb.com>>指向ip1,port80serverip2:2.2.3.4domain3:cc.com>>指向ip3配置nginx转发到aa.com域名下的服务则需要做如下配置:location/{proxy_set_headerHostaa.com......
  • springboot两种配置文件的使用(举例:端口号、虚拟路径配置)
    1、properties配置文件使用   2、yml配置文件、yaml配置文件 在项目中更常用 在项目中一般yml配置文件更为常用,因为yml层级更加明确、清晰,更为关注数据。 ......