存档

‘kernel’ 分类的存档

introduction to linux kernel tcp/ip procotol stack

2011年1月28日 没有评论

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

本文链接地址: introduction to linux kernel tcp/ip procotol stack

今天给公司同事做的分享.

Share
分类: kernel 标签: ,

linux kernel 网络协议栈之xps特性详解

2010年12月12日 4 条评论

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

本文链接地址: linux kernel 网络协议栈之xps特性详解

xps全称是Transmit Packet Steering,是rfs/rps的作者Tom Herbert提交的又一个patch,预计会在2.6.37进入内核。

这个patch主要是针对多队列的网卡发送时的优化,当发送一个数据包的时候,它会根据cpu来选择对应的队列,而这个cpu map可以通过sysctl来设置:

/sys/class/net/eth<n>/queues/tx-<n>/xps_cpus

这里xps_cpus是一个cpu掩码,表示当前队列对应的cpu。

而xps主要就是提高多对列下的数据包发送吞吐量,具体来说就是提高了发送的局部性。按照作者的benchmark,能够提高20%.

阅读全文…

Share
分类: kernel 标签: , ,

linux kernel 网络协议栈之GRO(Generic receive offload)

2010年11月26日 没有评论

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

本文链接地址: linux kernel 网络协议栈之GRO(Generic receive offload)

GRO(Generic receive offload)在内核2.6.29之后合并进去的,作者是一个华裔Herbert Xu ,GRO的简介可以看这里:
http://lwn.net/Articles/358910/

先来描述一下GRO的作用,GRO是针对网络接受包的处理的,并且只是针对NAPI类型的驱动,因此如果要支持GRO,不仅要内核支持,而且驱动也必须调用相应的借口,用ethtool -K gro on来设置,如果报错就说明网卡驱动本身就不支持GRO。

GRO类似tso,可是tso只支持发送数据包,这样你tcp层大的段会在网卡被切包,然后再传递给对端,而如果没有gro,则小的段会被一个个送到协议栈,有了gro之后,就会在接收端做一个反向的操作(想对于tso).也就是将tso切好的数据包组合成大包再传递给协议栈。

如果实现了GRO支持的驱动是这样子处理数据的,在NAPI的回调poll方法中读取数据包,然后调用GRO的接口napi_gro_receive或者napi_gro_frags来将数据包feed进协议栈。而具体GRO的工作就是在这两个函数中进行的,他们最终都会调用__napi_gro_receive。下面就是napi_gro_receive,它最终会调用napi_skb_finish以及__napi_gro_receive。
阅读全文…

Share
分类: kernel 标签: , ,

linux kernel tcp拥塞处理之cubic算法

2010年11月19日 没有评论

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

本文链接地址: linux kernel tcp拥塞处理之cubic算法

接上一篇(可以看我协议栈分析的那个pdf).这里我的内核版本是2.6.36.

这次主要来看一下内核拥塞控制算法cubic的实现,在linux kernel中实现了很多种拥塞控制算法,不过新的内核(2.6.19之后)默认是cubic(想得到当前内核使用的拥塞控制算法可以察看/proc/sys/net/ipv4/tcp_congestion_control这个值).下面是最新的redhat 6的拥塞控制算法(rh5还是bic算法):

[root@rhel6 ~]# cat /proc/sys/net/ipv4/tcp_congestion_control 
cubic

这个算法的paper在这里:
http://netsrv.csc.ncsu.edu/export/cubic_a_new_tcp_2008.pdf
阅读全文…

Share
分类: kernel 标签: , ,

linux kernel中如何保证append写的原子性

2010年11月2日 1 条评论

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

本文链接地址: linux kernel中如何保证append写的原子性

先来描述一下,write系统调用的大体流程,首先内核会取得对应的文件偏移,然后调用vfs的write操作,而在vfs层的write操作的时候会调用对应文件系统的write方法,而在对应文件系统的write方法中aio_write方法,最终会调用底层驱动。这里有一个需要注意的就是内核在写文件的时候会加一把锁(有些设备不会加锁,比如块设备以及裸设备).这样也就是说一个文件只可能同时只有一个进程在写。而且快设备是不支持append写的。

而这里append的原子操作的实现很简单,由于每次写文件只可能是一个进程操作(计算文件偏移并不包含在锁里面),而append操作是每次写到末尾(其他类型的写是先取得pos才进入临界区,而这个时间内有可能pos已经被其他进程改变,而append的pos的计算是包含在锁里面的),因此自然append就是原子的了.
阅读全文…

Share
分类: kernel 标签: , ,

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 标签: , , ,

mac下编译linux kernel

2010年8月28日 1 条评论

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

本文链接地址: mac下编译linux kernel

这里我的gcc是4.5.1 binutils 是2.20.1 ,内核是2.6.35.3.
首先需要交叉编译gcc和binutils
port安装 gcc编译依赖的库gpm,mpfr和mpc.

然后开始编译gcc,这里有个要注意的就是需要指定gmp的include和lib路径,下面是我的config:
阅读全文…

Share
分类: kernel, mac 标签: ,

linux内核的tcp/ip协议栈分析

2010年8月9日 10 条评论

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

本文链接地址: linux内核的tcp/ip协议栈分析

由于协议栈的分析大部分都是放在以前的blog,可是由于导入太麻烦,所以我做了个电子书,然后上传到google doc上,欢迎大家下载:

下载

Share
分类: kernel 标签: ,