高性能server
文章平均质量分 89
aweth0me
这个作者很懒,什么都没留下…
展开
-
缓存服务器设计与实现(六)
本文讲缓存中的内容管理--文件的删除。原创 2016-01-05 15:40:07 · 4947 阅读 · 0 评论 -
关于nginx中upstream机制的思考
网上搜过upstream相关分析的同学可能都已经有了大概的了解了,而且很多大牛分析的也很棒,我这里为什么还要多说几句呢?一来是总结自己的一些理解,二来是对前辈分析的一些补充,希望能带给大家更多启发。先给出阿里技术牛们的总结和分析,供大家参考:http://tengine.taobao.org/book/chapter_05.htmlhttp://www.pagefault.info原创 2013-01-22 22:36:09 · 9405 阅读 · 3 评论 -
关于ngx_epoll_add_event的一些解释
static ngx_int_tngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags){ int op; uint32_t events, prev; ngx_event_t *e; ngx_conne原创 2013-06-12 21:16:17 · 7133 阅读 · 1 评论 -
关于ngx_trylock_accept_mutex的一些解释
关于nginx里面accept互斥锁的处理,群里讨论了很多次,很多人都提出了各种问题,比如问到:在ngx_process_events_and_timers中,为什么在释放ngx_accept_mutex之后,不把ngx_accept_mutex_held清零?if (ngx_accept_mutex_held) { ngx_shmtx_unlock(&ngx_accept_mutex原创 2013-06-12 21:57:58 · 5681 阅读 · 1 评论 -
nginx中hash表的设计与实现
在nginx中使用的hash中一个非常核心的函数就是ngx_hash_init,由于nginx这个hash表是静态只读的,即不能在运行时动态添加新元素的,一切的结构和数据都在配置初始化的时候就已经规划完毕,所以“init”过程的优劣,对运行时查找的性能影响非常大。在正式分析之前,下面的这个连接给出了一个非常详细的hash结构的整体布局,对理解代码帮助会很大,一定要仔细看一下。http:原创 2012-07-31 23:36:48 · 5381 阅读 · 0 评论 -
nginx 请求server与location配置定位
首先先看一个图:上图是nginx listen端口配置形成一个结构图,有几点需要提醒一下:1. 每个端口会有一个ngx_http_port_t结构,相同端口配置会ngx_http_conf_addr_t结构存放到addrs变量中。2. 并不是所有相同端口都要创建ngx_http_conf_addr_t,当出现listen addr:p原创 2012-02-14 15:54:27 · 6322 阅读 · 2 评论 -
Nginx配置文件解析之三
1. ngx_http_core_location(ngx_conf_t*cf, ngx_command_t *cmd, void *dummy)通过前面的分析,location部分的解析跟http和server是同样的道理。 来看下面两句:clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];clcf->loc_c原创 2011-11-10 09:42:54 · 2469 阅读 · 1 评论 -
一个类型转换引起的Bug
最近有个bug实在让人抓狂,仅仅是由于一个简单的类型强转导致的,这里给大家讲讲。这是pwrite系统调用的接口说明,我们关注最后一个参数:ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);我们有个接口实现是:int storage_write_meta_info(int fd, voi原创 2013-03-27 17:52:22 · 4371 阅读 · 1 评论 -
nginx缓存过期管理小结
先看一个经典的配置,注意红色部分:proxy_cache_path /cache levels=1:2 keys_zone=cache_pool:512minactive=1m max_size=10g;location ~ .*\.(jpg|gif|png)${ proxy_next_upstream http_502 http_504 error timeout in原创 2013-03-25 22:05:09 · 10908 阅读 · 0 评论 -
缓存服务器设计与实现(四)
这里我们聚焦一个问题,就是缓存满的情况。一般的cache都会配置容量,无论是内存缓存还是磁盘缓存,都不能无节制的去使用他们。这里以磁盘缓存为例,如果配置的限额已用完,该如何处理呢? 对于nginx,如果你开启了cache功能,那么你通过ps命令看到这样的进程:cache manager process。其实这个进程的作用主要是在文件失效或者磁盘空间不足的时候,删除原创 2013-02-19 17:41:16 · 4312 阅读 · 0 评论 -
nginx中rewrite模块break和last原理详解
在使用nginx重写(即rewrite)机制时,大家一般会用到last和break,关于这两个指令的作用,网友问的挺多,网上的讨论也挺多,这里做个总结:网友的给力解释:last: 重新将rewrite后的地址在server标签中执行break: 将rewrite后的地址在当前location标签中执行nginx官方解释:last: stops proc原创 2012-04-18 23:46:20 · 21901 阅读 · 1 评论 -
关于异步,同步,阻塞与非阻塞
如果你想吃一份宫保鸡丁盖饭:同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊!同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊!异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。上面的比喻给出一个形象的感觉,这里有一段关于Reactor和Pro原创 2013-07-12 15:59:26 · 7850 阅读 · 2 评论 -
nginx http处理过程分析之细节
在之前的综述中提到过两篇不错的博客,对nginx的http的处理过程分析的很到位,这里还有一些细节需要拿出来跟大家分享一下。题外话: “在认真思考过每一行代码之前,不要说真正理解了它!” ---(这是我说的,大家觉得搞笑就来喷我吧。-_-!) 这句话实际上是在告诉我们,隐藏在一份代码中的诸多细节,是需要你去仔细翻阅的,许多地方并不是你想当然那样子原创 2012-02-09 10:27:18 · 4330 阅读 · 2 评论 -
缓存服务器设计与实现(七)
本文讲缓存中的内容管理–-目录的删除原创 2016-01-05 15:42:15 · 3292 阅读 · 1 评论 -
腾讯协程库libco的原理分析
我们以example_echosvr.cpp为例子,这个例子的作用就是读取客户端的请求,然后按原样返回给客户端。在它的main函数里创建了proccnt进程,每个进程里有cnt个task。这里的proccnt和cnt都是来自运行参数。for(int i = 0; i < cnt; i++) { task_t * task = (task_t*)calloc( 1,sizeof(task_t)原创 2015-09-23 10:17:43 · 20077 阅读 · 5 评论 -
leveldb设计分析之memtable
在Leveldb中,所有内存中的KV数据都存储在Memtable中,物理disk则存储在SSTable中。在系统运行过程中,如果Memtable中的数据占用内存到达指定值(Options.write_buffer_size),则Leveldb就自动将Memtable转换为Memtable,并自动生成新的Memtable。在leveldb中存在的5种keyParsedInternalKeyIntern原创 2015-09-23 13:54:53 · 4698 阅读 · 1 评论 -
leveldb设计分析之log
在leveldb中log的意义是什么? 所有的写操作都必须先成功的append到操作日志中,然后再更新内存memtable。这样做有两个有点: 1可以将随机的写IO变成append,极大的提高写磁盘速度; 2防止在节点down机导致内存数据丢失,造成数据丢失,这对系统来说是个灾难。log的结构+-------------+-------------+-------------+--原创 2015-09-25 10:49:41 · 4654 阅读 · 0 评论 -
关于MP4视频拖动的原理与分析(一)
本来想说说关于mp4和一些常见视频文件格式方面的历史。现在想想没啥必要,毕竟本文是在讲关于mp4点播拖动方面的技术细节。绪论,前言神马的显得有点多余。说起MP4,不得不提“Digital container format”的概念。维基百科给出解释: A container or wrapper format is a metafile format whose specification des原创 2015-07-22 17:46:51 · 14348 阅读 · 3 评论 -
缓存服务器设计与实现(番外篇)
这个系列又更新了。今天谈一个问题,目前cache软件在业界的使用现状。cache系统其实最大的使用场景,还是主要集中在CDN厂商里。大概在2010年之前,各大CDN厂商基本清一色的使用squid。那时候的squid是绝对的主力。squid的作为cache领域的鼻祖,正是由于历史的久远,很多近10年左右流行起来的很多系统特性,它本身并不支持。比如sendfile,splice和多核等方面的支持,由于这原创 2015-06-14 22:01:06 · 4510 阅读 · 0 评论 -
缓存服务器设计与实现(五)
上次讲到lru与缓存重建,这次主要讲一下关于过期处理的一些主要问题。在讨论这个问题之前,有个相关的问题需要大家有所了解。就是对于一个缓存如期只来说,什么东西应该缓存,什么不应该缓存。这是一个比较复杂的问题,涉及到http协议的诸多细节。这里赵永明大哥写了一篇文章,讲得很详细,虽然是以ATS为背景讲的,但是思路是想通的,大家可以点击这里去看一下,文章名字很骚气叫“to cache or not to原创 2014-10-10 17:59:57 · 4607 阅读 · 2 评论 -
再谈nginx变量(一)
这里以ngx_http_script_compile为线索,看一下nginx的变量原理中还有哪些值得挖掘的地方。ngx_http_script_compile函数被调用,一般都是用来处理变量的,特别是在配置处理阶段,出现变量的时候(即"$"开头的配置),一般都会使用这个函数来做处理,生成所谓的“运行时处理机“。在函数的开始,有个ngx_http_script_init_arrays函数,从字面原创 2012-04-26 21:22:45 · 6320 阅读 · 2 评论 -
代理服务器中的内容防拷贝技术
代理服务器,广义上包括正向反向代理,httpcache等等,他们都要处理一个问题,就是从上游取得数据让后发往下游。这块有许多细节要处理,特别是如何避免内容的多次拷贝。nginx在这方面做得很不错,我们拿它来分析下,希望能学到一些东西。原创 2013-08-08 22:45:48 · 6406 阅读 · 0 评论 -
缓存服务器设计与实现(三)
这里我们讨论一个比较重要功能,在之前的文章中提到过,取源合并。为什么要单独把它拿出来讨论呢?其实主要是出于个人工作的角度。之前公司里的cache需要这样一个功能,现有的squid该功能不完善,并且也不太适合我们的业务。然后我们分别在cache和nginx上加了这个功能,不过现在的nginx版本已经原生支持了。呵呵,您也许不知道我们的nginx可是0.7.x的版本,我们当时开发的时候还在想,也许不久原创 2013-02-16 17:59:01 · 4489 阅读 · 6 评论 -
困扰nginx初学者的两个小问题
通过在群里大家的讨论,我总结了两点问题,很多初学者都问过:1. ngixn事件处理中关于active和ready的问题2. ngx_connection_t与ngx_http_connection_t结构的区别与联系这里分开讨论下。1. ngixn事件处理中关于active和ready的问题 这俩成员何时为0,何时又被置1,把很多人搞迷糊了。其实从ngin原创 2013-02-05 10:07:17 · 4568 阅读 · 0 评论 -
nginx keepalive连接回收机制
我在nginx 1.0.12代码中发现了名为ngx_reusable_connection的函数(它是在哪个版本里被加上的就不去追究了),很好奇这个函数是做什么的。后来有一次在我的群里讨论nginx的时候,有人发现了一个奇怪的现象,这位同学报告说:并发量大的时候,一些keepalive的连接会被新连接给挤掉。。。 关于这个问题,切入点在ngx_get_connection,并原创 2012-03-05 18:03:14 · 7345 阅读 · 1 评论 -
nginx http处理过程分析之综述
综述 为了节省大家时间和提高效率,这里给出两篇非常不错的文章,出自同一人(应该是雕梁)之手: 1. nginx接受连接,请求处理的前置工作处理 http://www.pagefault.info/?p=205 2. 正式进行request请求处理 http://simohayha.iteye.com/blo原创 2012-01-12 18:08:32 · 4144 阅读 · 2 评论 -
nginx事件模型小结
大家看到这篇文章可能会感觉很失望,居然没什么内容。。。写这篇的目的是给出一些我认为比较好的文章,做一下补充和概括。这里不写重复的内容,只是转发一下连接供大家参考。1. http://www.tbdata.org/archives/1214 这是淘宝yixiao的分析文章,这篇给出了nginx事件抽象模型的基础构建,为事件循环的正是运作打基础。2.原创 2011-12-29 17:46:28 · 3419 阅读 · 0 评论 -
Nginx配置文件解析之二
这一部分,我们看看nginx怎样来组织http block,server block和location location的。 1、 ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)首先设置一个ngx_http_conf_ctx_t结构,即ctx。typedef struct { void原创 2011-11-01 18:28:31 · 2309 阅读 · 0 评论 -
Nginx配置文件解析之一
现在针对nginx源码分析的blog和文章已经很多了,之前我也看过不少,大家的分析都很不错。太多重复的内容就不写了,主要想针对在我分析代码和查阅blog的过程中,发现的一些比较晦涩或者某些细节有待展开讨论的地方,给出我的自己理解和看法,希望跟大家交流和学习。使用的nginx版本是nginx-1.0.6,我最开始看的代码是0.7.62,新的版本在功能和稳定性上做了很多的工作。 在原创 2011-10-24 00:20:41 · 4391 阅读 · 1 评论 -
nginx 多进程模型之总览
这里先介绍两位淘宝兄弟的博客: 雕梁:1. nginx的进程模型http://simohayha.iteye.com/blog/467940 yixiao:1. Nginx的master和worker进程间的通信http://www.tbdata.org/archives/12082. Nginx进程管理之master进程htt原创 2011-12-29 18:07:29 · 6727 阅读 · 0 评论 -
nginx多进程模型之热代码平滑升级
平滑升级的主要过程包括一下步骤: 1. 新代码make执行完后,这里不用在make install 了,接下来重名/sbin/nginx为nginx.old# mv /usr/local/nginx/sbin/nginx/usr/local/nginx/sbin/nginx.old 2. 复制编译后objs目录下的nginx文件到nginx的安装目录sbin/下# cp o原创 2012-01-10 21:53:06 · 6546 阅读 · 0 评论 -
nginx多进程模型之配置热加载
前言: 服务器程序通常都会通过相应的配置文件来控制服务器的工作。很多情况下,配置文件会经常地被修改,在使其生效时,我们都希望不重启程序,不影响服务器的正常服务。所以所谓的配置文件”热加载”就成了一项非常重要的功能,而这方面,nginx给我们树立了非常好的榜样,值得我们去学习和借鉴。 分析: 在nginx正常服务时,我们在nginx的程序程序目录执行./ngi原创 2012-01-04 21:22:49 · 6407 阅读 · 0 评论 -
nginx脚本引擎与变量设计(四)
前面的几篇文章,从一个情景来大体上呈现出了nginx在变量设计上面的技巧和机制,但是这远远没有覆盖全部的内容,后面我会再找一些情景来进一步的分析补充。在这方面的研究领域,我不得不提一个人,agentzh(中文名叫章亦春)。agentzh在国内nginx研究领域可以算的上首屈一指了,特别推荐大家看一下他在sina博客上,讲nginx变量的文章,名叫“nginx变量漫谈”,虽然里面极少涉及代码,但原创 2011-12-28 16:24:46 · 2023 阅读 · 0 评论 -
nginx脚本引擎与变量设计(二)
继续上一篇的分析,下面我们将主要谈论set和rewrite两行的解析处理。为了方便分析,这里把示例配置和调用图列出来location / { if ($uri ~* "(.*).html$" ) { set $file $1; rewrite ^(.*)$ http://$http_host$file.mp4 break; }原创 2011-12-12 23:22:29 · 3227 阅读 · 0 评论 -
关于nginx配置解析中merge操作的探讨
我们先来看看http module的类型的结构体:typedef struct { ngx_int_t (*preconfiguration)(ngx_conf_t *cf); ngx_int_t (*postconfiguration)(ngx_conf_t *cf); void *(*create_main_conf)(ngx_conf原创 2012-04-12 14:47:07 · 5669 阅读 · 1 评论 -
缓存服务器设计与实现(二)
我们现在讨论算是最简单的情景,即服务器还没有文件缓存,第一个需要缓存的请求的处理过程。当然需要关注的情景有很多,一个一个来吧。 在缓存服务器设计与实现(一)中讨论的都是一些准备工作,我们接下来要关注从后端机器取回数据以后进行缓存的情景。首先来探讨一个问题,以nginx为例,它是在取后端数据之前就创建了缓存对象,那么从整个系统的角度来看,创建缓存对象的过程包括在内存中建立原创 2013-02-05 09:39:52 · 5794 阅读 · 0 评论 -
缓存服务器设计与实现(一)
这里我们nginx的cache系统为线索,来探讨一个缓存服务器的设计和相关细节,我尽量站在设计和框架的角度来分析,限于篇幅这里不再去撸代码了,相关的细节,欢迎大家一起参与讨论。 一个cache服务器中从后端取得文件之后,要么直接发送给客户端(学名叫透传),要么缓存在本地,后续相同的请求访问到cache服务器时,就可以直接拿本地的拷贝来用了,如果可以用的话。如果本地缓存的文件被原创 2013-01-23 17:56:00 · 6830 阅读 · 2 评论 -
从nginx角度看服务器多进程模型设计(一)
多进程你可能很熟悉,也许有一套自己的使用习惯和方法。这东西没有什么权威建议,书上只是给出了基本知识点,至于具体怎么去用,因人而异。nginx在多进程设计方面有很多值得学习和借鉴的东西,我认为是一套比较好的实现方案。你也许认为这东西很简单,是老生常谈的东西了,但是我这里要提醒你一下,俗话道酒是陈的香,越经典的东西越值得去琢磨,不要对自己太自信。善于思考的家伙总是会在一些老的技术上给你许多新鲜的见解,原创 2012-06-05 16:25:54 · 3083 阅读 · 1 评论 -
再谈nginx变量(二)
nginx中除了一些内建变量,自定义变量(通过set指令定义的),还有一类比较特别的变量,我称它们为特殊前缀变量,这类变量多数在内建变量数组内是找不到的,形式可以分一下几类:$http_xxx, $sent_http_xxx, $upstream_http_xxx, $cookie_xxx, $arg_xxx。其中有些常见的http_xxx和sent_http_xxx(其实主要是一些hea原创 2012-05-11 16:55:26 · 4264 阅读 · 0 评论 -
从nginx角度看服务器多进程模型设计(二)
在ngx_master_process_cycle中要处理众多的全局变量,正是通过一些信号处理函数设置这些变量,才会后面检测到一些事件的发生。我们来看看都有哪些预定义的事件,以及他们是如何被处理的。多数的事件来自于nginx的用户,他们可能终止nginx,重启,重读配置等等,这些操作则主要依赖于信号,在nginx官网,给出了比较全面的控制命令介绍,用户可以通过他们来控制nginx的行为原创 2012-06-05 16:34:20 · 2900 阅读 · 0 评论