自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ApeLife技术博客

沿着方向前进,解决所遇到的问题,同时别忘了回头望望

  • 博客(80)
  • 资源 (3)
  • 收藏
  • 关注

原创 dpdk之kni实现

一、为什么要用kni 通常情况下dpdk用于二三层报文转发,接收到来自网卡的报文后,如果是二层报文则查找fdb表; 如果是三层报文,则进行dnat, snat处理后,查找路由表, 将报文转发给下一跳路由。这些二三层转发操作都是直接转发到另一台设备上,不需要经过内核,无需内核协议栈的参与。 然而有些场景下报文是直接发给运行dpdk程序的这台设备本身的。例如ping...

2019-10-24 13:24:26 7834 10

原创 dpdk报文收发流程

本篇文章来分析下dpdk是如何接收报文以及发送报文的。一、报文的接收流程 传统方式接收报文时,当网卡接收到报文后会产生硬件中断,进而报文会通过协议栈,最后到达应用层,这个过程需要内核协议栈的处理。 和传统报文接收不同,当应用层想要接收来自网卡的报文时, 应用层通过while死循环的方式,调用rte_eth_rx_burst接口轮询接收来自网卡的报文,相当于绕...

2019-10-09 22:18:09 6224 7

原创 dpdk应用层对网卡进行配置

dpdk用户态驱动初始化完成后,应用层就可以来对网卡进行设置操作。对于每一个网卡,应用层都需要调用相应接口进行配置。可以对网卡进行哪些设置操作呢? 例如应用层将对网卡进行配置下发,将配置信息下发给网卡;应用层对网卡接收队列进行设置;应用层对网卡发送队列进行设置;应用层启动网卡等操作。以l2fwd为例, 应用层调用rte_eth_dev_configure进行配置下发; 调用rte...

2019-10-08 23:13:18 2792 1

原创 dpdk pmd驱动初始化

在没有引入pmd用户态网卡驱动之前, 网卡在收到报文后,网卡驱动会将报文从网卡缓冲区拷贝到内核, 接着内核在把报文拷贝到应用层,整个过程需要2次的拷贝以及系统调用。当应用层需要发送数据时,应用层将报文拷贝到内核,接着内核拷贝到网卡缓冲区,由网卡负责发送,整个过程也需要2次的拷贝以及系统调用。 不管接收还是发送报文,系统调用以及内存拷贝都是需要消耗性能的。在引入了pmd用户态驱动后...

2019-10-01 23:29:52 2092

原创 dpdk uio驱动实现

一、dpdk uio驱动框架 在系统加载igb_uio驱动后,每当有网卡和igb_uio驱动进行绑定时, 就会在/dev目录下创建一个uio设备,例如/dev/uio1。uio设备是一个接口层,用于将pci网卡的内存空间以及网卡的io空间暴露给应用层。通过这种方式,应用层访问uio设备就相当于访问网卡。具体来说,当有网卡和uio驱动绑定时...

2019-09-12 13:03:24 2981 1

原创 dpdk多线程模型

dpdk支持多线程的运行方式, 也支持多进程的运行方式。本篇文章来分析下dpdk的多线程, 多进程模型。一、多线程模型 一个cpu上可以运行多个线程, 由linux内核来调度各个线程的执行。内核在调度线程时,会进行上下文切换,保存线程的堆栈等信息, 以便这个线程下次再被调度执行时,继续从指定的位置开始执行。然而上下文切换是需要耗费cpu资源的的,多核体系的CP...

2019-09-07 18:08:48 3070 4

原创 dpdk pci驱动探测

上一篇文章已经介绍了pci设备的背景知识, 现在我们来分析下pci设备是如何探测到支持的驱动,进而与驱动进行关联;pci与驱动的解除绑定;pci设备与uio设备的关联。一、pci驱动注册 网卡驱动的注册使用了一种奇技淫巧的方法,使用GCC attribute扩展属性的constructor属性,使得网卡驱动的注册在程序main函数之前就执行了。此时在main函...

2019-09-04 21:17:40 1630

原创 dpdk pci设备初始化

一、pci设备背景知识 传统的sata,是一种半双工设备, 同一时间只能有一个方向在传输数据,传输速率就比较慢了。pci设备是一种全双工设备, 同一时间可以发送数据到其他pci设备,也可以接收来自其他pci设备的数据。1、pci总线 在系统加载的时候,会将所有的pci设备给挂载到pci总线上,并在/sys/bus/pci/devices目录下创建所有的p...

