Fastsocket学习笔记之示范应用篇

Fastsocket学习笔记之示范应用篇

前言

上篇介绍了如何构建安装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: 定义进程数.
    • 默认值为当前可用CPU核心数个进程.
  • -c start_core: 指定进程绑定CPU核的开始索引值
    • 默认值为 0.
  • -o log_file: 定义日志文件名称
    • 默认值为 ./demo.log
  • -a listen_address: 指定监听地址,[ip:port]字符串组合形式,支持添加多个地址
    • 默认值为 0.0.0.0:80
  • -x backend_address: 启动代理模式,需要填写[ip:port]组合形式地址,支持多个代理地址
    • 默认不开启
  • -v: 启用详细统计数据输出
    • 默认为禁用
  • -d: 启动Debug调试模式,调试信息被写入日志文件中
    • 默认禁用
  • -k: 启用HTTP keepalive机制,当前只能够工作在服务器模式下
    • 默认被禁用

实例

在运行之前,需要注意两点:

  • 为了跑满CPU,需要确保客户端和后端服务器都不应该成为瓶颈,两种可行方案:
    • 提供足够多机器用以充当客户端和后端服务器角色
    • 或在一台机器上充当客户端和后端服务器,使用fastsocket(推荐方案,较为节省服务器)
  • 正确配置网卡,若不知道如何做,可以参考源码中script目录

服务器模式示范

服务器模式至少需要两台主机:

  • 主机A作为客户端产生HTTP请求
  • 主机B为Web服务器

设定每台主机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

  • 运行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,网络结构如下:

 +--------------------+     +--------------------+     +--------------------+
 |       Host A       |     |       Host B       |     |       Host C       |
 |                    |     |                    |     |                    |
 |    10.0.0.1/24     |     |    10.0.0.2/24     |     |     10.0.0.3/24    |
 +---------+----------+     +---------+----------+     +----------+---------+
           |                          |                           |
 +---------+--------------------------+---------------------------+---------+
 |                                 switch                                   |
 +--------------------------------------------------------------------------+

下面为具体的运行步骤:

主机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带来了处理性能的提升。

你可能感兴趣的:(Fastsocket学习笔记之示范应用篇)