`
Zhongwei_leg
  • 浏览: 545939 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Tornado 源码阅读笔记(二)

 
阅读更多

主要看一下 Kqueue 的原理

翻译自 (Kqueue: A generic and scalable event notification facility) 这篇论文

 

 

概要

在 Unix 平台下,当 socket 或者其他的 descriptor 状态发生变化时,相关的应用应该收到通知。过去是通过系统调用 select() 和 poll() 来实现的。

 

但是,事实证明,在大量 descriptor 的情况下,这两种机制性能低下。

除了性能问题,这两种实现在功能上也不能满足需求。例如,不能处理以下事件:signals, file system changes, AIO completions.

 

于是,Kqueue 应运而生。它允许应用程序响应一系列不同的事件种类,并且更加高效。同时,可以做到在不修改应用程序接口的情况下,响应未来可能出现的新的事件种类。

 

 

1 介绍

应用程序通常是 event driven,也就是来一个事件,处理一个事件。所以,通常应用程序的性能取决于检测和响应这些事件的效率。

 

FreeBSD 提供了两个系统调用来监测 file descriptor 的动态,即 poll() and select()。但是,在大量 file descriptor 需要监控的情况下,这两个家伙都不够给力。有互联网服务端开发经验的兄弟都知道,服务器通常需要同时处理几千个请求,即监控几千个 descriptor。所以,这两个家伙便成了性能瓶颈。

 

应用程序需要监测的事件,并不局限于 activity on an open file descriptor. 应用程序同样需要能够监测到 when an asynchronous I/O (AIO) request completes, when a signal is delivered to the application, when a file in the filesystem changes in some fashion, or when a process exits. 而 poll() select() 无法监测这些事件,于是我们就需要大量的额外代码来处理这些问题,增加了代码的复杂度。

 

Kqueue 则允许应用程序 register its interest in a specific event, 并且稍候高效地收集 the notification of the event. 同时,除了上面列出的事件类型,还能够监控未来可能出现的新的事件类型(在不修改现有 API 的情况下)。

 

 

2 问题

poll() select() 的缺陷在于,对于每次调用,都需要传入完整的 descriptor 列表。这将迫使系统执行两次内存拷贝 across the uesr/kernel boundary, 占用大量内存。对于需要监控几千个 descriptor 的情况,实践证明,通常只有 a few hundred actually have any activity, 造成 95% 的拷贝操作都是不必要的。

 

监控的结果返回之后,应用程序需要遍历整个 descriptor 列表, 以寻找那些被 kernel 标记为 having activity 的。既然 kernel 已经知道 which descriptor were active,这就意味着做了重复的工作。更高效的方法是,kernel 只返回 a list of descriptor that it knows is active. 遍历列表的复杂度是 O(N), 当 N 变得非常大时,性能就会很差。

 

在 kernel 内部,情况也非常糟糕。kernel 必须分配空间来存放 descriptor 列表;对于较大的列表,往往是通过 malloc() 来实现,并且在返回结果之前,这部分空间必须释放掉。

 

// ===== 原文第二部分的余下论述,我实在不能理解,需要再查一下其他的资料 =====

 

分享到:
评论

相关推荐

    tornado框架短租web系统源码

    tornado作为用户产品后台服务器核心框架 redis 保存session数据、短时间房源信息、地域信息等,保存页面缓存数据,提高服务器响应速度 采用前后端完全分离架构,采用ajax异步调用、json数据传输,使后端接口可以...

    tornado-1.2.0源码

    tornado-1.2.0的源码文件,从torando的低版本研究源码比较容易代码比较简洁

    python+tornado开发的实例源码

    python+tornado开发的实例源码,需要环境简单,整个项目结构完整,是学习者的好选择

    learning-tornado-src:Tornado框架源码学习笔记

    tornado作为web框架和异步网络库,代码量过多,因此在分析tornado源码时,可以选择一些比较重要的模块来阅读,方式:current.py,gen.py,tcpserver.py,httpserver.py,ioloop .py,iostream.py,web.py等 ...

    千锋教育 tornado网课笔记

    千锋教育 python基础教程,tornado网课笔记(思维导图)

    Tornado源码分析之http服务器篇

    dddd 博文链接:https://kenby.iteye.com/blog/1159621

    Tornado和VxWorks学习笔记

    Tornado和VxWorks学习笔记, 包括Tornado和VxWorks的一些基础知识, 实际应用

    python-tornado笔记

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 ...

    tornado源代码

    开源web服务器源代码,tornado是一款纯java开发的。

    股票分析系统源码,基于python,tornado框架.zip

    股票分析系统源码,基于python,tornado框架.zip

    千峰python课件笔记+源码 (凯哥)

    第二章前端基础 1、html&css;基础 2、html&css;提升 3、JavaScript基础 4、JavaScript提升 5、JavaScript进阶与轮播和飞机大战坦克 6、JQuery基础 7、JQuery提升 8、H5C3基础 第三章 Django 1、Django基本流程走通 ...

    基于python的+tornado框架实现的一个项目管理系统源码.zip

    基于python的+tornado框架实现的一个项目管理系统源码.zip 基于python的+tornado框架实现的一个项目管理系统源码.zip 基于python的+tornado框架实现的一个项目管理系统源码.zip

    tornado 2.2.2 source code

    tornado 2.2.2 vxworks 5.5.2的内核源码,对嵌入式开放人员有一定参考价值

    源码:zk-SNARKs实战:使用circom和snarkjs实现简单版的Tornado

    该源代码对应本人博文《zk-SNARKs实战:使用circom和snarkjs实现简单版的Tornado(含源码)》,如要看该文章,可直接在百度中根据题目搜索

    annotated-py-tornado:对tornado源码进行注释

    包括思维导图等工具制作的笔记参考阅读文档龙卷风核心模块内核重点剖析3. tornado原始版本:版本规则: v1.x,v2.x,v3.x,v4.x,当大版本更新时,代码增长量,比较多v1.x的小版本更新时,通常是修复bug,代码增长量...

    tornado python web开发

    Python web应用框架进行对比,结果最大浏览量超过第二名近40%。 性能: Tornado有 着优异的性能。它试图解决C10k问题,即处理大于或等于一万的并发,下表是和一些其他 Web框架与服务器的对比: Web server requests/...

    Python Tornado 中文教程

    得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 ...

    tornado.pdf

    tornado 入门开发 Tornado is different from most Python web frameworks. It is not based on WSGI, and it is typically run with only one thread per process. See the User’s guide for more on Tornado’s ...

Global site tag (gtag.js) - Google Analytics