Fastsocket:高扩展性的 Socket 以及 Linux 内核的底层网络实现

目录

简介

安装编译

测试结果

GitHub README

介绍

参加者

安装

从源安装

开关内核

系统配置

用法

合适的场景###

如何使用

演示服务器

评价

Nginx的

HAProxy

在线评估

新功能

联系方式


简介

https://www.oschina.net/p/linux-fastsocket

Fastsocket 是一个高扩展性的 Socket 以及 Linux 内核的底层网络实现。可以在多核机器上提供极好的性能,此外使用和维护还非常简单。目前该项目已经在新浪的生产环境中使用。该项目由清华大学和新浪网联合组成的 Fastos 团队开发,该团队的使命是提升 Linux 内核的效率。

Fastsocket 目前已经使用在新浪微博的生产环境上,主要用于提供负载均衡服务的 HAProxy,线上实际性能提升一倍,从2014年3月份稳定运行至今,预计2014年底完成负载均衡全部集群的 Fastsocket 升级。

Fastsocket 完全兼容 BSD Socket API,现有各类基于 Socket 的网络应用可以直接使用 Fastsockt。 目前经过兼容测试的常用服务软件有:HAProxy、Nginx、Lighttpd、Redis 和 Memcached。

安装编译

[root@localhost ~]# git clone https://github.com/fastos/fastsocket.git

[root@localhost ~]# cd fastsocket/kernel
[root@localhost kernel]# make defconfig
[root@localhost kernel]# make
[root@localhost kernel]# make modules_install
[root@localhost kernel]# make install

测试结果

下面是一些使用了 Fastsocket 后的性能测试结果:


GitHub README

https://github.com/fastos/fastsocket

介绍

随着一台计算机上NIC带宽和CPU内核的快速增长,可扩展的TCP网络堆栈对于性能至关重要。但是,当CPU内核数量大于4时,现有的Linux内核无法很好地扩展。当CPU内核数量超过12个时,吞吐量可能会崩溃。

Fastsocket是一种可扩展的内核TCP套接字实现,在扩展到24个CPU内核时,实现了线性的线性性能增长。同时,Fastsocket的底层内核优化对于套接字应用程序是透明的,这意味着现有应用程序可以利用Fastsocket的优势而无需更改其代码。

目前,Fastsocket是在CentOS-6.5的Linux内核(kernel-2.6.32-431.29.2.el6.x86_64)中实现的,这是redhat EL6的最新版本,因为CentOS-6.5是我们的主要生产环境系统。根据我们的评估,与基本CentOS-6.5内核相比,Fastsocket 在24核计算机上将Nginx和HAProxy的吞吐量(以每秒连接数衡量)提高了290%620%

而且,Fastsocket可以进一步利用硬件进行更多利用:

  • 使用Fastsocket,超线程可以使性能额外提高20%
  • 使用Fastsocket,如果服务器用作代理(例如HAProxy),则支持Flow-Director(例如Intel 82599)的NIC可以将吞吐量提高15%

Fastsocket(V1.0)已经部署在SINA生产环境中。Fastsocket与HAProxy一起使用以提供HTTP负载平衡服务,自2014年3月以来一直稳定运行。更多详细信息,请参阅评估

Fastsocket是在GPLv2下发布的,我们保证我们绝不会要求使用我们的代码进行任何付款。

参加者

  • Fastsocket由SINA.COM的OS团队的Linxiaofeng启动并主要开发。
  • 清华大学操作系统中心正在与SINA.COM密切合作,以进一步增强Fastsocket。
  • 英特尔在广泛的协助下也支持Fastsocket。
  • Zeuux社区正在为Fastsocket提供开源咨询。

安装

从源安装

源代码可从https://github.com/fastos/fastsocket.git获得。通过以下方式克隆存储库:

[root@localhost ~]# git clone https://github.com/fastos/fastsocket.git

这是存储库中目录的简要介绍。

  • 内核 -Fastsocket定制内核的源代码
  • module -Fastsocket内核模块的源代码
  •  -用户级库的源代码来支持Fastsocket
  • 脚本 -用于设置NIC和系统环境的脚本(Fastsocket并非必需)
  • 演示 -演示服务器的源代码,以证明Fastsocket的性能