2019-09-02 22:41:29 2112

原创 dpdk中断机制

dpdk自己实现了一个中断机制,例如定时器中断,uio中断。这个中断是应用层中断, 而不是像linux内核实现的硬件中断; 且dpdk实现的中断机制属于控制中断,用来实现一些控制操作,例如uio中断用来设置一些网卡的状态之类。网卡收发包过程,还是使用轮询的方式从网卡接收报文。一、中断事件管理 dpdk实现了uio, 定时器alarm, vfio三种中断,且用链表来...

2019-08-28 23:42:35 2713 1

原创 dpdk内存池rte_mempool实现

dpdk可以通过两种方式来管理内存, 一种是调用rte_malloc, 在大页内存上申请空间; 另一种是使用内存池,也是通过在大页内存上申请空间方式。 两种有什么区别呢?虽然两者最终都是在大页内存上获取空间,但内存池这种方式直接在大页内存上获取,绕开了rte_malloc调用。rte_malloc一般用于申请小的内存空间。通常在需要非常大的缓冲区时,在大页内存上一次性申请一个大的缓...

2019-08-23 07:44:42 8644

原创 dpdk大页内存实现

上一篇文件介绍了linux内存管理以及大页内存的原理,有了原理的支撑,接下里分析dpdk大页内存源码就轻松了,才不会云里雾里不知道在说啥。所谓的dpdk大页内存的实现,说白了就是dpdk自己实现了一套大页内存的使用库,这个和libhugetlbfs.so是类似的,就是自己实现了大页内存的申请,释放操作, 替代了传统的malloc, free系统调用。先从整体上看下dpdk大页内存有...

2019-08-18 17:32:55 6976 2

原创 dpdk大页内存原理

在分析dpdk大页内存的源码之前,有必要对linux内存管理的原理以及大页内存的原理有个了解,缺少这些底层基础知识,分析dpdk大页内存的源码将举步维艰。这篇文章详细介绍下linux内存管理以及大页内存的方方面面,为分析dpdk大页内存源码扫除障碍。一、linux内存管理原理1、mmu内存管理的引入 在没有引入mmu内存管理单元时,对于32位操作系统,每个...

2019-08-16 23:56:26 5321 2

原创 dpdk日志系统

本篇文章从四个方面对dpdk日志系统进行剖析,分别是: 1、dpdk日志框架 2、内存池未初始化时的日志系统 3、内存池已完成初始化的日志系统 4、日志系统的使用 下面分别对这四个方面进行分析:一、dpdk日志框架 在分析dpdk源码时,难免存在有疑惑的地方,这个...

2019-07-17 00:08:57 1895

原创 dpdk pdump抓包环境搭建

intel的e1000网卡被uio驱动接管后, 在linux下通过ifconfig是看不到网卡信息的,也就无法使用tcpdump来抓包。 dpdk在16.7版本引入了pdump抓包工具,可以使用这个工具来抓包,抓到的包可以在windows下通过wireshark来分析。pdump抓包工具需要依赖libpcap和libpcap-dev两个库。 下面来看下如何安装pdump工具。一...

2019-06-30 18:35:33 6862

原创 dpdk l3fwd报错问题处理

vmware虚拟机中运行dpdk l3fwd三层转发例子,会出现EAL: Error - exiting with code: 1 Cause: Cannot configure device: err=-22, port=0错误。这是因为intel的e1000网卡只支持单队列。也就是每个e1000网卡只支持一个队列, 然而在l3fwd例子中,每个网卡需要多个队列才能运行起来。如果...

2019-06-29 23:33:03 3235

原创 vmware虚拟机添加物理网卡与虚拟网卡

虚拟机上面也有真实网卡,例如eth0, eth1,eth2, 但这是相对于虚拟机自己而言的。 当然了,这个真实网卡对于宿主机来说也是虚拟网卡。除此之外虚拟机上也有虚拟网卡,例如eth0:1, eth0:2, eth0:3。 下面分别来介绍在虚拟机上如何添加物理网卡与虚拟网卡。一、虚拟机添加物理网卡 我这台vmware虚拟机上安装的是ubuntu操作系统,...

2019-06-16 18:54:31 25676 2

原创 ubuntu网络配置(桥接模式, nat模式, host主机模式)

宿主机上安装了vmware虚拟机, vmware虚拟机上运行着ubuntu系统。宿主机与虚拟机可以通过三种方式进行通信。分别是桥接模式;nat模式;host模式。虚拟机组网方式可以参考这篇文章https://blog.csdn.net/dog250/article/details/7363534下面分别来看下这三种模式下,网络是如何配置的。一、桥接模式 所...

