F-Stack Q&A 第三期

Q1:如果在一个阻塞型的socket上执行recv,会不会把相应的线程卡死,调用recv时该socket中没有数据包,导致sleep,sleep导致该线程没办法进行收包的过程,感觉会死锁了?

A1:F-Stack中的socket接口在不设置nonblock确实会卡死。如有需要可以使用异步编程接口kqueue/epoll或微线程接口。

Q2:在Windows上解压F-Stack后传到linux上进行编译,编译失败?

A2:Windows将 lib/include/machine 软链接转换成了文件,需要重新做下软链接至 amd64/include/。

Q3:接管网卡之后,怎么把接管的网卡跑起来?

A3:如果不需要使用这个网卡管理服务器,启动F-Stack的应用就可以了,然后 F-Stack里的 dpdk 会启动网卡并接收处理包的;如果还需要这个网卡管理服务器,还需要在配置文件中开启kni功能,启动F-Stack后,还需要在系统上启动虚拟网卡.具体过程可以参照github的文档:https://github.com/F-Stack/f-stack/blob/master/doc/Launch_F-Stack_on_AWS_EC2_in_one_minute.md

Q4:F-Stack是否有移植ipfw的计划?

A4:有计划,八月份开始,先移植netgraph,再移植ipfw。

Q5:F-Stack 的ff_run回调的loop 内可以有while 循环么,今天试了下怎么感觉不行呢?

A5:Yes,but you should yield to give control back to fstack。

Q6:在使用F-Stack库时,其他线程为什么不能调用ff_sendto函数,有什么解决办法吗?

A6:F-Stack使用了单进程单线程模型,只能在dpdk线程里使用,如果是自己起的线程,调用这些函数会因为curthread为null而挂掉,其他线程可以处理非网络io的事。

Q7:我们开发的高性能服务器DNS,如何做负载?通常用lvs还是用OSPF?

A7:根据业务场景可以选择一种或结合使用,对DNS这种无状态的业务,可以直接用OSPF,业界使用的也比较多。

Q8:F-Stack后续演进路线是啥样的,功能和后续的性能有什么计划吗?会做为一个开源的产品持续下去吗?还是以内部项目驱动进行?我们是否可以参与?

A8:F-Stack定位就是全用户态的网络开发套件,主要路线就是在尽量保持高性能的基础上提供更容易使用、开发和调试的接口和工具,当前正在进行的是nginx reload修改和其他工具如cpu-useage、mbuf-usage等的支持,后续会进行netgraph(ipfw)的移植、零拷贝的支持以及之前语言接口的支持,具体可以查看公众号中的F-Stack发展规划。

F-Stack的开源会持续进行下去,但是特性和功能的开发肯定优先内部项目的需求,F-Stack欢迎所有人的参与,无论是建议还是贡献代码。

Q9:请问一下发送端零拷贝怎么实现呢?

A9:应用层和协议栈之间的数据拷贝比较难去除,协议栈的发包零拷贝方案直接从mbuf分配对协议栈改动太大,不利于后续社区的跟进,不是我们考虑的方向,主要是考虑发包的时候申请个mbuf,把buf_addr和phys_addr改成数据对应的地址,来实现无拷贝,然后数据的虚拟地址和物理地址的对应关系必须能直接查出来,数据的地址会进行指针偏移,加头等操作。

Q10:目前F-Stack支不支持用pipe()获取file descriptor然后加入到epoll的file descriptor?(有没有ff_pipe()类似的?)

A10:文件描述符目前还不支持加到ff_epoll中,有考虑方案后续去进行支持,记录不同fd是网络还是文件的,走不同的处理。

