- 博客(100)
- 资源 (1)
- 收藏
- 关注
原创 shell笔记之压测与数据统计
go压测#!/usr/bin/env bashsplit="_"for count in 100 200 400 800; do for rate in 40 60 80 100; do bench_name="$count$split$rate" rm -rf $bench_name mkdir -p $bench_name logDir["$index"]="$bench_name" let "index=$index+1" ## cpu 指
2022-05-11 14:37:12 255
原创 nginx核心参数配置
accept_mutex## 官网参考:http://nginx.org/en/docs/ngx_core_module.html#accept_mutexSyntax: accept_mutex on | off;Default: accept_mutex off;Context: eventsIf accept_mutex is enabled, worker processes will accept new connections by turn. Otherwise, all .
2022-03-23 13:22:11 3322
原创 快速替换指定的文本信息
下载对应的图片并重命名图片资源名称## replace.sh#!/bin/bashindex=1cp $1 temp.mddeclare -A newmapfor uri in $(cat temp.md | egrep "img.*http" | awk -F " " '{print $3}' | awk -F "\"" '{print $2}')do echo "$uri" #echo $index f=$index.${uri##https*.} echo $f last_.
2022-03-19 20:51:15 307
原创 Raft算法(上篇)
Raft算法Raft简述Raft概要基于Multi-Paxos算法的基础上做了一些限制与简化,Raft算法属于强一致性模型的共识算法模型,在集群服务节点中仅有一个leader节点服务来负责所有请求的写入操作.Raft算法主要解决服务节点之间的leader选举,各个服务节点之间的日志同步以及服务节点成员中leader节点服务发生宕机时如何变更来达成最终的共识问题.从本质上是属于强leader模型,一切以leader为准的方式来实现各个服务节点一系列值的共识以及节点之间日志的一致性.Raft算法三种状态
2021-05-06 17:41:11 637
原创 Paxos算法
朴素的Paxos算法简述共识问题描述假设现在有三个服务节点能够进行提案操作,那么Paxos的共识算法就是确保上述服务节点之一的提案数据值能够被选中,也就是说达成共识的安全要求需满足以下三个条件:只有被提案的数据值才具备被选中的资格最终仅有一个提案值能够被选中除非提案的数据值最终被选中,否则进程将无法学习到该提案的数据值考虑三个服务节点都是属于独立部署且需要通过网络进行异步消息通讯,此时建立起一个异步通信且非拜占庭将军问题模型如下:服务节点以任意的运作速度运行,除非出现宕机或者是重启,如果
2020-07-15 10:52:15 592
原创 vim配置
linux下的vim个性化配置" set default encodingset fenc=utf-8set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936" set colorcolorscheme desert" set gui fontset guifont=Bitstream\ Vera\ Sans\ Mono\ 10" use vim to key inset nocompatible" set the rows
2020-06-22 10:41:09 331
原创 分布式理论基础
CAP定理网络分区容错(Partition tolerance)网络连通性服务节点之间的网络通信正常在上述可以看到,服务A集群与冗余服务A1与A2节点形成一个对外闭环的集群,同理服务B也构成一个闭环集群.此时发起一个请求操作,需要通过服务A与服务B进行协作,在服务B节点正常运作情况下,这个时候的分布式网络是处于连通状态,服务A与服务B之间能够进行正常网络通信完成数据协作.网络分区服务节点之间的网络通信发生中断或者是延迟响应出现短时间的中断.在上述的图中,一个请求操作需要通过
2020-06-12 18:06:31 438
原创 MySQL性能分析命令
服务性能简介三个性能服务请求如何确认服务器是否达到了性能最佳状态找出某条sql语句执行慢的原因诊断被用户描述成“停顿”,“堆积”或者是“卡死”的间歇性疑难故障.性能定义为完成某件任务所需要的时间度量,换言之,性能即响应时间,这是一个非常重要的原则.SQL性能分析执行分析 - 基于执行时间的分析等待分析 - 基于等待时间的分析SQL性能优化在一定的工作负载下尽可能地降低响应时间,在SQL服务器中定义的吞吐量指标为单位时间内的查询量.性能优化工具慢查询日志是
2020-06-04 19:24:56 1740 2
原创 分布式共识问题
在讲述分布式的共识问题之前,我们先了解下什么是拜占庭将军问题, 其次从拜占庭将军问题来认识什么是分布式共识问题,与分布式一致性的区分在哪里?然后推演分布式共识问题产生的原因以及解决共识问题的策略算法有哪些,对应的适用场景有哪些?接下来我们可以带着疑问来逐步揭开上述问题的本质.另外这里要先说明一点,这里讲述的服务节点不可用包含网络超时/服务节点出现故障/网络通信被伪造等情况.拜占庭将军问题拜占庭一般性问题拜占庭军队中的每一个师都有自己的将军,并且由该将军负责指挥作战现在拜占庭军队中的将军存在一些叛徒
2020-05-29 09:14:04 2190
原创 分布式网络基础
在分布式服务化架构设计中,服务与服务之间通信均是基于网络底层协议来实现的,于是我们需要对网络相关基础知识有一个基本的认知,这样在我们服务与服务之间进行通信(跨进程通信)过程能够在我们的脑图形成一个基本的数据传输流程以及其中的细节问题,这样对于我们在进行网络问题的排查能够带来一定的帮助.现在开始展开网络基础相关知识的阐述.网络基础知识通信协议什么是协议协议是计算机与计算机之间通过网络通信时事先达成的一种“约定”,这种“约定”使那些由不同的厂商设备,不同的CPU以及不同的操作系统组成的计算机之间,只要遵
2020-05-21 17:57:30 2593
原创 分布式架构设计概要总结
分布式架构概要总结构建分布式的原因业务架构的演进在上图简单以时间线为准,粗略描述了我们系统架构随着业务的需求考量以及业务的发展,系统承担的并发量也将逐步提升,这就要求我们的系统架构需要开始思考如何利用现有的资源来解决。我们目前急需处理并发请求的服务.而思考的方向可以从我们已有的计算机知识体系中找到答案。比如:对于并发问题,我们知道处理共享资源可以通过加锁的方式来保证我们的线程安全,那么在有限的资源下又要如何提升我们的并发量,于是我们很容易想到hashmap是如何处理线程安全的,对此我们就会考虑
2020-05-15 17:09:09 868
原创 深入分析Netty高性能特性
C10K与C10M问题C10K&C10M解决方案C10K问题关于C10K的问题,在先前的epoll技术分析文章已经有讲述过,C10K是属于一个优化问题,即要让单个web服务支撑1w的并发连接,关于C10K的性能与可伸缩性问题,摘录C100M的博文并加入自己的理解:采用线程连接架构TBA模型,也就是1个客户端连接对应1个线程,那么对于内核而言,假设这个时候需要10k个连接,那么...
2020-05-08 13:38:00 795
原创 Netty事件流程分析补充
pipeline责任链流程分析责任链创建流程入口程序// 责任链的创建是在Channel的初始化的时候进行的// AbstractChannel.javaprotected AbstractChannel(Channel parent) { // 如果当前为服务端的channel,则parent=null this.parent = parent; // 创建channe...
2020-04-28 10:46:52 863
原创 深入Netty事件流程分析
Netty框架核心内容丰富的Buffer数据结构Netty在NIO的ByteBuffer基础上自定义一套自己的Buffer API,其实现的Buffer API具备以下特性:如果需要可以自定义自己的buffer类型内建composite buffer类型实现零拷贝机制(无需在内存实现数据复制)可以支持动态扩容,类似于StringBuffer不需要像NIO的Buffer需要每次调用fl...
2020-04-23 18:50:23 990
原创 深入Netty组件分析
讲述netty之前,先看下netty的一个整体结构如下:从上述可以看出,netty核心部分主要有基于可扩展性的事件驱动设计模型实现,通用的通信API(支持的网络协议比较丰富)以及基于ByteBuffer实现的零拷贝机制,同时从web的安全性考虑,netty支持SSL/TLS完整协议.分析Netty的原理之前,我们先看看netty的核心组件有哪些.Netty核心组件netty一个简单示例...
2020-04-16 10:54:16 388
原创 IO事件驱动设计实现
事件驱动架构EDAEDA组件事件源/发起器(event emitters): 负责轮询检测事件状态的变化解复用器(Demultiplexer): 等待从事件源上获取就绪事件的集合,并将就绪事件通过转发器分发给响应就绪事件的处理器进行回调处理事件处理引擎(event handlers): 响应就绪事件发生的处理程序,由开发人员在应用程序上进行定义并针对就绪事件发生的状态进行注册绑定事件队...
2020-04-10 12:21:46 655
原创 高性能IO设计之Reactor模型
在web应用中,为了能够支撑更多的并发连接数,一般会有两种web体系架构设计模式,一种是基于线程的架构,一种是基于事件驱动架构设计。现针对上述两种架构展开分析.基于线程的架构线程与连接1:1模式在服务端使用线程架构的一个基本思想是基于"每个连接对应每个线程"的设计方法,这样设计主要有以下几个方面考虑:可以保证每个请求处理避免线程安全的问题,比如在每个线程中可以使用非线程安全库类完成业...
2020-04-02 21:24:00 445
原创 Epoll技术扩展
Epoll技术回顾基于上一篇的epoll技术存在一些问题,对此将纠正部分要点epoll使用技术使用锁的技术读写锁:内核在操作对象进行轮询的时候加读锁,而通过加写锁为了保证唤醒只执行一次,即在网络socket数据报可达,通过中断上下文调用wake_up()方法来触发回调callback方法的执行,通过callback方法将执行的task添加到CPU就绪队列️中,方便CPU进行调度执行...
2020-03-14 17:22:19 333
原创 深入epoll技术原理分析
阅读之前请先了解Linux内核的wakeup&callback机制以及前文的select与poll技术分析epoll技术为了解决select&poll技术存在的两个性能问题,对于大内存数据拷贝问题,epoll通过epoll_create函数创建epoll空间(相当于一个容器管理),在内核中只存储一份数据来维护N个socket事件的变化,通过epoll_ctl函数来实现对sock...
2020-03-12 18:20:10 371
原创 深入分析select&poll技术原理
IO复用模型本质在讲述IO复用模型之前,需先了解Linux内核的wakeup&callback机制,我们先简单回顾下IO复用模型的思路,从上述的IO复用模型图看出,一个进程可以处理N个socket描述符的操作,等待对应的socket为可读的时候就会执行对应的read_process处理逻辑,也就是说这个时候我们站在read_process的角度去考虑,我只需要关注socket是不是可读状...
2020-03-12 18:16:59 640
原创 Linux之Wakeup&Callback机制
Linux内核的休眠与唤醒机制在Linux内核中存在着等待队列的数据结构,该数据结构是基于双端链表实现,Linux内核通过将阻塞的进程任务添加到等待队列中,而进程任务被唤醒则是在队列轮询遍历检测是否处于就绪状态,如果是那么会等待队列中删除等待节点并通过节点上的回调函数进行通知然后加入到cpu就绪队列中等待cpu调度执行.其具体流程主要包含以下两个处理逻辑,即休眠逻辑以及唤醒逻辑.休眠逻辑...
2020-03-12 18:13:42 1038
原创 Java之IO模型演进
在先前的文章《Unix之IO模型》已经讲述到5种IO模型以及对应的同步异步和阻塞非阻塞相关核心概念,接下来看下Java的IO模型在服务端的网络编程中是如何演进,注意这里用启动Java程序表示一个JVM进程,而JVM进程中以多线程方式进行协作,这里讲述以线程为主展开Java中的BIO演进BIO 概述在上篇文章中讲述到阻塞式IO是应用进程等待内核系统接收到数据报并将数据报复制到内核再返回的...
2020-02-25 22:48:45 562
原创 Unix网络编程之5种IO模型
1. Unix/Linux操作系统简述Unix操作与Linux系统结构图解 (引用计算机操作系统书籍)概要说明用户空间: 姑且将上述用户级别或者是unix编程的应用程序的部分称为用户空间,我们可以通过启动进程来调用内核来完成从硬件设备读取或写入等操作系统内核: 是直接与计算机硬件打交道的应用程序级别,在计算机相关的书籍中也称为操作系统,可以通过操作系统级别提供的一些组件来帮助...
2020-02-23 18:44:12 571
原创 Java并发线程之Lock应用
1. ReentrantLock的基本使用lock使用以及注意事项// task.javapublic class Task { private int count; public void read(){ System.out.println(Thread.currentThread().getName()+"读取count数据:" + count)...
2020-02-19 19:59:42 296
原创 线程核心方法简介
1. 线程终止基于可见性的volatile实现// 定义任务线程class VolatileTask { private volatile boolean flag = false; public void read() { while (!flag){ System.out.println("query data ....")...
2020-02-19 16:31:58 322
原创 合并两个有序链表
1. 合并两个有序链表实现使用递归方式public static LinkedNode mergeWithRecursive(LinkedNode head1, LinkedNode head2){ if(head1 == null && head2 == null){ return null; } if(head1 == null){ return he...
2020-02-08 13:43:41 1115
原创 单向链表实现反转算法
1. 单向链表实现反转java 代码实现// SingleLinked.javapublic class SingleLinked { final static class LinkedNode { LinkedNode next; int item; } private LinkedNode head; private LinkedNode tail; /...
2020-02-07 22:13:33 361
原创 并发编程之线程池原理
1. 线程池作用使用背景在并发大量异步任务处理程序中,每执行一个任务就需要创建一个线程,同时任务执行完毕之后需要将线程销毁.我们知道JVM创建线程的时候需要为其分配线程栈空间以及一些初始化操作,同时销毁的过程需要回收线程栈空间并由gc释放资源,期间都需要耗费一定的时间,因此一个任务的最终执行时间=创建线程newTime + 程序执行excuteTime + 线程销毁的gcTime,如果期...
2020-02-06 14:30:18 354
原创 基于AQS原理实现的锁
1. AQS概念及其组件AQS基础概念及其作用AQS基础概念AQS: 即抽象队列同步器,AbstractQueuedSynchronizerAQS之shared mode: 即共享锁/读锁,用于线程读取加锁,不能进行写操作,可以读读共享AQS之exclusive mode: 即独占锁/排他锁/写锁,用于线程原子写操作时加锁,只能一个线程持有,其他线程处于等待状态AQS中不同m...
2020-02-04 23:25:43 1418
原创 并发编程之伪共享
1. CPU高速缓存与伪共享CPU缓存与一致性在CPU高速缓存与内存屏障的介绍中,CPU在对数据进行读取的时候遵循缓存一致性来解决高速缓存的数据不一致问题,现简述如下:CPU高速缓存包含L1-L3 Cache缓存,每个缓存Cache都是分段(line)存储的,也就是缓存段(Cache line)根据缓存的一致性,多核CPU处理器情况下,当其中一个CPU对其所在的Cache进行写操作并...
2020-01-29 18:40:54 458
原创 并发原子性技术之CAS机制
1. CAS机制CAS定义从wiki百科中,Compare-and-swap简称为“CAS”,是属于并发多线程中实现同步原子操作的指令,是依赖于硬件层次的原语发起的原子操作从程序代码理解上,CAS包含check then act的两个动作,这两个动作在处硬件的处理器上是具备原子性,也就是在操作系统底层上已经实现对CAS算法的原子性保证CAS 使用条件需要输入两个数值,一个是...
2020-01-28 21:18:57 428
原创 并发编程面临的问题小结
1. 临界区与数据竞争(竞态条件)java代码// sahred.javaint num = 0; // 在多线程中对于共享资源存在数据竞争,竞态条件// mutil.javarun(){ num ++; // 临界区 }通过上述代码可知临界区: 在并发多线程中执行一系列对共享资源的修改操作的代码区域,在该区域下的操作的执行结果会对其他线程产生影响,称该代码区域为...
2020-01-27 13:12:25 4124
原创 final线程安全与工作原理
1.final语义与使用final的语义编译器做的处理编译器可以跨同步屏障移动对final修饰的字段值进行读取和调用任意或未知的方法编译器对于final修饰的字段允许保留缓存其在寄存器中,而在必须重新加载非final字段的情况下,将通过使用缓存的方式保留着而不从主内存中加载数据并发线程下是安全的对于final修饰的字段在所有线程中是属于不可变(基本类型值不可变,引用类...
2020-01-26 21:45:21 1680
原创 java程序运行堆栈分析
1. java程序源代码与字节码源代码public class StackHeapAnalysis { // java 运行堆栈分析 public static void main(String[] args) { //define my wallet totel balance int balance = 500; ...
2020-01-24 20:05:29 653
原创 JVM运行数据区说明
1. JVM运行数据区概览jvm运行数据区图例图例说明JVM运行数据区可以划分为线程独占和线程共享两部分线程独占(封闭): 每个线程都拥有它的独立的内存空间,jvm在运行程序时就会为线程开辟一个内存空间来存储线程相关的信息,随着线程生命周期创建和销毁线程共享: 所有线程都能够访问当前的数据区域,随着GC的生命周期的创建和销毁2. JVM运行数据区分解说明线程共享...
2020-01-24 17:11:29 350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人