`
nil-zhang
  • 浏览: 51541 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Traffic Server多线程异步事件处理模型

阅读更多

多线程和异步事件处理是设计高并发和高性能服务器程序的主要技术,但很少有应用把两种技术组合在一起使用,原因是二者的组合会增加系统的复杂度,并使代码难以理解。多线程程序可以充分利用现代处理器多核的处理能力,使一个进程的多个任务可以并行执行,提高程序执行的效率。但多线程程序也有其不可回避的缺点。资源竞争导致的死锁,线程调度和切换带来的开销,限制了服务器程序处理连接的能力。异步事件处理程序避免了多线程的资源竞争和死锁,它通过事件循环来调度和执行代码,可以使服务器程序处理大量的连接。但异步处理程序只支持单核;一个事件处理函数处理过多事件会导致处理的延迟;对CPU密集型事件的处理会导致挂起事件的饥饿。如果在代码复杂度可控的情况下,很好地组合这两种技术,取其长而避其短,就能设计出高性能和高并发的服务器程序。Traffic Server多线程异步事件处理程序就是这类应用。

Traffic Server并不是为每个连接都建立一个线程,而是事先创建一组数量可配置的工作线程,每一个工作线程上都运行着独立的异步事件处理程序。异步事件处理程序是通过状态机模型来实现的。状态机模型具有很强的描述系统行为的能力,尤其是针对具有事件驱动的并发的特征的问题,用状态机来建模非常合适。将状态机作为一种构建系统的基本模块来对系统进行分解,将会使很多原本复杂的问题简单化。一个状态机(state machine)是一个行为,它说明对象在生命周期中响应事件所经历的状态序列以及对事件的响应。一个状态(state)是指在对象生命周期中的一个条件或状况,在此期间对象将满足某些条件、执行某些状态或等待某些事件。一个事件(event)是对一个在时间和空间上占有一定地位的有意义的事情的规格说明。在状态机中,一个事件能够触发一个状态转换。一个转换(transition)是两个状态之间的一种关系,它指明对象在第一个状态中执行一定的动作,并当特定事件发生或特定的条件满足时进入第二个状态。一个动作(action)是一个引起模型状态改变或值的返回的可执行的原子操作[1]

Traffic Server对多线程异步事件处理模型的抽象如图1所示。EventProcessor类是模型的核心组件。它负责创建和管理若干组thread,这些thread用于在给定时间内或周期性地异步执行用户定义的任务。EventProcessor提供了一组调度函数,通过这些调度函数可以指定它的一个线程来回调continuation。这些函数调用是非阻塞的。相反,它们返回一个Event对象,并在随后或一个特定时间安排contination的回调。Event由EventProcessor来分配和释放。状态机可以访问返回的,非递归的事件,直到事件被取消或事件的回调函数完成。对于递归的event,event只有在被取消之后才会被访问。对event完成或被取消,eventProcessor负责释放它。

Ethread类是由Event系统创建和管理的thread类型。它在event系统中是一个可以用来调度event的接口(其他两个是Event和EventProcessor类)。为了处理event,每个Ethread对象有两个event队列,一个外部和一个内部。外部队列为Ethread的用户提供,并通过它来附加event到该特定thread。外部队列可以同时被别的thread访问,对它的任何操作都必须以原子方式进行处理。另一方面,内部队列只由Ethread使用,用来处理一定时间内的定时event。这些event在内部排队,也可以来自外部队列。

图1 Traffic Server多线程异步事件处理模型

Event类是Action的一种,作为调度一个操作的结果由EventProcessor返回。与代表异步操作的action不同的是,event是不能可重入调用的。除了可以取消一个event(因为它是一个action)之外,还可以在接收时重新调度它。当通过Event类的调度函数重新调度一个event时,状态机必须在回调它们的线程而非其他线程中调用这些函数。在调用任何调度函数之前,必须已经获得了continuation的锁。取消event的规则和其他的action是一样的:一个event的取消者必须是可以通过任务回调的状态机,在取消操作进行时,状态机的锁必须是被占用的。状态机拥有的任何对event对象的引用(比如指针)在取消之后都不能被使用。

Continuation类是一种抽象机制,用来和它的使用者通信事件的发生,在整个IO core 事件系统中都被用到。Continuation是一个轻量级的数据结构,它实现了一个单一的方法来供使用者回调。通常通过子类化Continuation来实现事件驱动的状态机。通过包含附加的状态和方法,continuation可以结合状态和控制流,并通常用来支持分阶段,事件驱动的控制流。鉴于Event系统对线程的特性,每一个continuation对携带一个ProxyMutex的引用来保护其状态并确保原子操作。这个ProxyMutex对象必须由continuation驱动的类或者IO core Event系统的客户来分配,并且要作为continuation类构造函数的一个参数。

总结一下:Processor创建若干组Thread,并将Event按类型调度到相应的Thread的Event队列上,Thread通过执行Event对应的Continuation中的回调函数,来完成状态的迁移。从初始态到终止态的迁移代表了整个事件的执行过程,而Thread是永不退出的,等待着下一个事件的到来。

以上是笔者分析Traffic Server iocore中的event system后的一些见解,有不当之处,欢迎大家指正。

参考文献:

[1] Grady Booch, James Rumbaugh, Ivar Jacobson. Unified Modeling Language User Guide, The (2nd Edition).

1
2
分享到:
评论

相关推荐

    我在京东写的traffic server笔记

    网络处理还涉及了EventProcessor和EThread等多线程异步event处理机制,以及调度单元和Epoll线程的使用。 最后,文档还提到了插件开发部分,包括基础插件和官方插件,以及它们的设计方案和实现。例如,Range插件用于...

    Traffic Server

    这样,Traffic Server 可以在用户无感知的情况下处理请求,提高响应速度和效率。 - 请求处理:当 ARM 检测到用户请求时,它会分析请求并决定是否通过缓存返回内容,或者直接转发到原始服务器获取最新数据。 除了...

    traffic server cacheurl

    这个参数可以用来指示Traffic Server如何处理这些请求,例如根据URL路径决定是否缓存。 【CacheURL参数】 CacheURL插件支持多种参数,这些参数可以在`@pparam`后面指定,用于控制缓存行为。例如: - `--cacheurl`...

    trafficserver文档

    ### TrafficServer核心知识点详解 #### 一、TrafficServer概述 - **定义与作用**:TrafficServer(简称ATS)是一款高性能的Web代理缓存系统,旨在通过缓存热门内容至网络边缘,缩短用户与数据间的距离,进而提升...

    PyPI 官网下载 | trafficserver_exporter-0.4.0.tar.gz

    《PyPI官网下载:trafficserver_exporter-0.4.0.tar.gz——深入了解Python库的构建与使用》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了丰富的Python库供全球开发者下载和使用。在PyPI官网...

    使用Apache Traffic Server搭建CDN服务器

    使用Apache Traffic Server搭建CDN服务器

    atsinternals, Apache Traffic Server 源代码分析.zip

    1. **高性能**:ATS采用多线程模型,充分利用硬件资源,提供高效的并发处理能力。 2. **缓存策略**:它支持多种缓存策略,如LRU(最近最少使用)、LFU(最不常用)等,以及基于内容的缓存替换策略。 3. **内容分发**...

    Traffic Server 管理员手册

    Traffic Server可以增加互联网请求的处理能力,提升网站性能,并提高Web站点的可扩展性。它通过在本地缓存网站内容来减少对原始服务器的负载,从而在用户请求数据时提供更快的响应时间。Traffic Server还可增强网络...

    TrafficServer日志系统配置指南

    TrafficServer作为一款高性能的代理服务器软件,在处理海量请求的同时,日志记录变得尤为重要。合理的日志配置不仅能够帮助运维人员快速定位问题,还能提高系统的稳定性和可维护性。 **日志系统的构成:** 1. **...

    trafficserver-docker:适用于Apache TrafficServer的Docker构建

    适用于Apache TrafficServer(ATS)的Docker构建 该存储库为提供Dockerfile 地位 Debian:克星 流量服务器:9.0.0 构建的图像将上传到 用法: 安装Docker: : 执行docker run -d --name TrafficServer -p 8080:...

    trafficserver-8.0.3.tar

    在做Proxy过程中,经常遇到需要下载trafficserver代理软件,很多时候一些链接无法下载,奉上次软件,希望对家有所帮助。

    trafficserver自动安装脚本及安装文件包

    trafficserver6的资源包及自动化安装脚本 此脚本是自己写的,自己也在用的,另外博客中也有文章介绍的 https://blog.csdn.net/sincool1003/article/details/82221663

    docker-trafficserver:用于运行 Apache Traffic Server (ATS) 的 Docker 配置

    用法docker run -d --name trafficserver -p 80:80 -p 443:443 -e TRAFFICSERVER_HOST=10.11.12.13 -e TRAFFICSERVER_DEBUG=true eanushan/trafficserver 配置以下环境变量可用于配置。 TRAFFICSERVER_HOST(必需)...

    cpp-支持trafficserver62x

    《cpp-支持trafficserver62x:为老版本TS打造专属监控工具》 在IT行业中,软件维护和升级是一项至关重要的任务,但对于某些特定场景,尤其是企业内部使用的老版本系统,可能由于兼容性、稳定性等原因无法轻易升级。...

    trafficserver-doc-zh:Apache TrafficServer文档中文翻译

    TrafficServer是一款高性能的web反向代理缓存服务器, 一般部署在网络边缘将频繁被访问的数据缓存下来以提升网络的效率和性能。这种方式能够缩短数据和用户之间的距离, 使数据能够快速的分发给用户并且减少了带宽占用...

    proxyServer squid / varnish / apache traffic server / ATS

    proxyServer squid / varnish / apache traffic server / ATS 这篇博文讨论了代理服务器的基本概念,并重点介绍了Squid、Varnish和Apache Traffic Server(ATS)这三种流行的代理缓存服务器软件。下面将详细阐述这些...

    Apache traffic server 离线一键安装脚本

    Apache traffic server 离线一键安装脚本

    多线程控制红绿灯变化

    多线程允许程序在同一时间处理多个任务,提高了程序的执行效率和响应性。在Java、Python、C#等编程语言中,都有内置的多线程支持。 在“多线程控制红绿灯变化”的实现中,我们可能使用到的关键概念和技术包括: 1....

    traffic_simulation-master_python_跟驰_换道模型_交通流_idm

    总的来说,"traffic_simulation-master"项目结合了Python编程、交通流理论、跟驰模型、换道模型等多个领域的知识,对于学习交通工程或者想深入了解交通模拟的人来说,是一个极好的实践平台。通过理解和分析该项目,...

Global site tag (gtag.js) - Google Analytics