软中断softirq的CPU使用率升高
中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。中断其实是一种异步的事件处理机制,可以提高系统的并发处理能 力。 由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中 断处理程序就需要尽可能快地运行。 中断处理程序在响应中断时,还会临时关闭中断。这就会导致上一次中断处理完成 之前,其他中断都不能响应,也就是说中断有可能会丢失。 为什么有硬中断和软中断区分?为了解 决中断处理程序执行过长和中断丢失的问题,****Linux 将中断处理过程分成了两个阶段,也就 是上半部和下半部: 上半部直接处理硬件请求, 硬中断,特点是快速执行; 网卡接收到数据包后: 会通过**硬件中断**的方式,通知内核有新的数据到了。 同时把网卡的数据读到内存中,然后更新一下**硬件寄存器的状态(表示数据已经读好了),最后再发送一个软中断信号**,通知下半部做进一步 的处理。 硬中断是硬件产生的,比如键盘、鼠标的输入,硬盘的写入读取、网 卡有数据了; 下半部则是由内核触发, 软中断,特点是延迟执行。通...
迭代器模式Iterator
定义迭代器的接口,以及对应的hasNext以及next方法 注意定义的时候使用泛型,不然接口方法的返回值只能是Object,实际使用的时候还需要强制转换 在被迭代的接口里面定义获取迭代器的方法 注意使用泛型 在需要被迭代的对象里面实现一个具体迭代器,专属于这个对象的迭代器以及对应的迭代方法,每一个对象的迭代遍历的方法应该是不一样 注意实现被迭代接口的时候标注的泛型依旧是被迭代对象 public class MyArrayList<E> implements MyCollection<E> 实现(注意适应泛型)定义迭代器的抽象方法1234567891011package com.deltaqin.designPattern.d06_iterator;/** * @author deltaqin * @date 2021/3/27 10:38 上午 */public interface MyIterator<T> { boolean hasNext(); T next();} 定义集合的抽象方法12...
读取了Request输入流,请求数据就不见了
HttpServletRequest 和 HttpServletResponse 中存在方法互斥。 在过滤器、拦截器中对 HTTP 请求中的数据做校验、审计是非常常见的需求 Request 输入流数据一但被读取,Controller找不到了Request 的 getlnputStream 和 getReader 都只能使用一次 请求数据解析工具: 定义拦截器: 发起请求: Request的 getlnputStream、 getReader、 getParameter 方法互斥,也就是使用了其中一个,再使用另外的两个,是获取不到数据的。 Response 也是一样的,与 Request 几乎是一样的 互斥效果的原理: getParameter 内部也会判断: 无法重复读取的原理读取完坐标没有重置: getReader 也是没有重置坐标 HttpServletRequestWrapper + Filter 解决输入流不能重复读取问题其实是包装器模式,实现对请求数据的包装。 自定义请求包装器: 每次获取数据的时候都是重新从数组里面获取 这个方法直接调用上面重写的 g...
网络知识总结
processon processon 基于网络层,结合 Linux 系统的网络协议栈和网络收发流程。分析和定位网络瓶颈。定位出网络性能瓶颈后,根据瓶颈所在的协议层,进行优化。从应用程序、套接字、传输层、网络层再到链路层等,对每个层次进行逐层优化。 无法使用协议优化的时候,可以考虑,使用 DPDK 等用户态方式,绕过内核协议栈;或者,使用 XDP,在网络包进入内核协议栈前进行处理。 性能指标和工具 各层性能优化获得网络基准测试报告,然后通过相关性能工具,定位出网络性能瓶颈。再 接下来的优化工作 应用程序–主要对网络 I/O 和进程自身工作模型的优化。 网络 I/O 的角度 I/O 多路复用技术 epoll,主要用来取代 select 和 poll。是解决 C10K 问题的关键 使用异步 I/O(Asynchronous I/O,AIO)。AIO 允许应用程序同时发起很多 I/O 操作,而不用等待这些操作完成。等到 I/O 完成后,系统会用事件通知的方式,告诉应 用程序结果。不过,AIO 的使用比较复杂...
IO体系
节点流:直接和设别,特定地方读写 过滤流:(装饰器模式)节点流作为输入或者输出,使用一个存在的输入或者输出流来创建(作为参数传递进去) IO流的链:数据–》缓冲输出流–》文件输出流–》文件。装饰器模式的作用,获取一个 装饰器模式NIO–面向块或者缓冲区编程1.4出来的 NIO组件回顾 Java NIO,它不仅仅可以用在网络编程中,还能用在文件读写等其它场景 Channel–桥梁 java.nio.channels.Channel 实体之间的桥梁,实体可以是硬件设备,文件,网络套接字或者可执行IO操作的程序(Linux中一切皆文件) 不同实体(文件)类型对应不同的类型的Channel: FileChannel : 操作普通文件 DatagramChannel:UDP协议 SocketChannel:TCP协议,客户端和服务端之间的Channel ServerSocketChannel:TCP协议,用于服务端的Channel Buffer–数据容器线性有序序列(数组),存储特定的基本类型。Buffer的类型有CharBuffer,ByteBuffer, ShortBuf...
输入输出和存储系统
AMDAHL定律(阿姆达尔)计算机系统整体性能的速度提升(加速比)取决于某个特定部件本身的加速率和该部件在系统中的使用率。公式表示为 式中,S为系统整体性能的加速率,f表示待替换部件完成的工作部分,k为新部件的加速率。 例如,某计算机需要70%时间执行CPU操作和30%时间等待磁盘服务,当前有两种升级方案:10000使得处理器价格提高50%,或7000使得磁盘处理能力为当前系统的250%。若选择升级处理器,则f = 0.70,k = 1.5,S = 1 / ((1-0.7)+0.7/1.5) = 1.30;若选择升级磁盘,则f = 0.30,k = 2.5,S约为1.22。由此可看出升级处理器带来的整体性能提升更高,但考虑价格因素,对提升的每个百分点,升级CPU需要333,而升级磁盘只要318。 计算加速比: A为200,B为100,A是B的2倍,A比B快2倍,A比B快100%, 加速比就是1+N/100,而不是N,CPU比当前的快了50%,则它的加速比就是1.5 阿姆达尔的应用: 通用...
ApacheMapStruct常用总结
Apache MapStruct 常用总结 只是简单使用还是比较简单的,但是有一些细节还是要注意的,不然会不知不觉出错 MapStruct 是一个用于生成类型安全的 bean Mapper类。也就是不同类型对象之间的转换器,一般的assembler以及convertor,不用手动写实现避免错误。 https://mapstruct.org/documentation/stable/reference/html/#Preface 要做的就是定义一个映射器接口,该接口声明任何所需的映射方法。在编译期间,MapStruct 将生成此接口的实现。这个实现使用普通的Java 方法调用来映射源对象和目标对象 @Mapping方法:https://mapstruct.org/documentation/stable/api/org/mapstruct/Mapping.html 依赖12345678910111213141516171819202122232425262728293031323334...<properties> <org.mapstruct.vers...
通过一台服务器采集所有阿里云账单费用数据
费用视图预览 安装部署 说明:示例 Linux 版本为:CentOS Linux release 7.8.2003 (Core)通过一台服务器采集所有阿里云账单费用数据 前置条件 服务器 <安装 Datakit> 服务器 <安装 Func 携带版> 阿里云 RAM 访问控制账号授权 RAM 访问控制 登录 RAM 控制台 https://ram.console.aliyun.com/users 新建用户:人员管理 - 用户 - 创建用户 保存或下载 AccessKeyID 和 AccessKey Secret 的 CSV 文件 (配置文件会用到) 用户授权(账单权限) 配置实施 登录 Func,地址 http://ip:8088(默认 admin/admin) 输入标题/描述信息 编辑脚本 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616...
适配器_转换器模式adapter
Target(目标接口):所需要转换的所期待的接口 Adaptee(源角色):需要适配的接口 Adapter(适配器):将原接口适配成目标接口,继承原接口,实现目标接口 一些流处理器是对其它类型的流源的适配。这就是适配器模式的应用 FutureTask接收Runnabel转换为Callable 使用的是Executors 里面的RunnableAdapter 自己有Runnable属性,自己还实现了Callable接口。在call里面调用了run方法,实现适配、 传进去Runnable,拿到一个Callable来使用 [Input/Output]Stream[Reader/Writer]流InputStreamReader实现了Reader接口,并持有了InputStream的引用,这里是通过StreamDecoder类间接持有的,因为从byte到char要经过解码。 适配器就是InputStreamReader类, 源角色就是InputStream代表的实例对象, 目标接口就是Reader类了。 I/O类库中还有很多类似的用法,如Stri...
远程仓库操作
git clone远程仓库: git clone 远程使用虚线表示 本地仓库多了一个名为 o/master 的分支, 这种类型的分支就叫远程分支。远程分支反映了远程仓库(在你上次和它通信时)的状态。 远程分支有一个特别的属性,在你检出时自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。 为什么有 o/?远程分支有一个命名规范 —— 它们的格式是: <remote name>/<branch name> 因此,如果你看到一个名为 o/master 的分支,那么这个分支就叫 master,远程仓库的名称就是 o。 大多数的开发人员会将它们主要的远程仓库命名为 origin,并不是 o。这是因为当你用 git clone 某个仓库时,Git 已经帮你把远程仓库的名称设置为 origin 了不过 origin 对于我们的 UI 来说太长了,因此不得不使用简写 o :) 但是要记住, 当你使用真正的 Git 时, 你的...
