epoll 的本质是什么?
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。
epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么?
网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。
本文核心思想是:要让读者清晰明白 epoll 为什么性能好。
文章会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。
一、从网卡接收数据说起下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。
计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构)
下图展示了网卡接收数据的过程。 ...
Reactor 3快速上手
1.3.2 Project ReactorProject Reactor(以下简称“Reactor”)与Spring是兄弟项目,侧重于Server端的响应式编程,主要 artifact 是 reactor-core,这是一个基于 Java 8 的实现了响应式流规范 (Reactive Streams specification)的响应式库。
本文对Reactor的介绍以基本的概念和简单的使用为主,深度以能够满足基本的Spring WebFlux使用为准。在下一章,我会结合Reactor的设计模式、并发调度模型等原理层面的内容系统介绍Reactor的使用。
光说不练假把式,我们先把练习用的项目搭起来。先创建一个maven项目,然后添加依赖:
12345<dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> <version>3.1.4.RELEASE</version> ...
Linux 的 Page Cache
1. Page Cache1.1 Page Cache 是什么?为了理解 Page Cache,我们不妨先看一下 Linux 的文件 I/O 系统,如下图所示:
Figure1. Linux 文件 I/O 系统
上图中,红色部分为 Page Cache。可见 Page Cache 的本质是由 Linux 内核管理的内存区域。我们通过 mmap 以及 buffered I/O 将文件读取到内存空间实际上都是读取到 Page Cache 中。
1.2 如何查看系统的 Page Cache?通过读取 /proc/meminfo 文件,能够实时获取系统内存情况:
12345678910111213141516$ cat /proc/meminfo...Buffers: 1224 kBCached: 111472 kBSwapCached: 36364 kBActive: 6224232 kBInactive: 979432 kBActive(anon): 6173036 kBInactive( ...
Mysql缓存、索引、事务等总结
一条SQL语句过来的流程是什么样的?那就follow me。哈哈哈哈,皮一下很开心。1.当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。2.在正式查询之前,服务器会检查查询缓存,如果能找到对应的查询,则不必进行查询解析,优化,执行等过程,直接返回缓存中的结果集。3.MySQL的解析器会根据查询语句,构造出一个解析树,主要用于根据语法规则来验证语句是否正确,比如SQL的关键字是否正确,关键字的顺序是否正确。而预处理器主要是进一步校验,比如表名,字段名是否正确等4.查询优化器将解析树转化为查询计划,一般情况下,一条查询可以有很多种执行方式,最终返回相同的结果,优化器就是根据成本找到这其中最优的执行计划5.执行计划调用查询执行引擎,而查询引擎通过一系列API接口查询到数据6.得到数据之后,在返回给客户端的同时,会将数据存在查询缓存中
查询缓存
我们先通过show variables like '%query_cache%'来看一下默认的数据库配置,此为 ...
零拷贝技术
内存拷贝是比较耗时操作,零拷贝是常用优化手段,今天分享的文章就是 Linux 系统零拷贝技术,「Kafka」和「MySQL开源组件」都用到这个核心技术,希望大家可以掌握。
「DMA 与零拷贝技术」
❝
「注意事项」:除了 Direct I/O,与磁盘相关的文件读写操作都有使用到 page cache 技术。
❞
1. 数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用:
File.read(file, buf, len);
Socket.send(socket, buf, len);
例如消息中间件 Kafka 就是这个应用场景,从磁盘中读取一批消息后原封不动地写入网卡(NIC,Network interface controller)进行发送。
在没有任何优化技术使用的背景下,操作系统为此会进行 4 次数据拷贝,以及 4 次上下文切换,如下图所示:
如果没有优化,读取磁盘数据,再通过网卡传输的场景性能比较差:
4 次 copy:
CPU 负责将数据从磁盘搬运到内核空间的 Page Cache 中;
CPU 负责将数据从内核空间的 S ...
Dubbo 泛化引用和泛化实现
开篇 在Dubbo官方文档中关于泛化调用和泛化实现的说明,这里针对文档的案例做一些简单的说明和解释。
例子123456789101112131415161718// 引用远程服务 // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();reference.setApplication(new ApplicationConfig("dubbo-demo-api-consumer"));reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));// 弱类型接口名reference.setInterface("org.apache.dubbo.demo.DemoService");// 声明为泛化接口 reference.setGeneric(&quo ...
mapStruct对象属性转换
日常开发中,我们时长会写很多关于PO转VO的代码或者是VO转DTO相关的代码,造成我们的程序异常的臃肿。 如下:
1234567891011121314151617181920public static ParkinglotVO DTOcastToVO(ParkinglotDTO parkinglotDTO) { ParkinglotVO parkinglotVO = new ParkinglotVO(); parkinglotVO.address = parkinglotDTO.getContent().getName().getAddress(); parkinglotVO.distance = parkinglotDTO.getDistance().getValue(); parkinglotVO.lat = parkinglotDTO.getContent().getName().getLat(); parkinglotVO.lon = parkinglotDTO.getContent().getName().getLon(); p ...
Elasticsearch慢查询调优
1、引言Elasticsearch是非常灵活且功能丰富的搜索引擎,它提供了许多不同查询数据的方法。在实战业务场景中,经常会出现远远低于预期查询速度的慢查询。作为分布式系统的Elasticsearch,可能有各种影响查询性能的因素,包括外部因素,如负载均衡设置,网络延迟(带宽,NIC卡/驱动程序)等。
本文主要讨论可能导致慢查询的原因以及如何在Elasticsearch的上下文中识别它们。
让我们从一些最常见的慢查询及其解决方案开始。
2.1 症状1:非活动(检索/写入)状态资源利用率也非常高症状详情:每个分片都消耗资源(CPU /内存)。即使没有索引/搜索请求,分片的存在也会消耗集群开销。
2.1.1 问题描述集群中的分片太多,以至于任何查询执行起来都很慢。一个好的经验法则——确保每个节点的非冻结分片数量保持在:20以下/每GB堆内存。
2.1.2 解决方案
1、部署之前,设计先行。正如VIVO搜索技术总监振涛兄所说:“集群规划核心是容量预估,就好比你建个楼,必须规划好容量,不然说用多少就建多高,吃在地基撑不住!!”。
任何部署的良好开端都是执行适当的容量规划,以帮助确定每个搜索用例的 ...
最有用的Elasticseaerch检索技巧
0、前言为了讲解不同类型ES检索,我们将要对包含以下类型的文档集合进行检索:
123451. title 标题; 2. authors 作者; 3. summary 摘要; 4. release data 发布日期; 5. number of reviews 评论数。
首先,让我们借助 bulk API批量创建新的索引并提交数据。
123456789101112PUT /bookdb_index { "settings": { "number_of_shards": 1 }}POST /bookdb_index/book/_bulk { "index": { "_id": 1 }} { "title": "Elasticsearch: The Definitive Guide", "authors": ["clinton gorm ...
Spring Boot 2.0 WebFlux 框架介绍
Spring Boot 2.0 WebFlux框架介绍1、介绍1.1 什么是响应式编程(Reactive Programming)?简单来说,响应式编程是针对异步和事件驱动的非阻塞应用程序,并且需要少量线程来垂直缩放(即在 JVM 内)而不是水平(即通过集群)。
响应式应用的一个关键方面是“背压(backpressure)”的概念,这是确保生产者不会压倒消费者的机制。例如,当HTTP连接太慢时,从数据库延伸到HTTP响应的响应组件的流水线、数据存储库也可以减慢或停止,直到网络容量释放。
响应式编程也导致从命令式到声明异步组合逻辑的重大转变。与使用Java 8的 CompletableFuture 编写封锁代码相比,可以通过 lambda 表达式编写后续操作。
1.2 响应式 API(Reactive API)和 构建块(Building Blocks)Spring Framework 5 将 Reactive Streams 作为通过异步组件和库进行背压通信的合同。Reactive Streams 是通过行业协作创建的规范,也已在Java 9中被采用为 java.util.concur ...