Apache Traffic Server

ATS官方交流博客

新blog编写博文wiki

博客wiki 提交说明 博客内容及文章目前托管于:https://github.com/atsblog/blog 提交博文只需要把文章md文件提交到:blog/content/post/目录下。 如 blog/content/post/106.md 博客服务器每分钟会自动从github地址同步一次新改动。 编写习惯说明 目前文章的标题、作者、时间、标签tag是使用一个固定的开头格式进行标注如,本人的md开头部分: --- title: "新blog编写博文wiki" date: 2018-12-15T02:34:19-05:00 description: "纸鸢" tags: [ "ats", "wiki"] weight: 20 draft: false --- 正文开始...... github说明 目前博客内容托管在github上,如果想投稿可以pull request进行投稿,如果想长期编写博客,可以联系直接添加到项目成员中。 客户端工具推荐-vscode 如果没有好用的客户端工具,推荐vscode 安装插件:Markdown All in One、Markdown Preview Enhanced 预览使用Preview,编写使用All in One很方便,例如选择图片它会自动帮你查找目录下的图片文件,选择即可。 vscode也有终端控制台,带预览地编写完成md文件可以直接在终端控制台进行git操作把文章提交到git仓库。 图片示例 ats logo: ![atslogo](../../images/99/ts_logo.png)

ATS的DNS配置指南

Apache Traffic Server由于主要面向大规模的网站和ISP等服务对象,它所面向的主要场景都极其复杂,而ATS在各种使用场景中,都非常依赖一套完整高效的DNS系统。基于众所周知的历史原因,ATS在dns方面的文档说明资料几乎没有,仅有的官方文档里甚至对最基础的一些dns配置选项都语焉不详,文档的缺乏极大困扰着新老用户用户。在这里,我们尝试对DNS相关的文档以及配置进行详细的说明,并对其他相关的技术方案给予指导,希望成为目前ATS对DNS系统配置的一个实用指南。 ATS的dns使用思想 在ATS中,DNS是一个很重要的模块。我们都知道ATS是一个异步事件编程框架,而传统的DNS解析库形式的如bind等,在异步多线程事件框架下均有很大的局限性。为达成ATS的高效能,在设计之初ATS设计者就考虑到将DNS的解析、缓存做成一个基础的核心模块,并且充分考虑到极大集群模式下的工作方式。同时,由于ATS面向的用户域名规模、复杂度都是很大的,ATS系统设计者推荐使用合理的DNS系统来进行回源管理控制,如remap或parent的控制等。从而与其他基于hostname、domain的控制机制连成整体。 ATS对DNS系统依赖有多重呢?简单的说,如果没有个合理的DNS系统配合,ATS可能都没法工作。 ATS的dns配置项目 要了解ATS的DNS系统,我们首先需要了解ATS的DNS主要功能,ATS的DNS系统,在核心里被切分为两部分,分别是dns解析部分和dns缓存部分。在dns解析部分,又派生出了SplitDNS这样一个单独的功能,对SplitDNS的使用,我们通过独立的文档予以说明,本文仅予概要介绍。 resolver解析 ATS的解析服务,可以看作是类似bind实现的libresolver功能,通常的配置涉及到超时时间、重试次数、以及SplitDNS特殊功能等。 参数 参数类型 默认值 生效模式 格式 proxy.config.dns.lookup_timeout RECD_INT 20 RECU_DYNAMIC proxy.config.dns.retries RECD_INT 5 RECU_DYNAMIC [0-9] proxy.config.dns.search_default_domains RECD_INT 0 RECU_DYNAMIC [0-1] proxy.config.dns.failover_number RECD_INT 5 RECU_DYNAMIC proxy.config.dns.failover_period RECD_INT 60 RECU_DYNAMIC proxy.config.dns.max_dns_in_flight RECD_INT 2048 RECU_DYNAMIC proxy.config.dns.validate_query_name RECD_INT 0 RECU_DYNAMIC [0-1] proxy.

Prefetch,一个神奇的功能

