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

Flask使用长连接(Connection会失效)、http的keep-alive、webSocket。---GPU的CUDA会内存不足报错

Flask Curl命令返回状态Connection: close转keep-alive的方法

使用waitress-serve启动
waitress-serve --listen=0.0.0.0:6002 manage:app
使用Gunicorn命令启动
gunicorn -t 1000 -w 2 -b 0.0.0.0:6002 --worker-class gevent --limit-request-line 8190 manage:app

Flask使用flask_socketio实现websocket
Python中的单例模式

‌WebSocket和HTTP Keep-Alive的主要区别在于它们的工作机制、数据传输方式以及应用场景。‌

工作机制 ‌HTTP
Keep-Alive‌:HTTP协议通过Keep-Alive头字段支持长连接,允许在一次TCP连接中发送多个请求和响应。尽管这减少了建立新连接的开销,但每次请求仍然需要发送完整的HTTP头部信息,且服务器和客户端之间的通信是单向的,即客户端发送请求,服务器响应‌。

‌WebSocket‌:WebSocket通过一次HTTP握手建立连接后,后续的数据交换不再需要发送HTTP头部信息。它允许服务器和客户端之间的双向通信,即双方都可以主动发送消息,实现了真正的全双工通信‌。

数据传输方式 ‌HTTP
Keep-Alive‌:在使用Keep-Alive的情况下,每次请求仍然需要发送完整的HTTP头部信息,这会导致信息交换效率较低‌。

‌WebSocket‌:WebSocket在建立连接后,后续的数据交换不需要再发送HTTP头部信息,这显著提高了数据传输的效率‌。

应用场景 ‌HTTP‌:适用于传输网页、图片、文本等静态资源,以及通过RESTful API进行数据传输。由于其无状态和单向通信的特性,HTTP更适合于不需要实时交互的应用场景‌。

‌WebSocket‌:广泛应用于需要实时交互的场景,如实时聊天、在线游戏、金融行业的实时数据更新等。由于其全双工通信的特性,WebSocket能够更好地支持需要双向通信的应用‌。


HTTP与TCP中keep-alive的区别
1、HTTP协议(七层)的Keep-Alive意图在于连接复用,希望可以短时间内在同一个连接上进行多次请求/响应。核心在于:时间要短,速度要快。
   举个例子,你搞了一个好项目,想让马云爸爸投资,马爸爸说,"我很忙,最多给你3分钟”,你需要在这三分钟内把所有的事情都说完。

2、TCP协议(四层)的KeepAlive机制意图在于保活、心跳,检测连接错误。核心在于:虽然频率低,但是持久。

在这里插入图片描述
在HTTP通信中,连接复用(Connection Reuse)是一个重要的概念,它允许客户端和服务器在同一个TCP连接上发送和接收多个HTTP请求/响应,而不是为每个新的请求/响应都创建一个新的连接。这种技术可以显著提高网络性能,减少网络延迟和资源消耗。在Python中,我们可以使用多种方法来实现HTTP请求的连接复用。

  1. HTTP/1.1的持久连接(Keep-Alive)

HTTP/1.1标准引入了持久连接(也称为Keep-Alive连接)的概念,允许客户端和服务器在单个TCP连接上发送多个请求和响应。默认情况下,许多现代的HTTP客户端和服务器都支持持久连接。在Python中,使用http.client或requests库时,通常会自动启用持久连接,除非显式地禁用了它。

  1. 使用requests库的连接池

requests库是一个流行的Python HTTP客户端库,它内部使用了连接池来管理TCP连接。连接池允许requests库在多个请求之间复用TCP连接,而无需为每个请求都创建新的连接。通过连接池,requests库能够显著提高网络性能和吞吐量。

  1. 自定义连接复用逻辑

虽然requests库已经为我们提供了连接池的功能,但在某些特定场景下,我们可能需要自定义连接复用的逻辑。这时,我们可以使用http.client库来手动创建和管理TCP连接。通过维护一个持久的TCP连接,并在多个请求之间复用该连接,我们可以实现自定义的连接复用逻辑。

  1. 使用HTTP/2协议

HTTP/2是一个现代的HTTP协议版本,它内置了对连接复用的支持,并提供了更多的性能优化功能。与HTTP/1.1相比,HTTP/2使用二进制帧格式进行通信,支持多路复用(Multiplexing),即允许在一个TCP连接上并发地发送和接收多个请求/响应。在Python中,我们可以使用支持HTTP/2协议的客户端库(如httpx或h2)来发送HTTP请求,并利用HTTP/2的连接复用功能来提高性能。

  1. 注意事项

· 在实现连接复用时,我们需要确保客户端和服务器都支持所使用的协议版本(如HTTP/1.1或HTTP/2)。

