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请求的连接复用。
- HTTP/1.1的持久连接(Keep-Alive)
HTTP/1.1标准引入了持久连接(也称为Keep-Alive连接)的概念,允许客户端和服务器在单个TCP连接上发送多个请求和响应。默认情况下,许多现代的HTTP客户端和服务器都支持持久连接。在Python中,使用http.client或requests库时,通常会自动启用持久连接,除非显式地禁用了它。
- 使用requests库的连接池
requests库是一个流行的Python HTTP客户端库,它内部使用了连接池来管理TCP连接。连接池允许requests库在多个请求之间复用TCP连接,而无需为每个请求都创建新的连接。通过连接池,requests库能够显著提高网络性能和吞吐量。
- 自定义连接复用逻辑
虽然requests库已经为我们提供了连接池的功能,但在某些特定场景下,我们可能需要自定义连接复用的逻辑。这时,我们可以使用http.client库来手动创建和管理TCP连接。通过维护一个持久的TCP连接,并在多个请求之间复用该连接,我们可以实现自定义的连接复用逻辑。
- 使用HTTP/2协议
HTTP/2是一个现代的HTTP协议版本,它内置了对连接复用的支持,并提供了更多的性能优化功能。与HTTP/1.1相比,HTTP/2使用二进制帧格式进行通信,支持多路复用(Multiplexing),即允许在一个TCP连接上并发地发送和接收多个请求/响应。在Python中,我们可以使用支持HTTP/2协议的客户端库(如httpx或h2)来发送HTTP请求,并利用HTTP/2的连接复用功能来提高性能。
- 注意事项
· 在实现连接复用时,我们需要确保客户端和服务器都支持所使用的协议版本(如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】四次挥手