从git下载Fastsocket存储库后,以下命令将构建并安装内核。如果您确定不会错过某些重要组件,则可以自定义配置文件。Fastsocket可以在64位CentOS-6.X系统上顺利构建。在32位系统和CentOS-7系统上可能会出现问题。

[root@localhost ~]# cd fastsocket/kernel
[root@localhost kernel]# make defconfig
[root@localhost kernel]# make
[root@localhost kernel]# make modules_install
[root@localhost kernel]# make install

输入库目录并创建库:

[root@localhost fastsocket]# cd library
[root@localhost library]# make

之后,在同一目录中创建libfsocket.so。

开关内核

安装完成后,切记修改grub文件以切换到Fastsocket内核并重新启动系统。

系统配置

使用Fastsocket引导到内核后,使用默认参数加载Fastsocket模块:

[root@localhost ~]# modprobe fastsocket

有关模块参数的更多详细信息,请参阅Module

有两种方法可以检查模块是否成功加载。

  • 检查lsmod:

      [root@localhost ~]# lsmod | grep fastsocket
      fastsocket             23145  0
    
  • 检查dmesg:

      [root@localhost ~]# dmesg | tail
      Fastsocket: Load Module
      Fastsocket: Enable Listen Spawn[Mode-2]
      Fastsocket: Enable Recieve Flow Deliver
      Fastsocket: Enable Fast Epoll
    

运行存储库的脚本目录中提供的nic.sh,以完成其余配置。

[root@localhost ~]# cd fastsocket
[root@localhost fastsocket]# scripts/nic.sh -i eth0

eth0是要使用的接口,应根据系统配置进行更改。该脚本将自动检查系统和NIC参数,然后配置各种功能。

如果您对nic.sh的工作方式感兴趣,请参阅Scripts

用法

合适的场景###

通常,满足以下条件的方案将从Fastsocket(V1.0)中受益最大:

  • 该机器具有不少于8个CPU内核。
  • CPU周期的大部分时间都花在网络softirq和与套接字相关的系统调用中。
  • 短TCP连接被大量使用。
  • 应用程序使用epoll上的非阻塞IO作为IO框架。
  • 应用程序使用多个进程来单独接受连接。

同时,我们正在开发Fastsocket,以提高更一般情况下的网络堆栈性能。您可以参考“ 新功能”

如何使用

启动应用程序时,通过预加载名为libfsocket.so的共享库来启用Fastsocket。例如,可以通过以下方式使用Fastsocket启动ngnix:

[root@localhost fastsocket]# cd library
[root@localhost library]# LD_PRELOAD=./libfsocket.so nginx

如果没有预加载的库,则应用程序可以像在原始内核上一样运行,从而在需要时提供了超快速的回滚。

[root@localhost ~]# nginx

有关库的更多信息,请参考Library

在这里,我们列出了一些可以与Fastsocket正常工作的应用程序:

  • hapoxy
  • nginx(禁用接受互斥体)
  • lighttpd

在基准测试中,我们还在负载生成器上使用了Fastsocket。这非常有用,因为Fastsocket大大增加了单台机器可能产生的最大工作负荷,从而节省了机器和操作。这些负载生成器是:

  • b
  • http_load

演示服务器

我们在存储库的demo目录中提供了一个演示服务器。演示服务器除了从网络套接字读取消息或向网络套接字写入消息外,什么也不做,仅用于研究和测试Linux内核网络堆栈的性能。演示服务器运行时,用户CPU消耗很少,这使其成为观察网络堆栈性能的理想网络应用程序。

此外,它还用于演示Fastsocket在基本Linux内核上的可伸缩性和性能改进。

有关演示服务器的更多信息,请参阅Demo

评价

Nginx的

一些重要的配置:

  • Worker号设置为CPU内核数。
  • Nginx上的HTTP Keep-alive被禁用,用于短连接测试。
  • Http_load从Nginx获取一个64字节的静态文件,并发度为500乘以内核数。
  • 我们为该静态文件启用内存缓存,以排除任何磁盘影响。
  • 接受互斥已禁用。Nginx的默认值为on。