· 连接复用可能会增加服务器的负载和响应时间,特别是在高并发的场景下。因此,在实际应用中,我们需要根据具体情况来权衡连接复用的利弊。

· 当不再需要某个连接时,我们应该及时关闭它,以释放系统资源。在Python中,可以使用socket.close()方法或相关库的方法来关闭连接。
1. keepalive 是否开启服务端控制还是客户端控制?
2. keepalive的时间是由服务端控制还是客户端控制?
3. keepalive时间一到,是由客户端主动关闭还是服务端主动关闭?
4. 如果客户端不是httpclient,使用telnet连接服务端?

aiohttp基本及进阶使用

解决TIME_WAIT过多的方法包括以下几种‌:

‌调整系统参数‌:

‌增加最大文件句柄数和最大连接数‌:通过调整操作系统的网络参数,可以减少TIME_WAIT连接数量。可以增加系统的最大文件句柄数(File Descriptor)和最大连接数(Maximum Connections),以便系统能够处理更多的连接请求‌1。
‌调整TCP参数‌:可以调整TCP的参数来减少TIME_WAIT连接数量。例如,调整TCP的timewait超时时间(Time Wait Timeout)来缩短TIME_WAIT状态的持续时间;启用TCP快速回收(TCP Fast Recovery)来立即回收处于TIME_WAIT状态的连接‌12。
‌优化应用程序‌:

‌检查和优化代码‌:确保在建立连接后及时关闭连接,避免产生过多的TIME_WAIT连接。可以优化代码,减少连接的建立和关闭次数,或者使用连接池技术复用连接‌1。
‌使用连接池‌:对于需要频繁建立连接的场景,可以使用连接池来管理连接,避免频繁地创建和关闭连接,从而减少TIME_WAIT连接数量‌12。
‌调整内核参数‌:

‌开启TCP时间戳‌:在Linux系统中,通过开启TCP时间戳功能,可以避免TIME_WAIT状态的累积。可以通过修改/etc/sysctl.conf文件,添加配置net.ipv4.tcp_timestamps=1并执行sysctl -p命令使配置生效‌3。
‌启用TCP连接复用‌:通过修改/etc/sysctl.conf文件,添加配置net.ipv4.tcp_tw_reuse=1并执行sysctl -p命令,允许将TIME_WAIT状态的连接用于新的连接‌34。
‌调整本地端口范围‌:如果本地端口范围设置得太小,可能会导致端口耗尽和TIME_WAIT状态的增加。可以通过调整本地端口范围来减少TIME_WAIT状态的数量‌3。
‌缩短TIME_WAIT超时时间‌:通过修改net.ipv4.tcp_fin_timeout参数,将其设置为更短的时间(如30秒),以缩短TIME_WAIT状态的持续时间‌45。
‌使用连接复用技术‌:

‌HTTP/1.1的keep-alive机制‌:可以使用HTTP/1.1的keep-alive机制来复用TCP连接,减少TIME_WAIT连接数量‌1。
‌HTTP/2的多路复用技术‌:HTTP/2的多路复用技术也可以复用TCP连接,减少TIME_WAIT连接数量‌1。

在这里插入图片描述
WebSocket、Socket、TCP、HTTP区别
WebSocket 与 TCP 的异同
WebSocket(2)–为什么引入WebSocket协议
【TCP】三次握手
【TCP】四次挥手


http://www.mrgr.cn/news/79765.html

相关文章:

  • Linux24.04 安装企业微信
  • scala的泛型
  • 【Neo4J】neo4j docker容器下的备份与恢复
  • mp4影像和m4a音频无损合成视频方法
  • 池化在深度学习中增强特征的作用
  • Python的3D可视化库【vedo】1-4 (visual模块) 体素可视化、光照控制、Actor2D对象
  • 开启第二阶段---蓝桥杯
  • 红日靶场vulnstack 4靶机的测试报告[细节](一)
  • uniapp-内部项目使用文档
  • C语言单元总结
  • String【Redis对象篇】
  • day10性能测试(2)——Jmeter
  • 【LeetCode每日一题】LeetCode 209.长度最小的子数组
  • java全栈day13-后端Web实战2
  • Pytest测试用例使用小结
  • 动态量化和静态量化
  • 【VUE2】纯前端播放海康视频录像回放,视频格式为rtsp格式,插件使用海康视频插件[1.5.4版本]
  • 作业Day1:思维导图、堆区申请空间并释放
  • Pointpillars模型转onnx
  • 彻底理解布隆过滤器怎么解决缓存穿透问题
  • vue-router查漏补缺
  • Linux高并发服务器开发 第一天(Linux的目录结构 cd用法 终端提示符格式)
  • List【Redis对象篇】
  • SAP Ariba Buying_Order Fulfillment Status
  • TDM-GCC 和 MinGW和Cygwin:Windows 下的开源 C/C++ 编译器
  • Python画泰勒图