Q11:如何评价HttpDNS业务使用F-Stack优化到了单机85万QPS,做了哪些优化?[原文链接](https://www.zhihu.com/question/59779624/answer/207732908)

A11:后续会向业务方约稿来进行详细介绍,目前主要做的优化是:

1. 使用F-Stack代替系统协议栈,Intel 82599/X540 10G网卡有16个物理队列,启动16个进程性能达到了52万QPS,主要是多进程模式去除了系统协议栈的资源共享、pcb表锁等带来的提升。

2.HttpDNS业务是短连接,性能瓶颈不是包转发,而是协议栈的连接处理和业务逻辑,将F-Stack的默认的RSS模式修改为pipe +run-to-complite模式后,不再受16个网卡队列的限制,可以启动更多的进程来处理连接和业务,最终单机性能提升到85万QPS。

3.HttpDNS业务包含部分代理转发的查询过程,如果去掉可以达到单机96万QPS的性能。

Q12:我原来的程序是多线程模型的,要迁移到 F-Stack 上,必须得改成多进程模型,弄下来工作量还挺大的,主要的麻烦和改动是共享内存,原来可以直接访问的,现在还要 shm 包起来。然后就是有些动态内存分配,所以直接把 ngx_slab 给移植过来做分配器了,我现在是有一对元数据表需要多个进程共享的, 如果每个进程都存一份,内存占用可能比较大。进程读和元数据更新做到了完全无锁(读写锁也没有的),这个有什么其他的解决办法吗?

A12:单线程跑,开多个实例;要线性扩展,架构上就要share nothing,否则一直蛋疼。如果性能上能接受,把数据服务化是比较整齐的方式。如果一定要追求极致的性能,多hack一下也无妨。

Q13:基于dpdk写了一个程序,包含rte_ethdev.h编译时出现 rte_memcpy.h error: mm_alignr_epi 在此作用域尚未声明。不知道Makefile还需要添加哪些选项能编译过。

A13: 需要在编译选项中增加CPU指令集:-march=native。

原文发布于微信公众号 - FStack(F-Stack)

原文发表时间:2017-08-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构师之路

90行代码,搞定日志监控框架

上一篇《100行代码,搞定http监控框架》介绍了通用+可扩展的http监控平台的架构: 监控平台层:调度监控项,通过后台管理监控项 信息管理层:通过服务和后台...

8037
来自专栏后端技术探索

后端线上服务监控与报警方案

一个功能上线后,其实研发心里根本没底儿,不知道这个功能上线以后是不是真的没问题;有经验一些老同学还知道直接登录线上机器去tail -f php.error.lo...

2162
来自专栏杨建荣的学习笔记

通过shell脚本添加备库日志 (r9笔记第94天)

今天下午的时候,准备顺手写一个简单的脚本,但是发现很多事情较真起来真是寸步难行。在写脚本的过程中碰到了太多的问题,很多时候感觉像要实现的功能更通用,就得做更多的...

3746
来自专栏申龙斌的程序人生

零基础学编程023:用with实现优雅地释放资源

在《零基础学编程022:函数的世界》中我们写了一个函数,通过访问新浪的实时行情服务,得到股票的开盘价。 import urllib.request as re...

35514
来自专栏Ceph对象存储方案

RGW Bucket Shard设计与优化-上

1 bucket index背景简介 bucket index是整个RGW里面一个非常关键的数据结构,用于存储bucket的索引数据,默认情况下单个bucke...

1.1K5
来自专栏JAVA高级架构开发

Redis 的各项功能解决了哪些问题?

Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用。同时支持strings,lis...

950
来自专栏SDNLAB

DLUX组件扩展上篇-原理

作者: M.S-Group.皮皮熊,M.S-Group组织主要成员之一,数通行业老兵,精通传统数通网络技术,SDN/NFV新技术的狂热拥护者!

1074
来自专栏七夜安全博客

go go go - beego

在上一篇文章What!!! so fast中,我介绍了golang这种语言,并使用golang开发了一个端口扫描工具。现在我的主要工作是做网络安全方面的开发与策...

2882
来自专栏CSDN技术头条

调试大规模服务器集群的五大策略

随着互联网迅速发展,用户访问量以及服务器规模的越来越大,因此,创建一个可靠、稳定、优质的互联网服务是开发者的首要目标。而对于开发者而言,是否具备一个完善的服务器...

2559
来自专栏云之翼

在虚拟机上容器环境性能--动态测试问题分析总结(二)

在上一篇中,介绍了静态测试场景,本文介绍动态性能测试的差异分析,希望大家可以借鉴。

1170

扫码关注云+社区