DPDK虽然能提供高性能的报文转发(安装使用方法见DPDK的源码编译安装),但是它并没有提供对应的IP/TCP协议栈,所以在网络产品的某些功能场景下(特别是涉及到需要使用TCP协议栈的情况),比如BGP邻居建立、nginx代理转发等等,都需要一套协议栈来实现这些功能。DPDK本身提供了KNI的接口,打通了与内核协议栈的通道,不过性能上肯定不会太好。
为了提高协议栈的转发性能,采用DPDK收包,工作在用户态的协议栈应用而生。f-stack就是基于DPDK,从FressBSD协议栈移植而来的一款开源的用户态协议栈。F-Stack是一个全用户态(kernel bypass)的高性能的网络接入开发包,基于DPDK、FreeBSD协议栈、微线程接口等,适用于各种需要网络接入的业务,用户只需要关注业务逻辑,简单的接入F-Stack即可实现高性能的网络服务器。
下面我们来看一下f-stack的源码编译安装方法:
操作系统版本: Ubuntu 20.04.5
f-stack版本: v1.22
1、下载f-stack源码,选择v1.22版本:
- git clone https://github.com/F-Stack/f-stack.git
- git checkout v1.22
2、安装依赖包:
- sudo apt-get install libnuma-dev
- sudo apt install gcc make libssl-dev
- sudo apt-get install gawk
3、编译DPDK,f-stack自带DPDK和igb_uio驱动源码:
-
- meson -Denable_kmods=true build
- ninja -C build
- ninja -C build install
4、关闭ASLR(地址空间随机化):
echo 0 > /proc/sys/kernel/randomize_va_space
5、加载驱动igb和kni驱动:
-
- insmod build/kernel/linux/igb_uio/igb_uio.ko
- insmod build/kernel/linux/kni/rte_kni.ko carrier=on
6、配置大页内存:
在/etc/default/grub中添加
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 default_hugepagesz=2M hugepagesz=2M hugepages=2048"
也可以根据CPU的配置为1G大页,使用命令
cat /proc/cpuinfo |grep pdpe1gb
查看CPU信息,如果有显示pdpe1gb,则支持1G大页。
重新生成grub配置文件:
grub-mkconfig -o /boot/grub/grub.cfg
reboot重启系统后,使用
grep Huge /proc/meminfo
查看大页内存是否生效:
7、绑定网卡驱动:
-
- ifconfig -a
- ifconfig eth1 down
- ifconfig eth2 down
- dpdk-devbind.py --bind=igb_uio eth1
- dpdk-devbind.py --bind=igb_uio eth2
8、编译安装f-stack:
-
- export FF_PATH=/data/f-stack
- export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/local/lib64/pkgconfig:/usr/lib/pkgconfig
- cd ../lib/
- make
- make install
说明:如果想编译debug版本,将Makefile文件的
DEBUG=-O0 -gdwarf-2 -g3 -Wno-format-truncation
这一行的注释去掉。
9、编译安装nginx并启动nginx:
-
- cd ../app/nginx-1.16.1/
- ./configure --prefix=/usr/local/nginx_fstack --with-ff_module
- make
- make install
- cd ./objs
- ./nginx
说明:如果编译nginx报错误:
note: previous declaration of ‘gettimeofday’ was here
需要修改src/event/modules/ngx_ff_module.c:554行,将
int gettimeofday(struct timeval *tv, struct timezone *tz)
修改为
gettimeofday(struct timeval *tv, void *tz)
10、编译安装redis:
-
- cd app/redis-6.2.6/deps/jemalloc
- ./autogen.sh
- cd ../..
- make
- make install
11、编译tools目录下的网络工具:
-
- cd ../tools
- make
- cd ./sbin
- ./ifconfig
可以看到nginx启动时,创建了f-stack-0的网口,IP地址为192.168.1.2,IP地址配置见/usr/local/nginx_fstack/conf/f-stack.conf(如果没有这个文件,把f-stack源码目录下的config.ini拷贝过去改名为f-stack.conf):
./netstat -an
12、基于f-stack的nginx功能验证:
将一台PC的网口接到安装有f-stack的服务器的网口上,在PC上打开浏览器,输入http://192.168.1.2,浏览器显示内容如下:
查看nginx配置cat /usr/local/nginx_fstack/conf/nginx.conf,nginx配置的页面内容与上面浏览器的一致:
好了,f-stack的源码编译安装和简单测试到这里就完成了。