From 1a527102bcb60797551095f37fd367fbad84f2ef Mon Sep 17 00:00:00 2001 From: logwang Date: Thu, 14 Sep 2017 18:57:37 +0800 Subject: [PATCH] Example: exit when ff_api failed --- README.md | 11 ++++++----- example/main.c | 6 +++++- example/main_epoll.c | 6 +++++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fc49564b8..282ff0619 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ ![](F-Stack.png) ## Introduction + With the rapid development of NIC, the poor performance of data packets processing with Linux kernel has become the bottleneck. However, the rapid development of the Internet needs high performance of network processing, kernel bypass has caught more and more attentions. There are various similar technologies appear, such as DPDK, NETMAP and PF_RING. The main idea of kernel bypass is that Linux is only used to deal with control flow, all data streams are processed in user space. Therefore, kernel bypass can avoid performance bottlenecks caused by kernel packet copying, thread scheduling, system calls and interrupts. Furthermore, kernel bypass can achieve higher performance with multi optimizing methods. Within various techniques, DPDK has been widely used because of its more thorough isolation from kernel scheduling and active community support. [F-Stack](http://www.f-stack.org/?from=github) is an open source network framework with high performance based on DPDK. With following characteristics @@ -32,12 +33,12 @@ Currently, besides authorized DNS server of DNSPod, there are various products i #clone F-Stack mkdir /data/f-stack git clone https://github.com/F-Stack/f-stack.git /data/f-stack - + cd f-stack # compile DPDK cd dpdk/tools ./dpdk-setup.sh # compile with x86_64-native-linuxapp-gcc - + # Set hugepage # single-node system echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages @@ -88,7 +89,7 @@ for more details, see [nginx guide](https://github.com/F-Stack/f-stack/blob/mast make install  If KNI is enabled in the configuration file, you should create a virtual NIC after F-Stack started, and set the ipaddr, netmask, mac addr, route table, etc. These addrs must be same with F-Stack. - + If you don't have another management port, you should execute a script like this. /usr/local/nginx_fstack/sbin/nginx @@ -97,7 +98,7 @@ for more details, see [nginx guide](https://github.com/F-Stack/f-stack/blob/mast route add -net 0.0.0.0 gw dev veth0 # route add -net ... # other route rules -## Nginx Testing Result +## Nginx Testing Result Test environment @@ -109,7 +110,7 @@ Test environment Nginx uses linux kernel's default config, all soft interrupts are working in the first CPU core. -Nginx si means modify the smp_affinity of every IRQ, so that the decision to service an interrupt with a particular CPU is made at the hardware level, with no intervention from the kernel. +Nginx si means modify the smp_affinity of every IRQ, so that the decision to service an interrupt with a particular CPU is made at the hardware level, with no intervention from the kernel. Nginx_FStack's 600 cache bytes' body was returned directly in nginx.conf. diff --git a/example/main.c b/example/main.c index 983b1b5da..4cdd75036 100644 --- a/example/main.c +++ b/example/main.c @@ -107,8 +107,10 @@ int main(int argc, char * argv[]) sockfd = ff_socket(AF_INET, SOCK_STREAM, 0); printf("sockfd:%d\n", sockfd); - if (sockfd < 0) + if (sockfd < 0) { printf("ff_socket failed\n"); + exit(1); + } struct sockaddr_in my_addr; bzero(&my_addr, sizeof(my_addr)); @@ -119,11 +121,13 @@ int main(int argc, char * argv[]) int ret = ff_bind(sockfd, (struct linux_sockaddr *)&my_addr, sizeof(my_addr)); if (ret < 0) { printf("ff_bind failed\n"); + exit(1); } ret = ff_listen(sockfd, MAX_EVENTS); if (ret < 0) { printf("ff_listen failed\n"); + exit(1); } kevSet.data = MAX_EVENTS; diff --git a/example/main_epoll.c b/example/main_epoll.c index de8f3889b..a055d0fed 100644 --- a/example/main_epoll.c +++ b/example/main_epoll.c @@ -102,8 +102,10 @@ int main(int argc, char * argv[]) sockfd = ff_socket(AF_INET, SOCK_STREAM, 0); printf("sockfd:%d\n", sockfd); - if (sockfd < 0) + if (sockfd < 0) { printf("ff_socket failed\n"); + exit(1); + } int on = 1; ff_ioctl(sockfd, FIONBIO, &on); @@ -117,11 +119,13 @@ int main(int argc, char * argv[]) int ret = ff_bind(sockfd, (struct linux_sockaddr *)&my_addr, sizeof(my_addr)); if (ret < 0) { printf("ff_bind failed\n"); + exit(1); } ret = ff_listen(sockfd, MAX_EVENTS); if (ret < 0) { printf("ff_listen failed\n"); + exit(1); } assert((epfd = ff_epoll_create(0)) > 0);