当心!TCP本机客户端连接本机服务器

简介:
上周,在我们进行性能测试的时候,发现了一个问题。
我们的服务器上启了一个redis服务端,侦听0.0.0.0的1234端口,同处在本机的另外一个进程会频繁发起到该服务端的 短连接 ,结果导致了两个问题:
1.大量的TIME_WAIT状态的连接;
2.发起连接的进程的CPU占用率接近100%。
这两个结果严重影响了我们网关的性能,在分析具体原因之前,首先做一个提倡,那就是:本机连接本机,首选UNIX域套接字而不是TCP!

原因其实不需要数据分析,仅仅理论分析就够了,前提是你要做Linux内核协议栈的IP层处理以及软中断调度有足够的理解,当然,这些都很简单。
       首先我们来看看问题1。TIME_WAIT就不多说了,只要任何一端主动断开连接,那么它最终可能将会进入TIME_WAIT状态,具体是否会进入在 Linux上取决于几个因素,第一,你有没有两端开启timestamps,如果开启了,你有没有在服务端开启recycle,如果开启了,那么 TIME_WAIT套接字就会迅速消失,也就是说,想让recycle起作用,你一定要开启timestamps。如果没有timestamps,那么就 会有大量的TIME_WAIT状态的套接字。
       在Linux内核协议栈的实现中,所有连接本机的数据流,其路由选择最终都会到定向到loopback,如果你没有绑定源IP地址,那么源/目标IP地址 均为127.0.0.1!如果服务端口是固定的,那么最终会接受65535-1个连接,减1的原因在于服务端已经bind了服务端口,因此客户端不能再次 bind。这是合理的,因为按照四元组唯一性考虑,一个服务只能接受一个特定IP地址的65535个连接或者65534个连接,但是问题是,如果需求巨 大,这显然不能满足要求,你要知道,作为服务器而言,它要考虑的是总的最大并发连接数,一台机器上同时发起6万多个连接的可能性并不大,因此TCP在大多 数情况下是合理,采用16bit的端口号刚刚好,因为协议头不能太大,否则载荷率就会变小,这显然是网络传输所要求的,然而本机连本机时,并不需要网络传 输,你想当然会认为有多少需求就要都要满足,不过TCP并不适合这种场合。
       本机连本机,没有网络传输带来的延迟,吞吐限制也仅限于本机资源利用,因此并发10万甚至更多的需求都是合理的,可是TCP并不能满足,原因就在于它只有 16bit的端口号,目标端口固定,同时只能有65534个连接。如何解决呢?我们知道127.0.0.0/8都是属于loopback的,我们可以采用 不同的源IP地址,如果想这么做,有两个选择,那就是要么客户端bind源IP为127.x.y.z,要么SNAT成127.x.y.z,这样就可以接受 海量的连接需求了。但是这并不是最终的解决方案,为什么非要用TCP呢?TCP本来就是为网络传输设计的,它的流控应对不同的主机,拥控应对反复无常的网 络,在本机,这些都不是问题,所以本机连本机,最好使用本机套接字,比如UNIX域套接字。
       再来看问题2,一个连接本机的TCP数据包最终到达了loopback的xmit发送函数,其中简单的调度了本CPU上的一个软中断处理,然后会在下一次 中断结束后调度其执行,这有很大几率是在当前发送进程的上下文中进行的,也就是说,发送进程在其上下文中进行了发送操作,而此时软中断借用了其上下文触发 了接收操作,再然后,LOCK的开销就很明显,由于大量的TW套接字的insert和delete,需要频繁LOCK哈希表,这种开销完全记帐到了发送进程的名下,也是不公平的。

       注意,Linux内核中,softirq会在两种上下文中执行,一种是硬件中断后的任意上下文中,一种是每CPU一个内核线程的上下文中,后者会记帐给top命令的si百分比,前者则会记帐给任意被中断的进程。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1698622


相关文章
|
1月前
|
SQL 分布式计算 DataWorks
DataWorks常见问题之dataworks连接FTP服务器失败如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
1月前
|
弹性计算 Linux 网络安全
连接并管理ECS
连接并管理ECS
61 4
|
1月前
|
运维 Linux Nacos
nacos常见问题之远程访问不报错放到服务器上nacos连接超时如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
59 1
|
17天前
|
网络协议 Python
pythonTCP客户端编程连接服务器
【4月更文挑战第6天】本教程介绍了TCP客户端如何连接服务器,包括指定服务器IP和端口、发送连接请求、处理异常、进行数据传输及关闭连接。在Python中,使用`socket`模块创建Socket对象,然后通过`connect()`方法尝试连接服务器 `(server_ip, server_port)`。成功连接后,利用`send()`和`recv()`进行数据交互,记得在通信完成后调用`close()`关闭连接,确保资源释放和程序稳定性。
|
4天前
|
网络协议 安全 Linux
IDEA通过内网穿透实现固定公网地址远程SSH连接本地Linux服务器
IDEA通过内网穿透实现固定公网地址远程SSH连接本地Linux服务器
|
21天前
|
弹性计算 关系型数据库 MySQL
阿里云数据库服务器价格表,数据库创建、连接和使用教程
阿里云数据库使用流程包括购买和管理。选择所需数据库类型如MySQL,完成实名认证后购买,配置CPU、内存和存储。确保数据库地域与ECS相同以允许内网连接。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码连接。同一VPC内的ECS需添加至白名单以进行内网通信。参考官方文档进行详细操作。
123 3
|
1月前
|
安全 Shell 网络安全
如何通过SSH连接云服务器
当你购买云服务器后,你可以通过SSH方式安全的连接到你的云服务器,因为只有你连上云服务器后才能进行服务器相关的配置操作。这里分别介绍了MAC用户和Windows用户如何通过SSH连接云服务器。
251 1
如何通过SSH连接云服务器
|
1月前
|
数据安全/隐私保护 Windows
Windows Server 2003 搭建邮件服务器实现自建邮箱域名及账户并连接外网
Windows Server 2003 搭建邮件服务器实现自建邮箱域名及账户并连接外网
29 0
|
1月前
|
运维 安全 网络安全
通过Xshell连接有跳板机/堡垒机的服务器
通过Xshell连接有跳板机/堡垒机的服务器
72 0
|
30天前
|
Ubuntu JavaScript 关系型数据库
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
在阿里云Ubuntu 20.04服务器上部署Ghost博客的步骤包括创建新用户、安装Nginx、MySQL和Node.js 18.x。首先,通过`adduser`命令创建非root用户,然后安装Nginx和MySQL。接着,设置Node.js环境,下载Nodesource GPG密钥并安装Node.js 18.x。之后,使用`npm`安装Ghost-CLI,创建Ghost安装目录并进行安装。配置过程中需提供博客URL、数据库连接信息等。最后,测试访问前台首页和后台管理页面。确保DNS设置正确,并根据提示完成Ghost博客的配置。
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客