一般来讲一个页面是4KB,一个页面对应若干个“块”。 Page Cache对于磁盘IO的性能表现极度重要。比如,当通过write API写入数据到磁盘时,数据先会被写入到Page Cache。 磁盘IO的优化 除非用Direct IO,对于磁盘IO的优化主要在读取操作上。这是因为写入时总是写到Page Cache,而写内存比写磁盘要高效的多。 从业务上讲,一般来讲上传文件的请求量要远远小于获取文件(图片、html、js、css……),所以在Web场景下,对磁盘IO的优化的主要思路其实很简单——尽量保证要读取的文件在内存里,而不是取磁盘上读取。 Linux AIO Linux中的另外一套AIO接口被称为Linux AIO,是Linux在内核实现的一套AIO接口。这套是"真・AIO"。接口的详细用法可以参考这里。 此外Linux AIO对一些特定的文件系统支持不好(比如ext4,在这种操作系统上调用io_submit,还是会“卡”)。
一、先把优化方向说清楚现在做内容的目标不仅仅是 SEO 排第几,而是被选进 AI 答案。AI 搜索会把页面切成可复用的小块,再按权威与相关性拼答案。 4. 常见坑长墙式大段落,观点混在一起,难拆分。关键答案藏在折叠 / Tab,渲染不稳定易被忽略。核心信息只在 PDF / 图片里,缺少 HTML 结构信号。
上一篇文章 主要分析了 Linux 原生 AIO 的原理和使用,而这篇要介绍的是 Linux 原生 AIO 的实现过程。 所以,我们可以通过分析这三个函数的实现来理解 Linux 原生 AIO 的实现。 Linux 原生 AIO 实现在源码文件 /fs/aio.c 中。 调用 aio_setup_ring 函数初始化环形缓冲区。 函数 if (file->f_op->aio_read) ret = file->f_op->aio_read(req, buf, iocb->aio_nbytes 不同的文件系统,其 aio_read 方法的实现不一样,如 Ext3 文件系统的 aio_read 方法会指向 generic_file_aio_read 函数。
Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。 在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。 同步与异步 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。 伪异步 IO 为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化一一一后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系 代码示例出自闪电侠的博客,原地址如下: https://www.jianshu.com/p/a4e03835921a 客户端 /** * * @author 闪电侠 * @date 2018年10
// 3.不停的轮询 while (selectionKeys.hasNext()) { // 4. .设置服务器通道为非阻塞模式,true为阻塞,false为非阻塞 socketChannel.configureBlocking(false); // 4. (); // 3.读取数据,返回 int count = socketChannel.read(readBuffer); // 4. AIO服务端代码,负责创建服务器通道,绑定端口,等待请求。 ]+(random.nextInt(10)+1); myClient.write(expression); } } } 4 常见面试题 4.1 IO
以上的两组概念可以两两组合,就组合了我们熟悉的BIO、NIO、AIO。 3. 4. 同步非阻塞I/O(NIO): 同步非阻塞I/O,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。 NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,jdk1,4开始支持。 AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk1.7开始支持。 AIO:我在厕所外做别的事,等有人来通知我了我再去占坑。
16.BIO、NIO、AIO 有什么区别? BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。 AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
所以本文也附带介绍了Linux 2.6及以后版本新增的AIO特性(因为这跟Java AIO是对应关系)。 Java AIO 1基本原理 目前为止,Java共支持3种网络编程模型:BIO、NIO、AIO: Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理 Linux AIO 1Linux AIO 简介 Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。 3异步 I/O(AIO) 的动机 从前面 I/O 模型的分类中,我们可以看出 AIO 的动机。这种阻塞模型需要在 I/O 操作开始时阻塞应用程序。这意味着不可能同时重叠进行处理和 I/O 操作。 总结 使用异步 I/O(AIO)可以帮助我们构建 I/O 速度更快、效率更高的应用程序。
一般来讲一个页面是4KB,一个页面对应若干个“块”。 Page Cache对于磁盘IO的性能表现极度重要。比如,当通过writeAPI写入数据到磁盘时,数据先会被写入到Page Cache。 磁盘IO的优化 除非用Direct IO,对于磁盘IO的优化主要在读取操作上。这是因为写入时总是写到Page Cache,而写内存比写磁盘要高效的多。 从业务上讲,一般来讲上传文件的请求量要远远小于获取文件(图片、html、js、css……),所以在Web场景下,对磁盘IO的优化的主要思路其实很简单——尽量保证要读取的文件在内存里,而不是取磁盘上读取。 Linux AIO Linux中的另外一套AIO接口被称为Linux AIO,是Linux在内核实现的一套AIO接口。这套是"真・AIO"。接口的详细用法可以参考这里。 此外Linux AIO对一些特定的文件系统支持不好(比如ext4,在这种操作系统上调用io_submit,还是会“卡”)。
比如你弄4个线程,那么最大4个线程都Block了就没法响应更多请求了。 要是操作IO接口时,操作系统能够总是直接告诉有没有数据,而不是Block去等就好了。于是,NIO登场。 poll优化了select的一些问题。比如不再有3个数组,而是1个polldfd结构的数组了,并且也不需要每次重设了。数组的个数也没有了1024的限制。 在t4,我们故意不读取所有的数据出来,只各自读50bytes。然后在t5重新注册两个事件并监听。
- IO 模型的基本概念 - 同步阻塞IO(Blocking IO):即传统的IO模型。 同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 多路复用IO(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型(Redis单线程为什么速度还那么快,
BIO, NIO, AIO,本身的描述都是在Java语言的基础上的。 而描述IO,我们需要从三个层面: 编程语言 实现原理 底层基础 从编程语言层面 BIO, NIO, AIO以Java的角度理解: BIO,同步阻塞式IO,简单理解:一个连接一个线程 NIO,同步非阻塞IO 而AIO,在windows上是通过IOCP实现的,在linux上还是通过epoll来实现的。 这里强调一点:AIO,这是I/O处理模式,而epoll等都是实现AIO的一种编程模型;换句话说,AIO是一种接口标准,各家操作系统可以实现也可以不实现。 Linux上还没有真正实现网络方式的AIO。
AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
---- IO 概述 IO 的操作方式通常分为几种:同步阻塞 BIO、同步非阻塞 NIO、异步非阻塞 AIO。 (1)在 JDK1.4 之前,我们建立网络连接的时候采用的是 BIO 模式。 (3)AIO 也就是 NIO 2,在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO 模型。 异步非阻塞 IO(AIO) (1)AIO 也就是 NIO 2,在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞 的 IO 模型。 异步 IO 是基于事件和回调机制实现的,也就是说 AIO 模式不需要selector 操作,而是是事件驱动形式,也就是当客户端发送数据之后,会主动通知服 务器,接着服务器再进行读写操作。 (2)Java 的 AIO API 其实就是 Proactor 模式的应用,和 Reactor 模式类似。
为什么要优化? 优化的好处 1.提升网页响应速度 2.有利于搜索引擎搜索 3.对后期维护比较方便 怎么优化? 1.减少请求 2.减少文件的大小 3.页面性能 4.可读性、维护性 1.图片合并 2.css文件合并 (多个css文件合并为一个、少量的行内样式、避免import的方式引入文件) 3.减少图片的大小 (选择合适的图片格式) 4.css值缩写 5.0px 中px省略 0% 0 0.5可以写成.5 6.选择器合并 7.link标签引入样式放到head标签中 8.js脚本建议放在底部,等页面加载完之后再处理 尽量用语义化的标签来编写,有利于seo 15.类型和id名,以内容语义来命名 16.避免hack 17.模块化(一系列相关的结构做成一个模块来处理) 18.必要的时候添加注释,可读性比较好 比如说代码优化 ,大家试着说一下怎么优化?
优化脚本 一般此过程会非常漫长,可以写一个脚本来后台运行,或简单的控制一下IO [hunter@opti-slave ~]$ cat opti.bash #! opti.bash >> /path/to/optimize.log 2>&1 & 通过监控 optimize.log 来判断执行完成状态 也可以通过查看监控,IOPS很能反映问题 ---- 恢复备份 优化完成后 ,立刻恢复备份 start slave; 通过对比前后数据文件大小,可以明显看到优化效果 一般少也能缩减5%的空间,平均在10%左右,我自己经历最明显效果的是减少了32%的空间,对于一个大库来说,能节省不少磁盘空间 ,并且对查询性能也有一定优化效果 ---- 命令汇总 pt-table-checksum --nocheck-replication-filters --nocheck-binlog-format --
1.ORDER BY的优化 某些情况下,MySQL使用索引排序,尽量避免使用 filesort 即使ORDER BY与索引不完全匹配,也可以使用索引,只要索引的未使用部分和额外的 如果是这样,优化器可能不使用索引。如果SELECT*只选择索引列,则使用索引并避免排序。 * FROM t1 WHERE key_part1 = constantORDER BY key_part2; ---- 假设 key_part1不是索引或索引的一部分,在条件中作为常量条件存在,则优化器也会使用索引 为了获得文件排序操作的内存,从MySQL8.0.12开始,优化器会根据需要递增地分配内存缓冲区,直到达到sort_buffer_size系统变量指定的大小,而不是像MySQL8.0.12之前那样预先分配固定数量的
---- 下面分析下 阻塞I/O、NIO、AIO的数据处理流程 阻塞I/O 数据处理流程 ? 3.AIO 数据处理流程 ? AIO 实现原理 程序调用AIO的accept方法并传入Completionhandler,该方法是非阻塞方法。 程序只需要把具体的操作告知AIO就可以了,具体操作AIO来帮助你来操作。 NIO 和 AIO 性能上对比 AIO在性能上相对于NIO没有本质的提升。 AIO只是帮助你从内核中将数据复制到用户空间中,并调用你传入的回调方法。 NIO 是需要程序自己从内核中将数据复制到用户空间中,并需要程序自己调用相应的处理逻辑。 ----
).iterator(); //3 进行遍历 while(keys.hasNext()){ //4 异步非阻塞 AIO (NIO.2) 原理 服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理。 AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用操作系统参与并发操作,编程比较复杂,JDK7开始支持。 所以出现AIO。 如果你理解了Java NIO ,下面讲的netty也是水到渠成的事,只想说,深水区已过了! 差点忘记还要补下AIO的,这个比NIO先进的技术,最终实现了netty。 、AIO适用场景
面试官问:“说说 BIO、NIO、AIO 的区别?” 你脑子里蹦出几个词:“阻塞”、“非阻塞”、“异步”,但串不起来,说不完整…… 一、先搞懂:BIO、NIO、AIO 到底是谁? 在 Java AIO 中: 所有 IO 操作都是异步的 调用 read() 后立即返回,不阻塞 数据准备好后,通过 回调函数 或 Future 通知你 // AIO 服务器示例(基于回调) AsynchronousServerSocketChannel 五、BIO、NIO、AIO 对比总结 特性 BIO NIO AIO 模型 同步阻塞 同步非阻塞 异步非阻塞 核心机制 每连接一线程 多路复用(Selector) 回调 / Future 是否阻塞 是(read Q4: Netty 用的是 NIO 还是 AIO? 答: Netty 默认使用 NIO(基于 NioEventLoopGroup),因为 NIO 在 Linux 上性能稳定,且 API 成熟。 谁性能最强 理论 AIO > NIO > BIO,但实际 NIO 最常用 面试怎么说 “我理解 NIO 的多路复用原理,项目用 Netty(NIO)做高性能通信” 最后一句话 BIO、NIO、AIO