近期,线上Nginx服务器的TPS未超过100,但其Writing、Active连接数有时却超过了300。因为服务对响应时间要求较高,同时每个调用方使用的IP地址有限(即总的不同的连接地址有限),所以使用HTTPs长连接技术。(HTTP长连接与短连接)
问题现象:使用"sudo netstat -antp | grep 80"发现,存在大量的"TIME_WAIT" socket等待中断请求确认的线程(8000+)
原因:使用Wireshark分析tcpdump.txt发现,eleme使用短连接请求(非长连接,Keep-Alive),而服务器端使用的却是长连接。eleme每次请求都会新开一个连接,请求完之后就把该连接关闭了;而服务端线程在处理完请求后却一直打开等待着下一个请求的到来(5min最长存活时间),同时对新的请求又需要新建一个线程,致使大量线程出现"TIME_WAIT"现象,所有请求处理线程都等待5min后才会被服务器关闭。
解决方法:让eleme改为长连接请求
[参考]
- Apache服务器的 FIN_WAIT1 过多 TIME_WAIT 过多问题解决
- UNIX / Linux: 10 Netstat Command Examples
- netstat命令详解 (10 Netstat Command Examples 中文版)
- netstat(8) - Print network connections, routing tables, interface statistics - Linux manual page
[RFC] 服务端无状态的传输层安全(TLS)会话恢复协议
无状态TLS会话恢复机制概述
先说说TLS会话恢复机制的出现是为了解决什么问题?
【背景】
SSL会话恢复的原理是在服务端缓存所有的session,客户端之后在每次和服务端握手时通过Session ID完成session状态恢复。这种机制对服务端有如下挑战:
1. 如果是在本机缓存session,必须保证同一个客户端的请求要落到同一台服务器,这无疑给前端负载均衡策略增大了压力。
2. 如果是为一个集群单独建立一个shared的session cache,同样也增加了请求的处理环节,并增加了系统的成本(都是money啊)。
之所以如此纠结是因为SSL觉得session信息必须放在服务端缓存,而SSL的替代者TLS则提供了新的选择,服务端无状态的会话恢复机制。
【原理】
简单的说,就是服务端不再缓存session的状态信息,而是将其加密并分发和转存到客户端,缓存在客户端的session状态信息叫Ticket(船票,你懂得)。客户端每次请求时同时发送ticket到服务端,服务端将其解密并reuse之前的session状态信息。
[参考]
- 服务端无状态的TLS session resumption机制 - 淘宝千石
- Optimizing for TLS - Chapter 4. Transport Layer Security (TLS)
- TLS优化 - Optimizing for TLS
1. 触发新的会话票证的完整握手的消息流
真实的网络数据包:
“Message Flow for Full Handshake Issuing New Session Ticket”适合HTTPS短连接场景。
3. 不触发新的会话票证的服务器完成完整握手的消息流
真实的网络数据包:
“Message Flow for Server Completing Full Handshake Without Issuing New Session Ticket”适合HTTPS长连接场景。
待解决“存在TCP重复ACK和丢包现象”:
参考
[PDF] Transport Layer Security (TLS) Session Resumption without Server-Side State
玩的开心!^_^
相关推荐
本文讨论了在线上环境中,服务端长连接和客户端短连接配置不当导致Nginx服务器产生大量“TIME_WAIT”状态线程的问题,同时提供了问题的分析和解决方法。本文主要涉及的网络编程知识点包括长连接与短连接的定义和区别...
OpenResty 的使用过程中,可能会遇到一些性能瓶颈,比如 TIME_WAIT 问题和与 Docker 网络的配合问题。这时,了解如何使用火焰图来定位性能问题变得尤为重要。火焰图是一种性能分析工具,它通过可视化的方式帮助...
- Socket编程:客户端与服务端 - 数据传输与编码 - **项目阶段课程** - 项目调研:需求分析、市场研究 - 数据库表设计:ER图、SQL建表语句 - 需求分析、概要设计与详细设计文档编写 #### 二、高级主题 - **...
Libevent是一个高效、轻量级的事件通知库,广泛应用于高性能服务器开发中,尤其在处理大量并发连接时表现出色。其0.9版本虽然相对老旧,但对于理解事件驱动编程模型和libevent的基本架构仍具有重要的学习价值。本文...
- **Socket编程**:客户端和服务端的建立连接、数据传输。 8. **分布式** - **负载均衡**:Nginx、Ribbon、Consul。 - **缓存**:Redis、Memcached的使用和优化。 - **消息队列**:RabbitMQ、Kafka的使用场景与...