2019-06-16 18:06:25 14924

原创 虚拟机dpdk环境搭建

一、准备环境 磨刀不误砍柴工,要想更好的进行dpdk源码分析,需要搭建一套dpdk环境,观察数据包的转发流程。由于个人电脑条件有限,只能在vmware虚拟机环境下搭建dpdk环境。dpdk源码分析系列的所有文章都是基于这套环境来分析。1、vmware虚拟机上安装ubuntun系统, ubuntu版本为12.04; linux内核版本为3.13.0-32-generic。我的...

2019-06-16 16:10:18 5972 8

原创 nginx负载均衡的关闭

在前面的文章中,已经分析了nginx如何结束一个http请求,可以调用http框架的ngx_http_finalize_request或者调用http框架提供的接口ngx_http_terminate_request暴力的终止一个请求。 但接收一个upstream负载均衡请求却不能调用这两个接口,因此调用这两个接口的话,nginx与下游客户端的请求与tcp连接是释放了,但nginx与上游服务器的连

2017-10-02 17:12:06 2461 2

原创 nginx负载均衡之加权轮询

当nginx作为代理服务器时,需要将客户端的请求转发给后端服务器进行处理,如果后端服务器有多台,那如何选择合适的后端服务器来处理当前请求,也就是本篇文章要介绍的内容。nginx尽可能的把请求分摊到各个后端服务器进行处理,以保证服务的可用性和可靠行,提供给客户端更好的用户体验。负载均衡的直接目的只有一个,尽量发挥多个后端服务器的整体性能,实现1+1大于2的效果。        nginx

2017-10-02 15:06:15 1712

原创 nginx处理post请求(http响应包体收发之上游网速优先策略)

上一篇文章分析了在下游网速优先策略下,nginx是如何接收来自后端服务器的响应包体,以及如何把来自后端服务器的响应包体转发给客户端的。本篇文章接着分析另一种http响应包体收发策略----上游网速优先策略。        上游网速优先,即nginx接收后端服务器的响应包体要比下游客户端接收来自nginx的响应包体更快。在这种情况下,nginx需要开辟多个缓冲区,尽可能多的缓存来自后端服务器的响

2017-10-02 07:11:17 3083

原创 nginx处理post请求(http响应包体收发之下游网速优先策略)

nginx接收来自后端服务器响应包括两个阶段,一个是接收来自后端服务器的http响应头部, 在上一篇文章已经详细分析了这个过程;另一个是接收来自后端服务器的http响应包体。 不论接收来自后端服务器的http响应头部还是http响应包体, 这都是一个接收过程。         以此同时nginx作为代理服务器,在接收到来自后端服务器的响应后,是需要把响应数据发给下游客户端的, 这是一个发送过程

2017-09-22 07:31:29 1872

原创 nginx处理post请求(http响应头部的收发)

上一篇文章分析了nginx如何发送来自客户端的请求数据到后端服务器, 本篇文章开始将分析nginx如何接收来自后端服务器的响应。nginx接收来自后端服务器的响应分为两个过程,一个是接收来自后端服务器的http响应头部, 另一个是接收来自后端服务器的响应包体。        有必要在最前面说明,也是很重要的几点。(1)nginx在收到来自客户端的全部请求数据后,采用边发送请求数据到后端服务器,

2017-09-16 12:37:30 26021 1

原创 nginx处理post请求之数据转发

上一篇文章分析了nginx在处理post请求时,如何启动upstream这个负载均衡模块。它是一个http框架,由它来调度具体的模块,例如fastcgi, proxyd反向代理等,这些模块负责将来自客户端 的请求包体,请求包体转为与后端服务器通信的格式。本篇文章来分析nginx是如何将已经转换后的报文发给后端服务器。一、转发请求数据到后端服务器流程//与后端服务器建立连接,并注册读写事件的

2017-09-15 06:42:50 13845 1

原创 nginx处理post请求(负载均衡启动)

NGX_HTTP_CONTENT_PHASE阶段的checker方法为:ngx_http_core_content_phase//NGX_HTTP_CONTENT_PHASE阶段的checker方法ngx_int_t ngx_http_core_content_phase(ngx_http_request_t *r, ngx_http_phase_handler_t *ph){ //fa

2017-08-05 06:45:20 6284