注意:您最好禁用accept_mutex!使用默认的Fastsocket模块参数,Fastsocket具有分区的侦听套接字,因此,无需强制用户一个接一个地接受连接。如果某些CPU没有机会通过RPS或其他人接收数据包,特别是tcp syn数据包,则nginx将永远无法启用accept_mutex 来接受新的conn。因此,如果要加载将nginx的accept互斥量作为accept,则应确保将新请求传递给每个CPU。

从下图可以看出,在24个CPU内核上的Fastsocket每秒可实现475K连接(cps),速度提高了21倍。基本的CentOS-6.5内核的吞吐量最多可非线性增加至12个CPU内核,而具有24个CPU内核的吞吐量则急剧下降至159K cps。与基本CentOS-6.5内核相比,使用24个CPU内核时,最新的3.13内核将吞吐量提高了一倍,达到283K cps。但是,它尚未完全解决可伸缩性瓶颈,无法将其扩展到超过12个CPU内核。

HAProxy

一些重要的配置:

  • Worker号设置为CPU内核数。
  • 在Fastsocket中启用RFD(接收流传递)。
  • HAProxy上的HTTP Keep-alive已禁用,以进行短连接测试。
  • 客户端运行http_load的并发度为500乘以内核数。
  • 后端服务器以64字节的消息响应每个传入的HTTP请求。

如图所示,Fastsocket具有出色的可伸缩性,与以前的Nginx情况非常相似。使用24个CPU内核时,Fastsocket的性能比Linux 3.13高出139K cps,而基础CentOS-6.5内核则高出370K cps,尽管三个内核中一个内核的吞吐量非常接近。

 

在线评估

如前所述,Fastsocket已经部署在SINA生产环境中。一种典型的情况是将Fastsocket与HAProxy一起使用,以为WEIBO和其他SINA产品提供HTTP负载平衡服务。

在下图中,它是24小时内8核服务器的CPU使用率。图(a)显示了部署Fastsocket之前的CPU利用率,图(b)显示了部署Fastsocket之后的CPU利用率。

 

从图中我们可以看到使用Fastsocket之后发生了什么:

  • 每个CPU内核的负载都完美平衡。
  • 所有CPU内核的平均CPU利用率降低了10%。
  • 结果,HAProxy服务器的有效容量增加了85%。

此外,由于服务器是一台旧的8核计算机,因此我们预计,如果将Fastsocket部署在具有更多CPU内核的计算机上(在更新Fastsocket之后已经在12核计算机上观察到),Fastsocket将会提高性能。

新功能

现在,在长TCP连接的情况下,我们正在提高网络堆栈的效率。引入了另外四个功能:

  • Direct-TCP:如果这些数据包属于上层TCP套接字,则在接收数据包时跳过路由过程。
  • Skb-Pool:从每个内核的预分配skb池而不是内核slab中获取skb。
  • 接收CPU选择:将数据包引导到应用程序正在等待它的CPU核心。这个想法与Google的RFS相似,但是更轻巧,更准确。
  • RPS框架:我们扩展了RPS的思想,即在接收数据包进入网络堆栈之前重新分发它们。我们建立了一个框架,开发人员可以在树外模块中实现自己的数据包重调度规则,并加入RPS框架。

我们评估了关于redis的新工作,redis是一个典型且流行的键值缓存应用程序。

一些重要的配置:

  • Redis在持久TCP连接模式下工作。
  • 设置了多个Redis实例。
  • 每个Redis实例在不同的端口上侦听并绑定到不同的CPU内核。

8重实例测试显示:

  • 借助支持RSS的商用NIC,Fastsocket将吞吐量提高了20%以上
  • 使用支持Flow-Director(Intel 82599)的高级NIC,可以实现45%的改进。

笔记:

  • 这些新功能尚处于试验阶段,既未针对性能进行适当调整,也无法通过长期运行的生产环境证明其稳定。
  • 这些新功能是对V1.0中功能的补充,因此,Fastsocket可以使用这些新功能进一步提高Nginx和HAProxy的性能。

联系方式

邮件列表:fastsocket@librelist.com
Google 网上论坛:fastsocket-dev(https://groups.google.com/forum/#!forum/fastsocket-dev

向上述地址发送邮件将订阅邮件列表。主题和消息无关紧要。

 

 

 

 

 

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页