DPDK之多队列网卡测试
0 背景基于环境 VMware+Ubuntu 虚拟机环境,在DPDK接管多队列网卡后,每个网卡数据接收情况。
配置多队列网卡
多队列网卡测试
1 添加多个网卡
在vmware环境中对应虚拟机的虚拟机设置中,增加网络适配器(一个或者多个),对应网卡的个数。
启动虚拟机,查看网卡信息
当前生效的只有一个网卡,是桥接模式的第一个网卡:
123456789101112131415161718192021222324252627282930313233343536373839404142ubuntu@ubuntu:~$ service networking restart #不同的linux环境重启网络命令是不同的==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===Authentication is required to restart 'networking.service'.Authenticating as: ubuntu,,, (ubuntu)Password: ==== ...
【转载】浅析基于DPDK框架下OVS与VPP的差异点
1 概述Data Plane Development Kit简称DPDK,是一套将从网卡收上来的数据包直接映射到用户空间的开发套件,基于此许多大公司都搭建了自己的业务应用框架,如虚拟交换机、虚拟路由器等。其中影响比较大的就是OVS和VPP,本文从这两个系统的性能表现及开发难度两个维度进行详细分析,给出作者对这两个业务框架的一点认识,希望能给学习这两个框架的人有所帮助。
1.1 DPDK简介DPDK原本是基于 Intel 处理器架构下,提供库函数和驱动支持用户空间高效数据包处理的开源套件,即DPDK绕过了系统的内核协议栈对报文的处理过程,报文的收发与处理在用户空间实现。因此对于内核而言,DPDK的工作进程就是一个普通的用户态进程。DPDK的编译、连接和加载方式也跟普通程序没有什么差别。DPDK的这种特性区别于以通用性设计为目的的Linux系统,DPDK专注于高性能的处理网络应用中的数据包。现在这个套件也支持ARM及Power 8。
DPDK的典型框架如下图所示:
图 1 DPDK架构简图
从上图可以看出,DPDK将网卡收上来的报文跳过Linux Kernel,直接映射到用户空间并提供了 ...
【转载】Linux RCU 原理剖析
背景说明:
Kernel版本:4.14
ARM64处理器,Contex-A53,双核
使用工具:Source Insight 3.5, Visio
1. 概述RCU, Read-Copy-Update,是Linux内核中的一种同步机制。RCU常被描述为读写锁的替代品,它的特点是读者并不需要直接与写者进行同步,读者与写者也能并发的执行。RCU的目标就是最大程度来减少读者侧的开销,因此也常用于对读者性能要求高的场景。
优点:
读者侧开销很少、不需要获取任何锁,不需要执行原子指令或者内存屏障;
没有死锁问题;
没有优先级反转的问题;
没有内存泄露的危险问题;
很好的实时延迟;
缺点:
写者的同步开销比较大,写者之间需要互斥处理;
使用上比其他同步机制复杂;
来一张图片来描述下大体的操作吧:
多个读者可以并发访问临界资源,同时使用rcu_read_lock/rcu_read_unlock来标定临界区;
写者(updater)在更新临界资源的时候,拷贝一份副本作为基础进行修改,当所有读者离开临界区后,把指向旧临界资源的指针指向更新后的副本,并对旧资源进行回收处理;
图中只 ...
系统性能调优详解
0 参考资料课程资料:https://github.com/russelltao/geektime_distrib_perf
2 系统层网络优化2.3 优化TCP三次握手性能2.3.1 客户端的优化三次握手建立连接的首要目的是同步序列号。只有同步了序列号才有可靠的传输,TCP协议的许多特性都是依赖序列号实现的,比如流量控制、消息丢失后的重发等等,这也是三次握手中的报文被称为SYN的原因,因为SYN的全称就叫做Synchronize Sequence Numbers。客户端发送SYN开启了三次握手,此时在客户端上用netstat命令(后续查看连接状态都使用该命令)可以看到连接的状态是SYN_SENT(顾名思义,就是刚把SYN发送出去)。
1tcp 0 1 172.16.20.227:39198 129.28.56.36:81 SYN_SENT
如果客户端一直等不到服务端回复ACK报文,客户端会重发SYN,重试的次数由tcp_syn_retries参数控制,默认是6次。
1net.ipv4.tcp_syn_retries = 6
每次充实间隔时间倍数增加 ...
VPP 详解
0 参考资料1 VPP 安装和使用1.1 简介VPP:(vector packet processor)是一个可扩展框架,可提供开箱即用的交换机/路由器功能。是Linux基金会下开源项目FD.io的一个子项目,由思科贡献的开源版本,目前是FD.io的最核心的项目。VPP是一个模块化和可扩展的软件框架,用于创建网络数据面应用程序。更重要的是,VPP代码为现代通用处理器平台(x86、ARM、PowerPC等)而生,并把重点放在优化软件和硬件接口上,以便用于实时的网络输入输出操作和报文处理。为了提高性能,vpp数据平面是由转发节点的有向图组成,这些节点在每次调用时处理多个数据包。这种模式支持各种微处理器优化:流水线处理和预取功能降低依赖数据的读取延迟,固有的I-cache阶段行为,向量指令。除了硬件输入和硬件输出节点,整个转发图都是可移植的代码。模块化设计框架允许任何人“插入”新的图形节点,而不需要更改核心/内核代码。VPP一次从网卡的硬件队列Rx ring收到多个数据包,组成一个Packet vector,借助于报文处理图Packet processing graph来 ...
Redis 核心技术详解
0 参考资料
本笔记是极客时间《Redis核心技术与实战》课程
0.1 学习资料推荐书籍:
工具书:《Redis使用手册》:Redis命令参考
原理书:《Redis设计与实现》
实战书:《Redis开发与运维》
可以尝试读一下Redis源码,有一个网站提供了Redis 3.0源码的部分中文注释,你也可以参考一下。
Redis涉及的知识比较多,比如:操作系统、分布式系统等知识点,如下图:
0.2 学习方法分为三大模块:
掌握数据结构和缓存的基本使用方法;
掌握支撑Redis实现高可靠、高性能的技术;
精通Redis底层实现原理。
参考加餐(二)-Kaito:我是如何学习Redis的?_For_group_share
1 基础篇1.1 基础架构:一个键值数据库包含什么?从这张对比图中,我们可以看到,从SimpleKV演进到Redis,有以下几个重要变化:
Redis主要通过网络框架进行访问,而不再是动态库了,这也使得Redis可以作为一个基础性的网络服务进行访问,扩大了Redis的应用范围。
Redis数据模型中的value类型很丰富,因此也带来了更多的操作接口,例如面向列表的 ...
MySQL 事务机制
[TOC]
3 事务隔离3.1 隔离性和隔离级别
事务的特性(ACID)
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
3.2 SQL标准的事务隔离级别
读未提交:一个事务还没提交时,他做的能被其他事务所看见
读提交:一个事务提交之后,他做的修改才会被其他事务所看到
可重复读:一个事务在执行期间看到的数据总是跟在启动时看到的数据是一致的。未提交变更对其他事务也是不可见的
串行化:“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才可以继续执行。
示例:下边执行一个事务,如下的操作:
12mysql> create table T(c int) engine=InnoDB; insert into T(c) values(1);
若隔离级别是“读未提交”, 则V1的值就是2。这时候事务B虽然还没有提交,但是结果已经被A看到了。因此,V2、V3也都是2。
若隔离级别是“读提交”,则V1是1,V2的值是2。事务B的更新在提交后才能被A看到。所以 ...
Redis 核心技术实践
2 实践篇2.11“万金油”的String,为什么不好用了?2.11.1 string类型如何保存数据的举一个示例,用10位数来表示图片ID和图片存储对象ID,例如,图片ID为1101000051,它在存储系统中对应的ID号是3301000051,在图片数量巨大的场景下。
如果保存1亿张图片,使用string类型,大约用6.4GB的内存。一个图片ID和图片存储对象ID的记录平均用了64字节。来分析一下。图片ID和图片存储对象ID都是10位数,我们可以用两个8字节的Long类型表示这两个ID。因为8字节的Long类型最大可以表示2的64次方的数值,所以肯定可以表示10位数。但是,为什么String类型却用了64字节呢?通过对string类型进行分析,在记录实际数据时,string类型还需要额外的内存空间记录数据长度、空间使用等信息,这些信息也叫做元数据。当实际保存的数据较小时,元数据的空间开销就显得比较大了。
String类型具体是怎么保存数据的呢?
当你保存64位有符号整数时,String类型会把它保存为一个8字节的Long类型整数,这种保存方式通常也叫作int编码方式。
当你保存的 ...
MySQL 锁机制
第06讲 全剧锁和表锁MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。
6.1 全局锁全局锁是对整个数据库实例加锁,命令如下:
1Flush tables with read lock (FTWRL)
当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
全局锁的典型使用场景是做全库逻辑备份。也就是把整库每个表都select出来存成文本。
在讲事务隔离时,事务的可重复读隔离级别也可以实现在多个事务执行时实现一致性。官方自带的逻辑备份工具是mysqldump。当mysqldump使用参数–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。但是对于MyISAM这种不支持事务则无法使用,只能全局锁。所以,single-transaction方法只适用于所有的表使用事务引擎的库。如果有的表使用了不支持事务的引擎,那么备份就只能通过FTWRL方法。这往往是DBA要求业务开发人员使用InnoDB替代MyISAM的原因之一。 ...
DPDK 深入浅出
0 常见问题
DPDK里面你对负载均衡了解吗,能不能给我解释一下呢,有几种方法呢?1DPVS
DPDK的两种模式你知道多少呢,可以介绍一下吗?
pipeline模式和run
对于DPDK它和传统协议栈的对比好处在哪呢,怎么实现的呢,
PMD的流程、NUMA的机制、DPDK对于网卡的流处理机制等等;
PMD是用户态轮询机制的驱动,轮询收发数据包,相比中断性能更高,其次PMD虽然是用户态实现的设备驱动,但依赖内核提供策略,比如依赖UIO(内核的用户态驱动框架);或者VFIO
DPDK的UIO实现的流程是什么样的呢?对于DPDK的大页以及TLB等,你有多少了解?
1 DPDK简介1.1 初始DPDK以Linux为例,传统网络设备驱动包处理的动作可以概括如下:
数据包到达网卡设备。
网卡设备依据配置进行DMA操作。
网卡发送中断,唤醒处理器。
驱动软件填充读写缓冲区数据结构。
数据报文达到内核协议栈,进行高层处理。
如果最终应用在用户态,数据从内核搬移到用户态。
如果最终应用在内核态,在内核继续进行。
随着网络接口带宽从千兆向万兆迈进,原先每个报文就会触发一个中断,中断带来的开销 ...