引子 Prefetch是一个ATS代码里有,管理文档里没有说,也没有其他任何官方说明的功能。当然,这是一个非常强大的隐藏的功能,不然我们也不去管它了。这里我将会介绍这个功能的主要设计思想,以及如何使用,并且介绍后续的开发与优化路线图,希望可以帮助大家理解ATS的强大与系统化设计思想,帮助大家掌握ATS的使用、二次开发,创造更大的价值。 背景 我们假设有这么个网络环境,这个网络环境的延迟很大很大,比如比中美之间的延迟还大,并且网络的效率也不高,还会有丢包,并且带宽成本还很高,你希望优化用户的感受,并且极致的压缩带宽开销,你可以用ATS做什么样的工作呢? 设计 ATS的开发者在这个场景下,首先想到了是如何改善网络延迟带来的不爽: 首先,网络上的延迟在应用层面已经是无解的了,ATS并没有做到tcp协议优化层面来,而是独辟蹊径,在服务器端通过解析用户请求的html内容,提前预知用户可能请求的资源文件的方式,来预取后续用户端可能需要的资源,这样等用户端解析完html内容,对ATS发起请求的时候,ATS已经开始预取了很多内容,并且甚至已经递归到了后面好几层的网页资源了。用户端浏览器多数请求的资源都会已经缓存在cache里或者正在回源取的过程里了,如果正在回源的内容,又可以配合rww的回源合并功能避免重复回源,从而获得良好的用户端感受。 然后,聪明的开发者又想到了如何压缩传输中的数据以减少数据传输量,提高传输效率。ATS在这种情况下,一般会在网络的两端分别部署,这样的话,中间网络就是一个管道,管道上传输的资源可以进一步压缩,甚至在进入管道前,可以对资源做更进一步的压缩,可能的方向包括但不限于: 压缩html内容,采用更高级的压缩比压缩 压缩jss css文件,采用minify这种类似的压缩技术 压缩图片文件,使用图片处理库做进一步的尺寸、压缩比例调整以减少图片字节大小 是啊,我们的资源既然已经先于用户开始从源服务器下载了,抢先出来的时间,自然可以干点什么更有意义的事情啦,比如这里比较耗时的压缩、再压缩等。哎,你永远也不知道还有多少空间可以压榨的,干脆交给用户来搞吧,于是有了Prefetch相关的一堆API。 原理 Prefetch的原理很单纯,简单的原理就是,接收到了客户请求的返回html后,分析其中的页面元素、下层链接,提取出来后,逐个从本机发起一个对本机代理端口的一个请求,形成一个ATS抢跑客户端请求预先加载的结果,为了控制,这个功能里可以配置谁来触发这个功能、以及要分析提取的tag等等。 如何使用呢? 我们在前面已经把Prefetch的前因后果交代出来了,现在来看看如何启用Prefetch功能。 Prefetch可以说是一个实现在核心中的业务功能,是基于Scheduled Update功能核心模块做出来的,作为核心一部分就会使用核心的配置管理方法: records.config: records.config中的配置项不多,关键的也就是前三个,其中需要改的,也就是第一个prefetch_enabled这个选项,buffer相关的就是得根据业务情况来调整了。 proxy.config.prefetch.prefetch_enabled 控制是否启用Prefetch功能 proxy.config.prefetch.child_port 指定Prefetch的发起端口用哪个 proxy.config.prefetch.config_file proxy.config.prefetch.url_buffer_size proxy.config.prefetch.url_buffer_timeout proxy.config.prefetch.keepalive_timeout proxy.config.prefetch.push_cached_objects proxy.config.prefetch.default_url_proto proxy.config.prefetch.default_data_proto proxy.config.prefetch.max_object_size proxy.config.prefetch.max_recursion proxy.config.prefetch.redirection prefetch.config: Prefetch.config是一个简单的配置文件,主要控制对那些客户端启用Prefetch功能,对哪些html标签如何提取资源URL两个方面: 如何控制对哪些客户端启用Prefetch功能,目前采用的是一个简单模式,定一个IP地址段,如果客户端IP地址在这个范围内,我们就会对它启用Preftch功能: prefetch_children 10.0.0.0 - 10.255.255.255, 216.1.2.3 对哪些html标签如何提取资源URL?这里的格式比较复杂,又分为简单格式和复杂格式 简单格式为: html_tag tag attr,例子:html_tag img src定义了取<img height=10 width=10 src="http://www.example.com/images/1.gif"/>中的src里的URL为需要递归的资源。 复杂格式: html_tag tag attr filter_attr filter_value,例子:html_tag link href rel stylesheet定义了取<link rel="stylesheet" type="text/css" href="example.

