防止短连接耗尽你的动态TCP端口

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 用pgbench使用短连接压测一个PostgreSQL数据库(select 1),其他数据库亦如此。 $ vi test.sql select 1; $ export PGPASSWORD=digoal $ pgbench -M simple -C -n -r -P 1 -c 800

用pgbench使用短连接压测一个PostgreSQL数据库(select 1),其他数据库亦如此。

$ vi test.sql
select 1;

$ export PGPASSWORD=digoal
$ pgbench -M simple -C -n -r -P 1 -c 800 -j 80 -T 1000 -h xxx.xxx.xxx.xxx -p xxxx -U xxx dbname

压测一段时间之后,可能会因为本地(客户端)的端口耗尽,客户端会报错如下

connection to database "postgres" failed:
could not connect to server: Cannot assign requested address
        Is the server running on host "xxx.xxx.xxx.xxx" and accepting
        TCP/IP connections on port 1925?
connection to database "postgres" failed:
could not connect to server: Cannot assign requested address
        Is the server running on host "xxx.xxx.xxx.xxx" and accepting
        TCP/IP connections on port 1925?

原因是客户端需要为每一个连接动态创建TCP端口,所以每个连接会消耗一个端口。
客户端主动断开连接后,会进入TIME_WAIT状态。


详见TCP协议
https://en.wikipedia.org/wiki/Transmission_Control_Protocol
Tcp_state_diagram_fixed_new_svg
但是TIME_WAIT是有时间窗口的,Linux默认是60秒。
所以如果不停的产生和关闭TCP会话,就可能导致前面提到的问题。


对于Linux的客户端,通过调整几个操作系统内核参数可以解决这个问题。

net.ipv4.tcp_syncookies=1   # 开启SYN Cookies。当出现SYN等待队列溢出时,启用cookie来处理,可防范少量的SYN攻击
net.ipv4.tcp_tw_recycle=1   # 开启TCP连接中TIME-WAIT套接字的快速回收
net.ipv4.tcp_tw_reuse=1     # 开启重用。允许将TIME-WAIT套接字重新用于新的TCP连接
net.ipv4.tcp_timestamps=1   # 减少time_wait
net.ipv4.tcp_tw_timeout=3   # 收缩TIME_WAIT状态socket的回收时间窗口
相关文章
|
21天前
|
网络协议
iptables配置tcp端口转发
iptables配置tcp端口转发
26 1
|
1月前
|
网络协议
TCP 和 UDP 可以使用同一个端口吗?
【2月更文挑战第9天】
51 0
TCP 和 UDP 可以使用同一个端口吗?
|
2月前
|
网络协议
TCP和UDP和端口
TCP和UDP和端口
22 1
|
2月前
|
网络协议 Linux 网络架构
【Cisco Packet Tracer】运输层端口与TCP的作用
【Cisco Packet Tracer】运输层端口与TCP的作用
27 0
|
8月前
|
网络协议 Ubuntu Linux
为公网SSH远程Ubuntu配置固定的公网TCP端口地址主图
为公网SSH远程Ubuntu配置固定的公网TCP端口地址主图
85 0
|
9月前
|
网络协议 应用服务中间件 nginx
Nginx TCP 端口转发
Nginx TCP 端口转发
129 0
|
9月前
|
网络协议
swoole 端口监听,关闭tcp服务
某直播平台,需要观察员去不定时的抽查直播平台的内容,对于直播网站不良的直播进行封禁和停播的处理。
swoole 端口监听,关闭tcp服务
|
10月前
|
移动开发 运维 网络协议
Linux Ncat 探测tcp/udp端口
Linux Ncat 探测tcp/udp端口
894 0
|
10月前
|
网络协议 网络架构
字节一面:TCP 和 UDP 可以使用同一个端口吗?
关于端口的知识点,还是挺多可以讲的,比如还可以牵扯到这几个问题: 多个 TCP 服务进程可以同时绑定同一个端口吗? 客户端的端口可以重复使用吗? 客户端 TCP 连接 TIME_WAIT 状态过多,会导致端口资源耗尽而无法建立新的连接吗?
|
11月前
|
网络协议 程序员 网络安全
网络发展背景、TCP/IP五层模型、网络传输基本流程、ip地址与端口概念(2)
我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这 两者之间是怎样的关系?
136 0