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.rhkb.cn/news/487778.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prim 算法在不同权重范围内的性能分析及其实现

Prim 算法在不同权重范围内的性能分析及其实现 1. 边权重取值在 1 到 |V| 范围内伪代码C 代码实现2. 边权重取值在 1 到常数 W 之间结论Prim 算法是一种用于求解加权无向图的最小生成树(MST)的经典算法。它通过贪心策略逐步扩展生成树,确保每次选择的边都是当前生成树到未加…

Windows Terminal ssh到linux

1. windows store安装 Windows Terminal 2. 打开json文件配置 {"$help": "https://aka.ms/terminal-documentation","$schema": "https://aka.ms/terminal-profiles-schema","actions": [{"command": {"ac…

Hadoop生态圈框架部署 伪集群版(四)- Zookeeper单机部署

文章目录 前言一、Zookeeper单机部署(手动部署)1. 下载Zookeeper安装包到Linux2. 解压zookeeper安装包3. 配置zookeeper配置文件4. 配置Zookeeper系统环境变量5. 启动Zookeeper6. 停止Zookeeper在这里插入图片描述 注意 前言 本文将详细介绍Zookeeper的…

MBTI 16人格分析

文章目录 一、MBTI介绍二、十六种MBTI人格1.ESTJ:总经理2.ENTP:辩论家3.INTP:逻辑学家4.ISFJ:守卫者 三、4组人格分析1.E与I2.S与N3.T与F4.P与J 一、MBTI介绍 MBTI是一种人格类型理论模型。全称是“Myers-Briggs Type Indicator”…

Ubuntu22.04深度学习环境安装【显卡驱动安装】

前言 使用Windows配置环境失败,其中有一个包只有Linux版本,Windows版本的只有python3.10的,所以直接选用Linux来配置环境,显卡安装比较麻烦,单独出一期。 显卡驱动安装 方法一:在线安装(操作…

【LeetCode: 463. 岛屿的周长 + bfs】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【Web】2024“国城杯”网络安全挑战大赛题解

目录 Ez_Gallery 法一:shell盲注 法二:反弹shell 法三:响应钩子回显 Easy Jelly 法一:无回显XXE 法二:Jexl表达式RCE signal 法一:SSRF 法二:filterchain RCE Ez_Gallery 用这个bp验证…

记一次:使用C#创建一个串口工具

前言:公司的上位机打不开串口,发送的时候设备总是关机,因为和这个同事关系比较好,编写这款软件是用C#编写的,于是乎帮着解决了一下(是真解决了),然后整理了一下自己的笔记 一、开发…

大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Windows 安装配置 RabbitMQ 详解

博主介绍: 计算机科班人,全栈工程师,掌握C、C#、Java、Python、Android等主流编程语言,同时也熟练掌握mysql、oracle、sqlserver等主流数据库,能够为大家提供全方位的技术支持和交流。 工作五年,具有丰富的…

14-1.Java 多线程(创建线程的方式、Thread 常用方法、线程安全、线程同步、线程通信、线程池使用、并发与并行、线程的生命周期、乐观锁与悲观锁)

一、线程概述 线程是一个程序内部的一条执行流程 程序中如果只有一条执行流程,那这个程序就是单线程的程序 多线程是指从软硬件上实现的多条执行流程的技术,多条线程由 CPU 负责调度执行 Java 通过 java.lang.Thread 类的对象来代表线程的 二、创建线…

中介者模式的理解和实践

一、中介者模式概述 中介者模式(Mediator Pattern),也称为调解者模式或调停者模式,是一种行为设计模式。它的核心思想是通过引入一个中介者对象来封装一系列对象之间的交互,使得这些对象不必直接相互作用,从…

MySQL-DQL之数据多表操作

文章目录 一. 多表操作1. 表与表之间的关系2. 外键约束3. 创建外键约束表(一对多操作) 二. 多表查询1. 多表查询① 交叉连接查询(基本不会使用-得到的是两个表的乘积) [了解](不要记住)② 交集运算:内连接查询(join)③ 差集运算:外…

Qt之自定义动态调控是否显示日志

创作灵感 最近在芯驰x9hp上开发仪表应用。由于需要仪表警告音,所以在该平台上折腾并且调试仪表声音的时候,无意间发现使用: export QT_DEBUG_PLUGINS1 可以打印更详细的调试信息。于是想着自己开发的应用也可以这样搞,这样更方便…

Nanolog起步笔记-9-log解压过程(3)寻找meta续

Nanolog起步笔记-9-log解压过程-3-寻找meta续 当前的目标新的改变decompressNextLogStatementmetadata查看业务面的log语句注释掉 runBenchmark();改过之后,2条记录之后,这里就直接返回了 小结 当前的目标 没有办法,还要继续。 当前的目标&a…

最小二乘法拟合出二阶响应面近似模型

背景:根据样本试验数据拟合出二阶响应面近似模型(正交二次型),并使用决定系数R和调整的决定系数R_adj来判断二阶响应面模型的拟合精度。 1、样本数据(来源:硕士论文《航空发动机用W形金属密封环密封性能分析…

《操作系统 - 清华大学》6 -7:局部页面置换算法:Belady现象

文章目录 1. 定义2. LRU、FIFO和Clock的比较 1. 定义 局部页面置换算法的特点是针对一个正在运行的程序,它访问内存的情况,访问页的情况,来决定应该采取什么样策略,把相应的页替换出去,站在算法本身角度来考虑置换哪个…

【开源免费】基于SpringBoot+Vue.JS在线办公系统(JAVA毕业设计)

本文项目编号 T 001 ,文末自助获取源码 \color{red}{T001,文末自助获取源码} T001,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

05-标准库开发-STM32-IIC协议

七、STM32中IIC协议 概述 Inter-Integrated Circuit (IIC),也常称为I2C(I squared C),是一种同步、串行、半双工通信总线协议。它主要用于连接低速外围设备到处理器或微控制器上,如MPU6050姿态传感器、OLED显示屏、存…

【linux系统】基础开发工具(yum、Vim)

1. 软件包管理器 1.1 什么是软件包 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序. 但是这样太麻烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上, 通过包管理器可以很⽅便的…