【前言】基于solarflare的onload模式加速,官方文档给出TCPDirect模式可以实现从300ns到30ns的延迟缩减。我们需要测试在我们的交易模型框架中他的延时,有人给出了tcpdirect加速大约会比onload模式快300ns左右,不是倍数关系,是一个数量差。虽未达如此高速交易,但量化交易,分秒必争。但是tcpdirect有一个缺点就是必须使用它的接口,不像onload只需要安装好加速环境,使用onload模式就可以了。TCPDirect需要拿到源码,并重写底层。

  我们实现一个类epoll-socket,TCPDirect使用了muxer,实现叫做zocket,进行RTT测试。

一、server端

  对应epoll,我们使用muxer实现,和epoll接口类似。

  1、注意后面要释放掉创建的zf_muxer_free(muxer);

  2、因为我们使用内核旁路技术,不要使用zf_recv()函数,虽然他有返回接收数据的大小,但是他是基于copy的,使用zf_zc_recv()。

  3、每次在使用接口有数据交换或者使用硬件时,要使用zf_reactor_perform(stack);,因为我们的zocket是运行在一个初始化的stack上的,每次都要用此接口来进行“初始化”,文档这样写的,我也不清楚。

  4、其他的和epoll不同之处要悉心,比如无需绑定,用zft_listen()绑定,zf_zc_recv和zf_send的存储的数据结构也不相同,下面有我的两种数据的转换存储方式,因为在服务器端需要进行一个转存;

  5、测试时间的核心程序:

ZF_TRY(zf_muxer_add(muxer, zft_to_waitable(zock), &evs[i]));
//初始化stack
zf_reactor_perform(stack);
rd1.zcr.iovcnt = 1;
HP_TIMING_NOW(t0);
zft_zc_recv(zock, &rd1.zcr, 0);
if( rd1.zcr.iovcnt == 0 )
continue;
if( first_recv ) {
first_recv = 0;
siov.iov_len = rd1.zcr.iov[0].iov_len;
memcpy(buf, ((char*)rd1.zcr.iov[0].iov_base),siov.iov_len);
}
for( int i = 0 ; i < rd1.zcr.iovcnt; ++i ) {
len3=zft_send(zock, &siov, 1, 0);
}
HP_TIMING_NOW(t1);
//c++11的元组,编译时候可能要加上-std=c++11
time_v.push_back(std::make_tuple(len3,t1, t0, (t1 - t0)));
cout<<"服务器发送:"<<len3<<"数据:"<<buf<<endl; zft_zc_recv_done(zock, &rd1.zcr);

二、客户端

  1、初始化的stack可能会用完,要加上ZF_TRY(zft_send_space(tcp,&send_size));,send_size是一个传出参数,返回tcp连接的栈剩余空间,小于目标大小的时候要判断,然后重新分配,我们仅是实现测试,足够我用;

  2、测试结果,就在客户端。我们需要发送和其他模式下同样的数据,到server,然后返回,client再收到所用的时间。

  3、发送和接受和server一样注意,此处无需装换;

  4、输出结果的代码,使用tuple。mongodb那种nosql可以用这种数据组织方式存储。

std::vector<std::tuple<int, u64_t, u64_t, int>>::iterator it;
for (it = time_v.begin(); it != time_v.end(); ++it) {
cout << "len=" << std::get<0>(*it) << " --- recv time = " << std::get<1>(*it) << ", send time = " << std::get<2>(*it)
<< ", gap = " << std::get<3>(*it) << endl;
   if (it != time_v.begin()) {
sum += std::get<3>(*it);
++num;
}
}
#第一个时间是jiffies,要除以本机的cpu主频

std::cout << "avg gap = " << (sum / (num*1.0) ) << endl;
 std::cout << "avg gap(ns) = " << (sum / (num*3.4)) << endl;