ATS插件开发基础

ATS插件开发需要提前了解ATS的插件的一些设计思想,以及系统提供的一些不同方向。我们将会介绍ATS的基础开发知识,以利于后续的插件开发课程讲解。 ATS的SDK文档,是了解ATS的核心设计、接口设计的很重要资料,甚至是老的PDF版本文档,都是非常非常有用的资料。以至于我经常建议完全不了解ATS核心代码的初学者也好好看看SDK文档,这里讲的很多基础知识,有利于对核心的深入理解。ATS的API以及核心插件接口设计是一个很庞大的工程,其设计思想我们很难一下消化掉,这里点出一些知识点供大家参考。如有纰漏、谬误之处,以SDK文档、代码注释、代码为准。 官方SDK文档 历史的SDK PDF文件 下一篇:手把手教你写plugin ATS开发环境 名词解释 HTTP Transaction HTTP Transaction 是ATS特指http的处理流程,在ATS中,一个HTTP的请求的处理过程,叫做一个HTTP Transaction。ATS的很多API是以Transaction为核心的函数处理过程,也就赋予了这个过程以特殊的意义。在相关的API函数中,TSHttpTxn数据结构,以及以TSHttpTxn开头的API函数都是围绕这个处理流程来的。 HTTP SM HTTP SM 是一般是指ATS的主流程状态机,在ATS中,处理的流程是通过HTTP Transaction中的函数处理的,而状态数据是存储在HTTP SM中的。ATS核心主流程就是HTTP Transaction和HTTP SM的交互过程。 HTTP session HTTP session是指http会话,一般指一个请求交互过程,特指如客户端的一个请求,回源的一个请求,分别对应客户端和服务器端HTTP session。对照HTTP Transaction,我们对应的ATS一个用户请求引起的ATS HTTP Transaction,可以包含一个客户端 HTTP Session,0个或1个甚至多个回源 HTTP Session。 remap remap是ATS做URL rewrite的方式,也是ATS在配置文件设计方面的特殊部分。从功能上来讲,ATS的remap更像一个精简版本的Apache Httpd的rewrite模块。remap之所以重要,是因为它定义了一个很方便的API入口,我们可以通过remap系统,编写remap插件。 基础知识: - Continuation Continuation,从学术上应该是叫做Continuation的编程模型(方法),这个技术相当古老,后来微软围绕这个方案,改进出了coroutine的编程模型(方法),一定程度上来讲Continuation是整个异步回调机制的多线程事件编程基础。对应ATS中,Continuation是一个最最基础的抽象结构,后续的所有高级结构,如Action Event VC等都封装Continuation数据结构,我们先看Continuation结构的实际代码: class Continuation: private force_VFPT_to_top { public: ContinuationHandler handler; Ptr<proxymutex> mutex; LINK(Continuation, link); int handleEvent(int event = CONTINUATION_EVENT_NONE, void *data = 0) { return (this->*handler) (event, data); } Continuation(ProxyMutex * amutex = NULL); }; Continuation主要包含:

ATS程序功能和使用方法详解

