Home > Linux, 工具介绍, 杂七杂八, 网络编程 > Systemtap辅助设置tcp_init_cwnd,免对操作系统打Patch

Systemtap辅助设置tcp_init_cwnd,免对操作系统打Patch

March 21st, 2011

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Systemtap辅助设置tcp_init_cwnd,免对操作系统打Patch

前段时间google的工程师提出对tcp的拥塞窗口的初始值进行增大可以显著的提高http的性能,这个主要是针对tcp的slow start的优化.
具体参考这里, 这里. 谢谢叔度同学从美国带回第一手信息!

由于低版本的linux内核的问题,这个参数的正确设置需要对os打patch,这个过程对线上机器来讲非常麻烦。 底下我用systemtap给出了个解决方案,免除这个麻烦. 我们在RHEL 5U4上作这个试验:

首先需要在开发机器上:

#安装符号信息
$uname -r
2.6.18-164.el5
$ sudo rpm -i kernel-debuginfo-common-2.6.18-164.el5.x86_64.rpm
$ sudo rpm -i kernel-debuginfo-2.6.18-164.el5.x86_64.rpm 

$ sudo yum install systemtap

$ cat > tcp_init_cwnd.stp
probe kernel.function("tcp_init_cwnd").return
{
$return = $1
}
CTRL+D

#设成7个mss
$ sudo stap -p4 -g -m initcwnd tcp_init_cwnd.stp 7 
initcwnd.ko

好了,现在我们需要的模块有了, 可以直接拷贝到目标机器去的.
#目标机器需要安装systemtap,用于运行我们的模块.

$uname -r
2.6.18-164.el5
$ sudo yum install systemtap

#在系统的启动脚本里面运行以下命令:
$ sudo staprun -o initcwnd.out -D initcwnd.ko
$ 19122 
#19122是initcwnd模块加载器在后台运行的进程号,需要的时候可以把模块停掉。

#当然如果你的模块没有输出的话也可以直接, 这样更简单
$ sudo insmod initcwnd.ko

大家碰到类似的问题,可以参考下这个思路.

玩得开心!

Post Footer automatically generated by wp-posturl plugin for wordpress.

  1. hackage
    March 21st, 2011 at 18:27 | #1

    老兄玩的很漂亮!!

  2. Gao Yang
    March 21st, 2011 at 22:07 | #2

    哎, 这个好! 这个思路好!

    Yu Feng Reply:

    谢谢大侠表扬

  3. Frank Ch. Eigler
    March 25th, 2011 at 03:14 | #3

    Hi! Thank you for the idea. A script is now included in our sample library:
    http://sourceware.org/git/?p=systemtap.git;a=blob;f=testsuite/systemtap.examples/network/tcp_init_cwnd.stp

    Yu Feng Reply:

    cool!

  4. Nightelf
    April 10th, 2012 at 16:05 | #4

    请问如果目标机器上直接“$ sudo insmod initcwnd.ko”安装的话,也许要先装systemtap吗?

    Yu Feng Reply:

    不需要安装符号的。

  5. Nightelf
    August 24th, 2012 at 20:30 | #5

    请教一个问题,我按照您这个博客的步骤操作之后(Centos 5),用ip route show命令能看到initcwnd 是10 。但是,用tcpdump抓包看到第一个ttl里面发出的包还是只有2~3个。(起了一个httpd服务,然后从远程机器wget一个文件)。而且,我试了一下3.x内核的ubuntu机器,tcpdump确实能看到在第一个ttl里有8~10个包。请问是不是别的某些网络层参数影响了调优的结果呢?多谢!

    Yu Feng Reply:

    恩,还有个地方需要改,回头我找下

    Nightelf Reply:

    多谢多谢!

  6. October 4th, 2012 at 15:31 | #6

    建议霸爷看一下lisp的defadvice机制, 不仅可以像上面那样通过hook修改某个函数的返回值,而且可以在函数的任意代码段前后加一段新的逻辑.

    绝对的大开眼界

    Yu Feng Reply:

    学习下!

Comments are closed.