(关于jiffies和cpu频率的关系:https://www.cnblogs.com/by-dream/p/5143192.html   相除就是时间)

使用tcpdirect在char类型511字节数据上,进行RTT测试,循环1000次的平均用时3444纳秒(3.5微秒)左右。

  具体和普通socket、使用onload加速的对比:

  当然,这只是个别。我大约测了10次,平均值大约如此。

三、收获心得

1、学会了初步的gdb- 对于coredump情况调试方法,学会了一些分析错误的思路。

2、tcpdump抓包分析,wireshark分析。

基于solarflare的openonload技术以TCPDirect方法加速epoll的更多相关文章

  1. 基于Delphi的三层数据库系统的实现方法

    基于Delphi的三层数据库系统的实现方法   1  引言 当前的数据库应用系统中,按其结构划分为两类,一类是两层结构的数据库应系统,另一类是多层结构的数据库应用系统. 两层结构的数据库应用系统包括客 ...

  2. comet基于HTTP长连接技术(java即时通信,推送技术详解)

    服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息,服务器发送一批数据,浏览器显示消息,同时保证与服务器的连接,当服务器需要再一次的发送数据,浏览器显示数据并保持连接. comet基 ...

  3. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  4. 转:基于IOS上MDM技术相关资料整理及汇总

    一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...

  5. 项目实战(连载):基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(2)

    本章主要讲什么(一句话)?   <项目实战:基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(2)> -- 基于MongoDB的MyBlog数据库知识技术储备(上 ...

  6. 基于CNN的人群密度图估计方法简述

    人群计数的方法分为传统的视频和图像人群计数算法以及基于深度学习的人群计数算法,深度学习方法由于能够方便高效地提取高层特征而获得优越的性能是传统方法无法比拟的.本文简单了秒速了近几年,基于单张图像利用C ...

  7. 基于IOS上MDM技术相关资料整理及汇总

    (转自:http://www.mbaike.net/special/1542.html) 一.MDM相关知识:MDM (Mobile Device Management ),即移动设备管理.在21世纪 ...

  8. 一种基于RBAC模型的动态访问控制改进方法

    本发明涉及一种基于RBAC模型的动态访问控制改进方法,属于访问控制领域.对原有RBAC模型进行了权限的改进和约束条件的改进,具体为将权限分为静态权限和动态权限,其中静态权限是非工作流的权限,动态权限是 ...

  9. 通过写n本书的积累,我似乎找到了写好技术文章的方法(回复送我写的python股票电子书)

    我写的书不算少,写的博文就更多了,但大多数书的销量也就一般,而我写的技术文章里,虽然也有点击过万的,但不少点击量也就只有三位数. 通过不断反思,也通过对比了一些畅销书和顶流文章,我似乎找到了一些原因, ...

随机推荐

  1. Scala面向对象—类详解2(继承相关)

    1.单例类 package com.zzzy class AAA {//单例 /*//java 思路--私有化构造方法,提供公开的getAAA 行不通 private def this(){ this ...

  2. 【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)

    题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离.问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则 ...

  3. Codeforces Round #547 (Div. 3) E. Superhero Battle (数学)

    题意:有一个HP为\(h\)的大怪兽,你需要轮流进行\(i\)次操作.每次可以使\(h+=d_i\)(\(d_i\)有正有负),当第\(n\)次操作完成后,再从第一次开始,问能否使得怪兽的HP变为\( ...

  4. AtCoder Beginner Contest 173 E - Multiplication 4 (思维)

    题意:有\(n\)个数,从中选\(k\)个数累乘,求最大的乘积\((mod\ 10^9+7)\). 题解: 1.假如全是负数,并且选奇数个,那么从小到大选. 2.否则,考虑当前状态,假如\(k\)是奇 ...

  5. 要想用活Redis,Lua脚本是绕不过去的坎

    前言 Redis 当中提供了许多重要的高级特性,比如发布与订阅,Lua 脚本等.Redis 当中也提供了自增的原子命令,但是假如我们需要同时执行好几个命令的同时又想让这些命令保持原子性,该怎么办呢?这 ...

  6. 交换机上禁止某个MAC地址通信

    当分析出网络中某台机器中毒时而有不知道它的具体位置,我们可以通过获取其MAC地址然后在交换机上禁止其MAC来达到隔离它的效果.通过ARP表查询IP地址对应的MAC地址,再将该MAC地址加入黑名单过滤. ...

  7. leetcode28 strstr kmp bm sunday

    字符串匹配有KMP,BM,SUNDAY算法. 可见(https://leetcode-cn.com/problems/implement-strstr/solution/c5chong-jie-fa- ...

  8. 鸟哥的linux私房菜——第十章学习(BASH)

    第十章 BASH 1.0).认识BASH 作用:通过" Shell "可以将我们输入的指令与 Kernel 沟通,好让Kernel 可以控制硬件来正确无误的工作! 应用程序其实是在 ...

  9. html图片占位符插件holder.js

    1.下载源码 下载链接:http://www.bootcdn.cn/holder/ 2.在HTML中引入holde.js <script src="holder-js-2.9.4\ho ...

  10. Hacker101 CTF-Micro-CMS v2

    一.打开网站是这个样子 找到一个登录框,存在注入漏洞 3.我们可以这样更改用户名中的输入: admin' or 1=1 -- 4.错误消息显示Invalid Password,因此我们也应该尝试构造一 ...