02-Twisted 构建 Web Server 的 Socket 长链接问题 | 07.杂项 | Python

02-Twisted 构建 Web Server 的 Socket 长链接问题

郑昀 201005 隶属于《07.杂项》

背景

利用几句简单代码可以构建一个 Web Server:

from twisted.internet import reactor
from twisted.web.server import Site
from my_webhandler import *
reactor.listenTCP(8080, Site(MyWebResource.setup()))

更复杂的运用参见IBM文档库:第 1 部分讲述异步服务器编程; 第 2 部分介绍编写Web服务的高级技术; 第 3 部分用 Woven 模板实现动态Web服务器;第 4 部分讲述如何利用 SSH。或者Configuring and Using the Twisted.Web Server

有时易造成 Socket 连接打开过多

当用此 Web Server 接收 PubSubHubbub Hub Server 发送过来的各种请求时,遇到了一个大问题:

随着时间推移,处于 ESTABLISHED 状态的 Socket 连接越来越多,慢慢抵达500多个,

TCP X.X.X.X:8080 72.14.192.68:55693 ESTABLISHED
TCP X.X.X.X:8080 74.125.126.80:59064 ESTABLISHED

最终导致服务爆出异常“too many file descriptors in select”,当此异常发生时,已无法挽救,只能重启服务。

这里的知识点是 Windows 下 select module 文件描述符(file descriptor)最多是512个,而在 Linux 下这个限制为 32767 ,如果超过这个限制值,就会出现类似上面的异常。

我们暂且不管这个问题牵涉到 PubSubHubbub Hub 喜欢保持长链接(Hubs MAY leave their TCP connections open and reuse them to make HTTP requests for freshly published events)并maybe重用连接的习惯。

既然 Server 端(指我们的 WebServer)无法保证总能断开闲置连接,那么可以通过设置闲置超时来解决这个问题。

twisted.web.server.Site 的 timeout 设置

twisted.web.server.Site 类的初始化函数有一个可选参数 timeout ,它的默认值是 60*60*12 ,应该就是12小时。
这个 timeout 值经由 twisted.web.http.HTTPFactory 的初始化函数赋值给 twisted.internet.protocol 的 timeOut 属性,从而能够在底层 HTTP 协议发现连接闲置超时后交由 TimeoutMixin 处理。

12小时太长。所以才会有许多处于 ESTABLISHED 状态的 Socket Connections 积累。所以我们缩短为 15分钟。So,我们只需要在开始执行:
reactor.listenTCP(8080, Site(MyWebResource.setup(),timeout=60*15))
即可。

这样,当 Socket 接收完数据后(此时调用self.resetTimeout()重置)连接闲置时间超时,将默认调用twisted.protocols.policies.TimeoutMixin.timeoutConnection 函数,它的定义是:

def timeoutConnection(self):
"""Called when the connection times out.
Override to define behavior other than dropping the connection.
"""
self.transport.loseConnection()

也就是关闭连接。此时,会有输出提示的:

Timing out client: IPv4Address(TCP, '72.14.192.68', 43949)

经过实践,确实可以让Web Server 占用的 Socket 连接大为减少。

何为 TimeoutMixin

有人和我一样抱怨 Twisted 的这个问题:
『Client will not close the connect unit it disconnects itself. But the server can't control the connect. In some critical environment, the server has to maintain a lot of connect which maybe is idle.』
有人回复说, twisted.protocols.policies.TimeoutMixin 可以让 Server 主动断开连接:
class TimeoutTester(protocol.Protocol, policies.TimeoutMixin):
timeOut = 3
timedOut = 0

def connectionMade(self):
self.setTimeout(self.timeOut)

def dataReceived(self, data):
self.resetTimeout()
protocol.Protocol.dataReceived(self, data)

def connectionLost(self, reason=None):
self.setTimeout(None)

def timeoutConnection(self):
self.timedOut = 1
另一个样例参见:
http://code.google.com/p/proxy65/source/browse/trunk/proxy65/socks5.py

参考资源:

1、How to set client timeout with reactor.listenTCP?

2、参考 twisted 的文档 《Knowing When We're Not Wanted》:

Sometimes it is useful to know when the other side has broken the connection. Here is an example which does that:


from twisted.web.resource import Resource
from twisted.web import server
from twisted.internet import reactor
from twisted.python.util import println

class ExampleResource(Resource):

 def render_GET(self, request):
 request.write("hello world")
 d = request.notifyFinish()
 d.addCallback(lambda _: println("finished normally"))
 d.addErrback(println, "error")
 reactor.callLater(10, request.finish)
 return server.NOT_DONE_YET

resource = ExampleResource()

This will allow us to run statistics on the log-file to see how many users are frustrated after merely 10 seconds.

3、关于Windows频繁打开关闭端口时出现的问题

4、Choosing a TCP Port for a Network Service

5、02-Twisted 构建 Web Server 的 Socket 长链接问题 | 07.杂项 | Python

6、Windows频繁打开和关闭端口可能引发的问题 | 07.杂项

时间: 2024-10-29 06:00:39

02-Twisted 构建 Web Server 的 Socket 长链接问题 | 07.杂项 | Python的相关文章

03-PubSubHubbub 和 twisted 的 Persistent connections 能力 | 07.杂项 | Python

