上篇介绍了如何构建安装fastsocket内核模块,下面将基于fastsocket/demo/README.md
文件翻译整理而成。
嗯,下面进入翻译篇。
示范为一个简单TCP Server服务器程序,用于基准测试和剖析Liunx内核网络堆栈性能表现,当然也是为了演示Fastsocket可扩展和其性能改进。
示范应用基于epoll模型和非阻塞性IO,处理网络连接,但只有在多核的模式下才能够工作得很好:程序的每一个进程被绑定到CPU的不同核,起始于CPU core 0,各自独立处理客户端连接请求。
示范程序具有两种工作模式:
这是一个简单傻瓜形式的Tcp Server,仅仅用于测试使用,使用时要求客户端和服务器端只能够携带一个packet包大小的数据,否则程序会处理不了。
以下面方式进行构建:
cd demo && make
最简单方式以默认配置无参数形式运行:
./server
参数如下:
在运行之前,需要注意两点:
script
目录 服务器模式至少需要两台主机:
设定每台主机CPU 12核,网络大概设置如下:
+--------------------+ +--------------------+
| Host A | | Host B |
| | | |
| 10.0.0.1/24 |-----| 10.0.0.2/24 |
| | | |
+--------------------+ +--------------------+
下面是运行两台主机的步骤:
主机B:
Web服务器模式单独运行,开启12个工作进程,和CPU核心数一致:
./server -w 12 -a 10.0.0.2:80
或者测试借助于Fastsocket所带来的性能
LD_PRELOAD=../library/libfsocket.so ./server -w 12 -a 10.0.0.2:80
主机A:
ab -n 1000000 -c 100 http://10.0.0.2:80/
N=12; for i in $(seq 1 $N); do ab -n 1000000 -c 100 http://10.0.0.2:80/ > /dev/null 2>&1; done
代理模式下,需要三台机器:
设定每台机器CPU内核数12,网络结构如下:
+--------------------+ +--------------------+ +--------------------+
| Host A | | Host B | | Host C |
| | | | | |
| 10.0.0.1/24 | | 10.0.0.2/24 | | 10.0.0.3/24 |
+---------+----------+ +---------+----------+ +----------+---------+
| | |
+---------+--------------------------+---------------------------+---------+
| switch |
+--------------------------------------------------------------------------+
下面为具体的运行步骤:
主机B:
./server -w 12 -a 10.0.0.2:80 -x 10.0.0.3:80
LD_PRELOAD=../library/libsocket.so ./server -w 12 -a 10.0.0.2:80 -x 10.0.0.3:80
主机C:
./server -w 12 -a 10.0.0.3:80
主机A:
N=12; for i in $(seq 1 $N); do ab -n 1000000 -c 100 http://10.0.0.2:80/ > /dev/null 2>&1; done
以上翻译完毕,下面将是根据上面内容进行动手测试描述吧。
检查一下包含Apache ab命令的软件包:
yum provides /usr/bin/ab
可以看到类似于如下字样:
httpd-tools-2.2.15-39.el6.centos.x86_64 : Tools for use with the Apache HTTP Server
安装它就可以了
yum install httpd-tools
Windows 7专业版跑VMware Workstation 10.04虚拟机,两个Centos 6.5系统,配置一致,2G内存,8个CPU逻辑处理器核心。
客户端安装Apache ab命令测试,跑8个实例: for i in $(seq 1 8); do ab -n 10000 -c 100 http://192.168.192.16:80/ > /dev/null 2>&1; done
服务器端,分别记录:/opt/fast/server -w 8
LD_PRELOAD=../library/libfsocket.so ./server -w 8
两组数据对比:
运行方式 | 处理消耗时间(秒) | 处理总数 | 平均每秒处理数 | 最大值 |
---|---|---|---|---|
单独运行 | 34s | 80270 | 2361 | 2674 |
加载fasocket | 28s | 80399 | 2871 | 2964 |
测试方式如上,三台服务器(测试端+代理端+服务器端)配置一样。第一次代理单独启动,第二次代理预加载fastsocket方式。
运行方式 | 处理消耗时间(秒) | 处理总数 | 平均每秒处理数 | 最大值 |
---|---|---|---|---|
第一次测试后端 | 44s | 80189 | 1822 | 2150 |
第一次测试代理 | 44s | 80189 | 1822 | 2152 |
第二次测试后端 | 42s | 80051 | 1906 | 2188 |
第二次测试代理 | 42s | 80051 | 1906 | 2167 |
备注:虚拟机上数据,不代表真实服务器上数据,仅供参考。
虽然基于虚拟机,测试环境受限,但一样可以看到基于fastsocket服务器模型,处理性能有所提升:总体处理时间,每秒平均处理数,以及处理上限等。
动态链接预先加载LD_PRELOAD虽是利器,但不是万能药,LD_PRELOAD遇到下面情况会失效:
情况很复杂,小心为上。
学习并测试了fastsocket的源码示范部分,前后对比可以看到fastsocket带来了处理性能的提升。
原文:http://www.blogjava.net/yongboy/archive/2015/01/29/422550.html