原创 nginx子请求并发处理

子请求并发http协议标准的概念,可以说是nginx所特有的设计, 为什么需要子请求呢? 一般认为这主要是为了提高nginx内部对单个客户端请求处理的并发能力。如果客户端的某个主请求访问了多长资源(例如通过ssi功能包含了a.html, b.hmtl、c.html三个资源), 那么对每一处资源访问建立一个子请求并让它们同时进行,效率自然会更高。 所谓的子请求,并不是由客户端直接发起的,它是由ng...

2017-07-13 07:11:15 6496 3

原创 nginx延迟关闭机制SO_LINGER

经过前面文章的分析可以知道,nginx在释放一个请求时,到底要不要释放在这个请求基础上的TCP连接,是由keepalive机制与延迟关闭机制决定的。虽然http请求是被释放了, 但可能在这个TCP连接上稍后还有其他http请求到来,因此请求是被释放了,但TCP连接可能没有马上被释放。keepalive机制在上一篇文章已经分析了,现在来分析下延迟关闭的处理过程。一、延迟关闭背景介绍...

2017-07-12 06:31:06 6348 1

原创 nginx长连接keepalive与pipeline

tcp与http都支持keepalive机制,但两者是不同的。先看下tcp的keepalive机制。当客户端与服务器建立了tcp连接后,如果客户端一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时,服务器如何去确定对方还在线。到底是掉线了还是确实没有数据传输,连接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。TCP协议通过一种巧妙的方式去解决这个问题,当超过一.........

2017-07-11 06:11:28 4534 2

原创 nginx释放请求与tcp连接

前面的文章分析了nginx服务器如何接收http请求行、请求头部、然后调用各个模块共同协作处理请求、以及接收包体等过程。现在来分析下nginx服务器是如何结束一个http请求的(关闭http请求与tcp连接)。结束一个http请求的过程就复杂多了,在结束一个请求过程中,nginx考虑了各种可能出现的场景。例如: (1)在客户端访问的文件不存在时,如果指定了error page指令,则在请求结束时发...

2017-07-08 06:10:12 10144 3

原创 nginx丢弃http包体处理

http框架丢弃http请求包体和上一篇文章http框架接收包体, 都是由http框架提供的两个方法,供http各个模块调用,从而决定对包体做什么处理。是选择丢弃还是接收,都是由模块决定的。例如静态资源模块,如果接收到来自浏览器的get请求,请求某个文件时,则直接返回这个文件内容给浏览器就可以了。没有必要再接收包体数据,get请求实际上也不会有包体。因此静态资源模块将调用http框架提供的丢弃包体

2017-06-30 08:10:05 3902 1

原创 nginx接收包体处理

在http中,一个请求通常由必选的请求行、请求头部、以及可选的包体组成。因此在接收完http头部后,就使用状态机调度各个http模块处理请求了,然后由各个http模块决定如何处理包体。 http框架提供了2种处理包体的方法供http模块调用(接收包体与丢弃包体), 这两种处理包体的方法对http各个模块来说是透明的,也就是说http模块不需要关心框架是如何处理包体的。  http模块只需要调用ht

2017-06-29 23:46:00 5340

原创 nginx断点续传

有些时候客户端可能只需要请求nginx服务器上的部分数据, 例如: 我们在看电影时, 常常拖动快进条,跳到指定的位置开始观看。 这其实是nginx的断点续传功能, 从指定位置开始观看,相当于向nginx服务器请求某个位置开始的以后的内容。假设nginx服务器上有一个文件,文件的内容为: "0123456789abcdef"一共16个字节。如果客户端只需要2345共4个字节的数据, 则可以在http

2017-06-23 00:32:18 12018

原创 nginx过滤器模块

nginx服务器给客户端发送响应时,包括http响应头部、http响应包体内容。可以调用http框架提供的两个函数ngx_http_send_header,ngx_http_output_filter,分别用于给客户端发送http响应头部、http响应包体。这两个函数会调用各个过滤器模块,对将要发送给客户端的响应头部、响应包体进行过滤处理。例如: 是否需要添加http响应头部字段、是否需要断点续传

2017-01-15 22:42:11 3734

原创 nginx静态模块分析

在上一篇文章中,已经分析了http框架是如何调度各个http模块,共同协作完成一个请求的。现在分析静态模块,看下这个具体的http模块做了些什么。ngx_http_static_module静态模块会从客户端发来的http请求行中获取到文件名(例如: /GET /home/abc.txt  HTTP/1.1),在服务器中查找相应的文件名,并给客户端返回文件内容。在ngx_http_block函数中

