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 条评论
登录 后参与评论

相关文章

来自专栏BestSDK

一个“爆款”成功的API,都离不开这8条设计准则

我已经看过很多API设计相关的文章和优秀的REST API设计教程。他们通常讨论的是适当的编码技巧和如何在给定的语言中暴露接口。尽管那些是很有用也是很需要的,但...

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

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

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

367140
来自专栏北京马哥教育

Linux 软中断机制分析

软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些ta...

62880
来自专栏云之翼

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

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

16400
来自专栏编程

教你从零开始搭建一款前端脚手架工具

本文系原创,转载请注明:作者:Jrain Lau(https://segmentfault.com/u/jrainlau)项目地址:https://github...

55370
来自专栏腾讯大数据的专栏

大型web系统数据缓存设计

1. 前言 在高访问量的web系统中,缓存几乎是离不开的;但是一个适当、高效的缓存方案设计却并不容易;所以接下来将讨论一下应用系统缓存的设计方面应该注意哪些...

52360
来自专栏JAVA高级架构开发

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

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

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

RGW Bucket Shard设计与优化-上

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

1.5K50
来自专栏MongoDB中文社区

完美数据迁移-MongoDB Stream的应用

尽管如此,目前还是有许多企业踏上了服务化改造的道路,这其中则免不了”旧改”的各种繁杂事。

13420
来自专栏北京马哥教育

Linux基础之终端、控制台、tty、pty等概念简介

基本概念: 1>tty(终端设备的统称): tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘...

38680

扫码关注云+社区

领取腾讯云代金券