存档

2010年10月 的存档

nginx对静态文件cache的处理

2010年10月20日 2 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: nginx对静态文件cache的处理

nginx中对静态文件进行了cache,对应的命令就是open_file_cache,open_file_cache_min_uses以及open_file_cache_valid。这次我就来分析下nginx如何对静态文件进行cache的。

要注意一个就是open_file_cache的 inactive表示文件多久不被访问就会从cache中删除.

首先来描述一下linux下是如何做的,因为这里nginx对于bsd版本有一个不同的做法,这是因为bsd中可以给kqueue监听文件改变的事件。而linux下,nginx并没有使用inotify,而是每次都会判断文件的st_ino来得到文件是否被修改,不过这样会有个缺点就是如果你是使用open,然后write来修改文件的话,文件其实是相同的,因此st_ino是相同的,此时nginx是无法知道的,因此修改的话,最好使用会先删除再覆盖的命令(比如cp)。

首先,nginx的cache只是cache句柄,因为静态文件的发送,一般来说,nginx都是尽量使用sendfile进行发送的,因此之需要cache句柄就够了。

所有的cache对象包含在两个数据结构里面,整个机制最关键的也是这两个东西,一个是红黑树,一个是一个队列,其中红黑树是为了方便查找(需要根据文件名迅速得到fd),而队列为了方便超时管理(按照读取顺序插入,在头的就是最近存取的文件),由于所有的句柄的超时时间都是一样的,因此每次只需要判断最后几个元素就够了,因为这个超时不需要那么实时.

假设现在客户端请求是GET test.html HTTP/1.1 ,则nginx是这么处理的,如果test.html在cache中存在,则从cache中取得这个句柄,然后正常返回,如果test.html不存在,则是打开这个文件,然后插入到cache中。不过这里有很多细节都需要处理,比如超时,比如红黑树的插入等等,接下来,我们就对照着代码来看这些都是如何处理的。

阅读全文…

Share
分类: nginx, server 标签: , ,

linux kernel 2.6.35中RFS特性详解

2010年10月14日 21 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: linux kernel 2.6.35中RFS特性详解

前面我介绍过google对内核协议栈的patch,RPS,它主要是为了软中断的负载均衡,这次继续来介绍google 的对RPS的增强path RFS(receive flow steering),RPS是把软中断map到对应cpu,而这个时候还会有另外的性能影响,那就是如果应用程序所在的cpu和软中断处理的cpu不是同一个,此时对于cpu cache的影响会很大。 这里要注意,在kernel 的2.6.35中 这两个patch已经加入了。

ok,先来描述下它是怎么做的,其实这个补丁很简单,想对于rps来说就是添加了一个cpu的选择,也就是说我们需要根据应用程序的cpu来选择软中断需要被处理的cpu。这里做法是当调用recvmsg的时候,应用程序的cpu会被存储在一个hash table中,而索引是根据socket的rxhash进行计算的。而这个rxhash就是RPS中计算得出的那个skb的hash值.

可是这里会有一个问题,那就是当多个线程或者进程读取相同的socket的时候,此时就会导致cpu id不停的变化,从而导致大量的OOO的数据包(这是因为cpu id变化,导致下面软中断不停的切换到不同的cpu,此时就会导致大量的乱序的包).

阅读全文…

Share
分类: kernel 标签: , , ,

linux下系统调用的实现

2010年10月9日 1 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: linux下系统调用的实现

基本的x86体系下系统调用相关的指令可以看这篇文章。

x86下,最早是使用软中断指令int 0×80来做的,不过现在内核是使用syscall和sysenter指令,只有64位下才会使用syscall,而大部分情况都是使用sysenter,这里我们主要介绍sysenter指令,不过具体实现3者现在都差不多,这是因为内核使用了VDSO来兼容所有的指令,接下来我们就要来详细的分析内核是如何实现vdso层,以及glibc库(也就是用户空间)是如何来调用vdso层的接口,从而进入内核。

阅读全文…

Share
分类: kernel 标签: , ,

linux kernel中如何得到当前的进程信息

2010年10月2日 8 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: linux kernel中如何得到当前的进程信息

我这里内核版本是2.6.35,cpu架构是x86_32.先来看linux下进程的结构。

首先我们要知道在linux中第一个进程是内核进程,pid为0,它是所有的进程的父进程。这个进程也叫swapper,或者说是idle.
阅读全文…

Share
分类: kernel 标签: , , ,