前言
 上篇介绍了如何构建安装fastsocket内核模块,下面将基于fastsocket/demo/README.md文件翻译整理而成。
 嗯,下面进入翻译篇。
 介绍
 示范为一个简单TCP Server服务器程序,用于基准测试和剖析Liunx内核网络堆栈性能表现,当然也是为了演示Fastsocket可扩展和其性能改进。
 示范应用基于epoll模型和非阻塞性IO,处理网络连接,但只有在多核的模式下才能够工作得很好:程序的每一个进程被绑定到CPU的不同核,起始于CPU core 0,各自独立处理客户端连接请求。
 示范程序具有两种工作模式:
  - 服务器模式:任何请求都会直接返回HTTP 200 OK  
 - 代理模式:服务器接收到客户端请求,转发给后端服务器,同时转发后端响应给客户端。 
 
 这是一个简单傻瓜形式的Tcp Server,仅仅用于测试使用,使用时要求客户端和服务器端只能够携带一个packet包大小的数据,否则程序会处理不了。
 构建
 以下面方式进行构建:
 cd demo && make
 用法
 最简单方式以默认配置无参数形式运行:
 ./server
 参数如下:
  - -w worker_num: 定义进程数.  
 - -c start_core: 指定进程绑定CPU核的开始索引值  
 - -o log_file: 定义日志文件名称  
 - -a listen_address: 指定监听地址,[ip:port]字符串组合形式,支持添加多个地址  
 - -x backend_address: 启动代理模式,需要填写[ip:port]组合形式地址,支持多个代理地址  
 - -v: 启用详细统计数据输出  
 - -d: 启动Debug调试模式,调试信息被写入日志文件中  
 - -k: 启用HTTP keepalive机制,当前只能够工作在服务器模式下 
 
 实例
 在运行之前,需要注意两点:
  - 为了跑满CPU,需要确保客户端和后端服务器都不应该成为瓶颈,两种可行方案: 
 - 提供足够多机器用以充当客户端和后端服务器角色  
 - 或在一台机器上充当客户端和后端服务器,使用fastsocket(推荐方案,较为节省服务器) 
 
  - 正确配置网卡,若不知道如何做,可以参考源码中
script目录  
 服务器模式示范
 服务器模式至少需要两台主机:
  - 主机A作为客户端产生HTTP请求  
 - 主机B为Web服务器 
 
 设定每台主机CPU 12核,网络大概设置如下:
 +--------------------+     +--------------------+
                                    
                                              
     ...     -----    ...     
                                              
 +--------------------+     +--------------------+
下面是运行两台主机的步骤:
主机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:
- 运行Apache ab程序作为请求者
ab -n 1000000 -c 100 http://10.0.0.2:80/ 
 - 单个Apache ab程序不能够体现服务器负载能力,多个ab实例同时并发运行可能会好很多,开12个实例和CPU核心数一致: 
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  
代理模式示范
代理模式下,需要三台机器:
- 主机A作为客户端产生HTTP请求 
 - 主机B作为代理角色 
 - 主机C则需要后端服务器 
 
设定每台机器CPU内核数12,网络结构如下:
 +--------------------+     +--------------------+     +--------------------+
                                                        
                                                                       
     ...              ...               ...    
 +---------+----------+     +---------+----------+     +----------+---------+
                                                                
 +---------+--------------------------+---------------------------+---------+
                                                                     
 +--------------------------------------------------------------------------+
下面为具体的运行步骤:
主机B:
- 为代理服务器启动12个进程
./server -w 12 -a 10.0.0.2:80 -x 10.0.0.3:80 
 - 或者以Fastsocket方式启动 
LD_PRELOAD=../library/libsocket.so ./server -w 12 -a 10.0.0.2:80 -x 10.0.0.3:80  
主机C:
- 理论上任何WEB服务器都可以充当后端服务器,这里充分利用示范程序好了:
./server -w 12 -a 10.0.0.3:80  
主机A:
- 作为客户端请求生成器,同样启动12个Apache ab实例:
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命令
检查一下包含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虽是利器,但不是万能药,LD_PRELOAD遇到下面情况会失效:
- 静态链接使用gcc -static参数把libc.so.6静态链入执行程序中 
 - 设置执行文件的SUID权限,可能也会导致LD_PRELOAD失效(如:chmod 4755 daemon) 
 
情况很复杂,小心为上。
小结
学习并测试了fastsocket的源码示范部分,前后对比可以看到fastsocket带来了处理性能的提升。