目录
简介
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)
向上述地址发送邮件将订阅邮件列表。主题和消息无关紧要。