Apache Traffic Server的程序文件,与传统的服务器系统有大不同,这里我们将会对这些文件进行详细的解读,并尽可能的对程序的功能和基本用法、参数等进一步说明,以利于新入门的同学们快速上手。 本文中,我们以Fedora系统的安装结构进行解释,其他系统请参考《ATS安装大全》中介绍的路径(闹补)做变换。 ATS程序综述 ATS是一个服务器系统,相比多数服务器设计的单一程序设计,ATS设计的较为复杂,主要服务器程序可以分为: 代理服务器代 理服务器是ATS业务服务器,负载http代理和缓存职能 管理服务器 管理服务器包括两部分,分别是server系统管理和服务器控制 独立日志服务器 专用的日志收集、中转服务器 另外ATS还附带了其他工具程序: 日志查看、分析工具 系统配置管理工具 模块开发配套工具 性能测试工具 典型的ATS安装会包括如下程序,我们将会按照上述的分类对他们进行介绍: traffic_cop traffic_line traffic_logcat traffic_logstats traffic_manager traffic_sac traffic_server traffic_shell trafficserver tstop tsxs ATS主要服务器程序 traffic_server traffic_manager traffic_cop traffic_sac是ATS的主要服务器程序,是我们日常最常用到的服务器,我们将对他们的功能和使用进行详解的讲解 代理服务器 traffic_server traffic_server是ATS的业务处理服务器,也是最ATS中最复杂的主程序,这个程序可以单独运行,也可以在traffic_manager管理下运行,主要包括服务器、回归测试、初始化cache系统三大功能块,默认功能是服务器。下面是traffic_server可以接受的命令行参数: Usage: ./traffic_server [--SWITCH [ARG]] switch__________________type__default___description -l, --lock_memory int 0 Lock process in memory (must be root) -n, --net_threads int 8 Number of Net Threads -Z, --cluster_threads int 1 Number of Cluster Threads -U, --udp_threads int 0 Number of UDP Threads -a, --accept_thread tog false Use an Accept Thread -b, --accept_till_done tog true Accept Till Done -p, --httpport str (null) Port descriptor for HTTP Accept -P, --cluster_port int 0 Cluster Port Number -o, --dprintf_level int 0 Debug output level -V, --version tog false Print Version String -R, --regression int 0 Regression Level (quick:1.

如何计算ATS内存占用量

首先 ATS 内存占用大概分这么几部分 - 程序本身占用 - 硬盘索引 - 硬盘内容在内存中的cache - 处理请求所占用的内存 前3项是固定的基本不变,4项根据流量和内容增大,一般来说控制前3项不超过总内存容量的1/2是最好的(针对大流量,如果你流量不2/3或者3/4都可以) ATS 本身大概占用100MB左右(不包含插件) 硬盘索引(磁盘大小 / min_average_object_size) * 10 min_average_object_size 在 records.config 可以设置 # This controls how many objects (average) the disk caches can hold, and # how much memory it’ll consume for the directory structure. CONFIG proxy.config.cache.min_average_object_size INT 8000 3T硬盘 (3000592433152 / 8000)*10=3750740541.44=3662832.56k=3576.984921875Mb ~3.6G 尽量设置此值和你的业务最佳匹配 硬盘的内存cache 这个在records.config里进行设置,这个设置不是启动后立刻分配内存的,而是随着使用而慢慢占用的 我这里设置的是定置,我不喜欢自己不能掌握的感觉 # default the ram cache size to AUTO_SIZE (-1) based on cache size # (approximately 10 MB of RAM cache per GB of disk cache) # alternatively, set to a fixed value such as 21474836480 (20GB) # 1073741824 (1G) CONFIG proxy.

ats 3.2 几个要注意的参数

需要改LRU算法到1,标准lru算法,默认的clfus算法会引起更多的问题。 CONFIG proxy.config.cache.ram_cache.algorithm INT 1 在配置ram内存的时候,最好配置的稍微保守一些(1⁄2 或1/3 物理内存)。 CONFIG proxy.config.cache.ram_cache.size INT Value server session要使用global的,默认是thread pool,某些流程容易出问题(设置为1)。 CONFIG proxy.config.http.share_server_sessions INT 1 不同浏览器会发送不同版本的gzip请求头,ae_gzip 可以过滤大量无规律的 Accept-Encoding: 头信息,防止多个gzip 副本的产生,造成cache空间浪费。 CONFIG proxy.config.http.normalize_ae_gzip INT 1