2017-01-15 17:12:48 2420

原创 nginx处理http请求

上一篇文章分析了ngixn服务器如何接收客户端发来的http请求行、http请求头部。本文在这基础上分析nginx服务器收到http请求行、请求头部后,http框架是如何调度各个http模块共同完成这个http请求。例如: http框架调度静态模块,获取服务器目录下的某个html页面返回给客户端; 或者http框架调度access权限访问模块,判断这个客户端是否有权限访问服务器。一、event

2017-01-15 14:56:53 5770 3

原创 ngxin请求行与请求头处理

上一篇文件分析了nginx服务器接收到客户端的连接后,会创建一个连接对象,但此时没有涉及到任何的http模块。本文在上一章基础下分析nginx接收到http请求后的初始化流程、接收http请求行、接收http请求头部的流程。

2017-01-15 01:15:47 2559

原创 nginx事件模块之客户端连接与超时管理

        上一篇文章分析了nginx是如何管理监听事件,并把监听事件注册到epoll事件管理器中。接下来在这基础上分析当有客户端连接请求到来时,nginx是如何与客户端建立tcp连接,以及连接建立后又是如何管理超时事件。一、连接事件管理        在函数ngx_event_process_init中,会设置读事件的回调为ngx_event_accept。 这样设置后,在nginx...

2016-12-27 07:26:34 3312

原创 nginx监听事件流程

在前面的几篇文章中已经分析了master进程、work进程的初始化流程。但一直没有分析监听socket的创建流程,nginx服务器只有在创建socket, 绑定socet,监听socket执行完成后,才能处理来自客户端的连接。ngx_cycle_t结构中有一个listening成员,存放的就是所有监听socket。接下来分析下首先分析socket内部结构,然后分析什么时候把监听socket添加到l

2016-12-15 07:51:20 5071

原创 nginx配置解析之配置合并

上一篇文件分析了解析nginx.conf的流程,解析完成后将把各个配置项存放到各个模块的上下文结构中。这没有对http模块、server模块、location模块公共部分进行合并处理。接下来分析nginx是如何合并http模块、server模块、location模块公共部分。假设nginx.conf配置文件结构如下http{ //server块1 server { //loc

2016-12-11 23:31:34 5592

原创 nginx配置解析流程

上一篇文章分析了nginx配置文件缓冲区的管理,接下来将详细分析nginx是如何解析配置文件的。包含模块上下文结构的创建、core核心模块的解析、event事件模块的解析、http模块的解析。一、模块上下文结构创建        nginx中的核心模块、事件模块、http模块、赋值均衡模块,反向代理模块等,每一个模块都有一个上下文结构。在解析nginx.conf配置文件时,会将解析出的命令

2016-12-11 14:43:58 2629 3

Linux c程序设计大全(吴岳) 完整版 pdf 下

这是完整版的Linux c程序设计大全, 作者吴岳。网络上下载的都是只有部分章节,而这里提供的是完整版的书籍供下载使用。 由于书籍容量大,每次上传大小有限制,特分成三个压缩包(上,中,下),您现在下载的是下部分。">这是完整版的Linux c程序设计大全, 作者吴岳。网络上下载的都是只有部分章节,而这里提供的是完整版的书籍供下载使用。 由于书籍容量大,每次上传大小有限制,特分成三个压缩包(上,中,下),您现在下载的是下部分? [更多]

2014-06-30

Linux c程序设计大全(吴岳)--- 完整版 pdf (中)

这是完整版的Linux c程序设计大全, 作者吴岳。网络上下载的都是只有部分章节,而这里提供的是完整版的书籍供下载使用。 由于书籍容量大,每次上传大小有限制,特分成三个压缩包(上,中,下),您现在下载的是中部分。

2014-06-30

linu C程序设计大全 吴岳 完整版 上

这是完整版的Linux c程序设计大全, 作者吴岳。网络上下载的都是只有部分章节,而这里提供的是完整版的书籍供下载使用。 由于书籍容量大,每次上传大小有限制,特分成三个压缩包(上,中,下),您现在下载的是上部分。">这是完整版的Linux c程序设计大全, 作者吴岳。网络上下载的都是只有部分章节,而这里提供的是完整版的书籍供下载使用。 由于书籍容量大,每次上传大小有限制,特分成三个压缩包(上,中,下),您现在下载的是上部分? [更多]

2014-06-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除