前言
上篇介绍了如何构建安装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带来了处理性能的提升。