03-PubSubHubbub 和 twisted 的 Persistent connections 能力 郑昀 201005 隶属于<07.杂项> 关于上节<02-Twisted 构建 Web Server 的 Socket 长链接问题>,还可以继续探讨为何会保持 Socket 长链接. 该关闭的连接没关闭? 有人在twisted邮件列表中也反映:  『We close the render_POST with a request.write('data') & a re

使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序

server|web|程序|全文搜索 使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序 Andrew B. CenciniMicrosoft Corporation 2002年12月 适用于:    Microsoft SQL Server 2000摘要:学习如何充分利用 SQL Server 2000 的全文搜索功能.本文包含有关实现最大吞吐率和最佳性能的几点提示和技巧. 目录简介 全文搜索功能简介 配置全文搜索功能 全文查询 排位和优化 其他

《JavaScript构建Web和ArcGIS Server应用实战》——第1章 HTML、CSS和JavaScript简介

第1章 HTML.CSS和JavaScript简介 JavaScript构建Web和ArcGIS Server应用实战 在开始使用ArcGIS API for JavaScript进行GIS应用程序开发之前,你需要理解一些基本概念.对于那些已经熟悉HTML.JavaScript和CSS的读者来说,就请跳过这一章直接到下一章进行学习.但是,如果你刚开始了解这些概念,请继续阅读.我们将从基础概念开始介绍这些主题,这足以让你入门.关于这些主题的更高层次的学习,有很多学习资源提供,包括书籍和在线教程.你

利用Socket提交文件到web server

    前一段时间开发一个WebDAV的客户端,主要是接受发送文件.因为只需要上传下载文件,所以不想使用curl这样重量级的库,所以,基于以上原因自己编写封装一个类,利用socket完成对文件的上传和下载,还可以使用内核函数sendfile实现文件上传时的"零拷贝".在本例中,同样也给出使用curl方式对文件进行上传操作的方法.针对WebDav的开发还有一个专门的库neon,同样这里也给出使用neon库完成文件上传操作的方法.     在上传过程中会把大于2M的文件,按2M发送,以防止

在Java ME平台中使用Subversion、NetBeans IDE和Sun Java System Web Server

问题 源代码管理(SCM)产品用于管理多个版本的项目文件,允许您保存新版本.恢复较旧版本以及在不同版本之间进行比较.当您在修改项目的过程中引入了bug,这将是一个非常有价值的功能.大多数较新源代码管理(SCM)产品除了可管理各文件的版本之外,还提供了在 Bell 实验室中开发的源代码控制系统(SCCS). 即使对于小型项目,每一位开发人员也应该使用源代码管理(SCM).小型项目转变成大型项目是必然的事情,虽然从工作上说仅仅需要修复错误和添加功能.跟踪和管理软件的能力是获得成功的关键因素. 应用程

ASP.NET与PHP构建web程序的方法的优缺点

比较这两种最流行的构建 web 应用程序的方法的优缺点 如今当提到 Web 开发时,您有许多选择.这些方法中许多都涉及到预处理 - 即,利用特定的标记将代码嵌入到 HTML 页面中,这些标记告诉预处理器,它们包含代码,并且应对它们作出处理.与 CGI 非常相似,这些代码在服务器上运行,并返回一些内容,这些内容表现为发回给浏览器的结果 HTML 页面的部分外观.开放源代码脚本语言 PHP 和 Microsoft 的 ASP.NET 框架中的语言都属于这种类型:JavaServer Pages (J

整合apache和tomcat构建Web服务器

linux是最常用的web服务器,本节我们将通过整合apache和tomcat构建一个java/jsp运行平台,详细介绍web服务器的搭建过程. 一.apache与tomcat整合的必要性 Apache是最流行的Web服务器,开放源代码,支持跨平台的应用(可以运行在几乎所有的Linux.Unix.Windows系统平台上),尤其对Linux的支持相当完美. apache的优点有: 功能强大,apache自带了很多功能模块,可根据需求编译自己需要的模块. 配置简单,apache的配置文件非常简单,

在Sun Java System Web Server上使用Quercus运行PHP

Sun Java System Web Server 可以在所有主要操作系统上运行,并支持多种动态内容技术,如 Java Servlet.JavaServer Pages.JavaServer Faces.Active Server Pages.PHP.ColdFusion.Netscape API.CGI 和 Ruby on Rails,从而开发 Web 应用程序.其最新版本 Sun Java System Web Server 7.0 Update 1(下面简称 Web Server)现在可

WSE3.0构建Web服务安全(4) MTOM消息传输优化和文件上传、下载

MTOM消息优化传输机制主要应用于大量数据的传输,很多文章中也直接得出结论:使用MTOM文件传输效率高.为什么MTOM的数据传输效率会比别的方式要高?MTOM真的如此完美吗,它有什么不足?什么情况下使用MTOM?这些疑问,本文WSE3.0构建Web服务安全系列文章的第4节:MTOM消息优化传输机制和文件上传.下载--将为您一一解答.本节结构为1.MTOM基础概念2.WSE3.0工具配置MTOM3.代码实现与分析4.总结.最后附上实现代码供大家参考. WSE3.0中引入MTOM机制,给我们借助WS