- 博客(34)
- 收藏
- 关注
原创 计算机网络笔记
HTTP协议:1.无状态的:是指后一个请求不能依赖前一个请求中的字段等2.请求/响应方式运行3.可扩展的语义;例如服务器是1.0,但是浏览器是1.1版本的话,浏览器和服务器是可以正常通信OSI概念模型表示层:将网络中的消息转换成应用层可以读取的消息会话层:是一层完全概念化的一层、负责建立会话,握手维持连接关系的一层。这一层更多的是让我们理解会话这个概念传输层:更多的是解决进程与进程之间的通讯。当报文到主机上,我们应该把报文分发到哪个进程是由传输层决定的。传输层还做了更多的事情,例如tcp协议
2022-07-17 09:58:45 685
原创 建造者模式
为什么需要构造者模式?public class ResourcePoolConfig { private static final int DEFAULT_MAX_TOTAL = 8; private static final int DEFAULT_MAX_IDLE = 8; private static final int DEFAULT_MIN_IDLE = 0; private String name; private int maxTotal = DEFAULT_MAX_
2022-05-26 09:42:07 263 1
原创 单例设计模式
单例设计模式:一个类只允许创建一个对象,那么这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。实战案例一:处理资源访问冲突public class Logger { private FileWriter writer; public Logger() { File file = new File("/Users/wangzheng/log.txt"); writer = new FileWriter(file, true); //true表示追加写入
2022-05-25 20:23:34 210
原创 为什么我的mysql会抖一下?
什么情况下会发生数据库的flush操作?1.粉板满了,记不下了,对应的就是redo log写满了,这时候系统需要停止所有更新操作。2.这一天生意太好,要记住的事情太多,掌柜发现自己快记不住了,赶紧找个账本把孔乙己这笔帐先加进去。这种场景对应系统内存不足,当需要新的数据页,而内存不够用的时候,就要淘汰一些数据页,空出的内存给别的数据页使用。如果淘汰的是脏页。就要先把脏页写入到磁盘中的。你一定会说,这个时候难道不能把内存直接淘汰掉,下次再请求的时候,从磁盘读入数据页,然后拿redo log出来应用不就可
2022-04-23 15:28:03 589
原创 mysql为什么表数据删除了,表文件大小还不变?
数据删除流程假设我们要删除R4这条记录,innodb只会把R4这条记录标记为删除。如果之后再插入一个ID在300到600之间的记录的时候,可能会复用这个位置。但是磁盘大小并不会缩小。我们现在知道delete命令其实只是把记录的位置,或者数据页标记为了可复用,但磁盘大小不会发生改变。如何才能删除空洞呢?通过重建表的方式,重建表的流程:1.建立一个临时文件,扫描表A主键的所有数据页2.用数据页中表A的记录数生成B+树,存储到临时文件中3.生成临时文件的过程中,将所有对A的操作都记录到row lo
2022-04-18 23:31:17 1156
原创 mysql锁
MySQL的锁大致分为三类:全局锁、表锁、行锁全局锁当你需要让整个数据库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句都会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务提交语句。全局锁的典型使用场景是做全库逻辑备份。(因为如果不加锁的话,就不能保证数据的一致性)。也就是说不加锁的话,备份系统备份得到的库不是一个逻辑时间点,这个视图的逻辑是不一致的。如何保证视图的一致呢?如果是事务的话,可重复读就可以保证一致性。官方自带的逻辑备份工具是mys
2022-04-16 10:14:03 110
原创 mysql基础架构
mysql基础架构MySQL可以分为server层和存储引擎层两部分。Server层为图中上面绿框的部分。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持innodb、MyISAM、Memory等连接器连接器负责跟客户端建立连接、获取权限、维持和管理连接。我们可以通过show processlist查看此时建立的连接。sleep代表此时系统有一个空闲的连接。如果客户端太长时间没动静,连接器就会自动断开,时间由wait
2022-04-10 16:02:25 642
原创 从0开始学习大数据
大数据的核心思想是:既然数据是庞大的,而程序要比数据小的多,将数据输入给程序是不划算的。那么就反其道而行,将程序分发到数据所在的地方进行计算,也就是所谓的移动计算比移动数据更划算。移动计算程序到数据所在的位置进行计算是如何实现的呢?1.将待处理的大规模数据存储在服务器集群的所有服务器上,主要是用HDFS分布式文件系统,将文件分成很多块(block),以块为单位存储在集群的服务器上。2.大数据引擎根据集群里不同服务器的计算能力,在每台服务器上启动若干分布式任务执行进程,这些进程会等待给他们分配执行任务。
2022-04-08 22:42:17 2328
原创 rpc实战与核心原理
网络通信一般会采用四层Tcp协议或者七层Http协议。RPC的作用:1.屏蔽远程调用和本地调用的区别,让你感觉就是调用项目内的方法。2.隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。
2022-03-26 23:09:40 2794
原创 jvm实战案例
一.tomcat设置如下参数,参数中设置最大堆32MB压测一段时间的结果:可以看到tomcat进行大量频繁的full GC,老年代的大小21888KB基本全部用完(默认新生代和新生代的比例是:1:2),整个堆的可用大小是31680KB,也基本全用完。jmeter聚合报告的结果:540次/s二.我们通过调大最大堆的大小为512MB,得到GC日志如下:当设置最大堆为512MB后,相同启动初期可用堆约为16MB。随着请求数量的增加最终堆大小扩展到了60MB左右。同时日志中也未出现FULL GC日志。
2022-03-18 20:44:02 439
原创 order by是如何工作的?
CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`)) ENGINE=InnoDB;select city,name,age from
2022-03-13 10:12:51 1445
原创 到底可不可以使用join?
表t2里插入了1000行数据,在表t1里插入的是100行数据。select * from t1 straight_join t2 on (t1.a=t2.a);如果以上语句直接使用join语句,mysql优化器可能会选择表t1或者t2作为驱动表,这会影响我们分析mysql的执行过程。为了方便分析过程中的性能问题,我改用straight_join让mysql使用固定的查询方式执行查询。可以看到这个表t2上有索引,join过程用上了这个索引,因此这个语句的执行流程是:1.先从t1表中读取一行数据R。
2022-03-12 11:57:39 1019
原创 Benchmark测试
JIT如何影响未基准测试?1.将生成的字节码替换为编译好的机器码2.在代码运行过程中,JIT会对一些比较小的函数实施内联优化,也就是将一个函数方法生成的指令直接插入到被调用的函数的指令内,这样就可以通过减少函数调用开销来提升执行性能。3.同时JIT代码优化是实时动态的行为,会受限于Code Cache大小的限制,所以如果优化效果不理想会触发逆优化,它的功能是把原来放到 Code Cache 中的机器码删除掉,这部分代码又回退为 Java 字节码执行。...
2022-03-08 23:09:05 958
原创 我查这么多数据,会不会把内存打爆?
全表扫描对server层的影响mysql -h$host -P$port -u$user -p$pwd -e "select * from db1.t" > $target_fileinnodb的数据保存在主键索引上,所以全表扫描就是直接扫描表t的主键索引。然后查询的每一行可以直接放到结果集里,然后返回给客户端。这个结果集存放在哪里呢?实际上,服务器并不需要保存一个完整的结果集。取数据和发数据的流程是这样的:1.获取一行写入到net_buffer中。2.重复获取行,直到把net_buff
2022-03-06 11:06:14 433
原创 redis笔记
redis的数据结构:String(字符串)、List(列表)、hash(哈希)、Set(集合)、Shorted Set(有序集合)底层数据结构:简单动态字符串、双向链表、压缩列表、哈希表、跳表、整数数组1.哈希表:一个哈希表其实就是一个数组,数组中的每一个元素称为一个哈希桶。哈希冲突和rehash可能会带来操作阻塞。redis解决哈希冲突的方法是链式哈希,而rehash是增加现有hash桶的数量。rehash的操作步骤:1.给哈希表分配更大的空间,例如是当前hash表大小的两倍2.把哈希表
2022-03-06 08:41:12 332
原创 redis如何应对并发访问?
redis的原子操作有两种方式:1.把多个操作在redis中实现成一个操作,也就是单命令操作。我们先看看redis本身单命令操作:redis是使用单线程来串行处理客户端请求操作命令的,所以当redis处理某个命令的时候,其他命令是无法执行的,这相当于命令操作是互斥执行的,当然redis的快照生成、AOF重写等操作是由子线程或者后台线程执行的,也就是和主线程的操作是并行执行的。只不过这些操作只是读取数据不会修改数据。虽然redis单个操作可以原子性的执行,但在实际应用中数据修改包含多个操作,至少包括读
2022-03-06 08:40:38 2742
原创 jvm内存分布
java监控工具jcmd:它用来打印java进程所涉及的基本类、线程和vm信息。jconsole:提供jvm活动的图形化视图,包含线程的使用,类的使用、GC活动。jhat:读取内存堆转储,并有助于分析。jmap:提供堆转储和其他jvm内存使用信息。jinfo:查看jvm系统属性。jstack:转储java进程的栈信息。...
2022-03-05 16:32:09 342
原创 为什么我只查询一行语句,也执行这么慢?
第一类:查询长时间不返回一般这种情况是表t被锁住了,首先需要执行以下show processlist命令,看一下语句处于什么状态。1.等MDL锁出现这种状态代表一个线程正在表t上请求或者持有MDL写锁,把select语句堵住了。由于通过show processlist查看到的结果中sessionA的command列处于sleep状态,导致查找起来不方便,所以可以通过查询sys.schema_table_lock_waits这张表,就可以直接找到阻塞的process id2.等flush出现W
2022-03-02 22:10:34 169
原创 MySQL锁
MySQL中的锁大致可以分为全局锁、表级锁、行锁全局锁加全局锁的命令:Flush tables with read lock全局锁主要的使用场景就是全局备份。例如下图如果不加全局锁的话,会存在如下问题:购买课程的操作,如果数据库是先备份余额表然后此时用户购买,然后数据库再备份用户课程表的话,就会出现我没有花钱但是多了一门课程的情况。也就是说,如果不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,这个视图是逻辑不一致的。官方自带的逻辑备份工具是mysqldump。当mysqldump使用参
2022-02-23 23:19:53 316
原创 旁路缓存:redis是如何工作的?
计算机默认有两种缓存:1.cpu中的末级缓存,即LLC,用于缓存内存中的数据,避免从内存中取数据。2.内存中的高速页缓存,即page cache,用来缓存磁盘中的数据,避免每次从磁盘中存取数据。应用如果想要修改数据,既可以在缓存中修改,也可以在后端数据库中进行修改,所以redis就出现了两种缓存模式:只读缓存和读写缓存只读缓存:先删除redis中的数据,修改数据库中的数据,然后从数据库中读取数据并更新redis。好处就是数据存入数据库中,能够保存数据的可靠性读写缓存:直接在redis中进行数据的修改
2022-02-19 19:59:24 336
原创 kubernetes笔记
HostAliases:定义Pod的hosts文件(比如:/etc/hosts)里的内容。如果只是改pod中/etc/hosts的内容的话,pod被删除重建后,数据就会丢失使用方法:apiVersion: v1kind: Pod...spec: hostAliases: - ip: "10.1.2.3" hostnames: - "foo.remote" - "bar.remote"...pod中的容器间pidNamespace的方法:https://www
2022-02-19 19:58:01 573
原创 redis练习题
1.stream介绍:stream主要用于消息队列,redis本身是有一个发布订阅 (pub/sub)来实现消息队列的,但是由于无法将消息持久化,如果出现宕机等情况就会导致数据丢失。而Redis Stream提供消息的持久化和主备复制功能,可以让任何客户端访问任何时刻数据,并且能够记住每一个客户端的访问位置,还能保证消息不丢失。同一条消息在同一消费组内只能被一个消费者读取消费。2.info memory命令:mem_fragmentation_ratio代表内存碎片率:used_memory_r
2022-02-13 11:16:54 1277
原创 通信开销:限制Redis规模的关键因素
为了让集群中每个实例都知道其他实例的状态信息,实例之间会按照一定规则进行通信。这个规则就是Gossip协议。Gossip工作原理可以概括为以下两点:1.每个集群实例之间会按照一定频率,从集群中挑选一些实例,把ping消息发送给挑选出来的这些实例,用来检测这些实例是否在线,并交换彼此的状态信息。然后实例会返回PONG消息我们可以直观的看到:实例间使用Gossip协议进行通信时,通信开销受到通信消息大小和通信频率的影响。Gossip消息大小ping消息是由clusterMsgDataGossip结构体
2022-02-12 20:33:05 634
原创 redis数据倾斜
数据倾斜分为两种:1.数据量倾斜:在某些情况下,实例上的数据分布不均匀,某个实例上的时候特别多。2.数据访问倾斜:虽然每个实例上的数据量差别不大,但是某个实例上的数据是热点数据,被访问的非常频繁。数据倾斜的成因和应对方案:1.bigkey导致倾斜bigkey的value很大或者bigkey中保存大量的集合元素,会导致这个实例的数据量增加,内存消耗也相应的增加bigkey造成实例io线程阻塞,如果bigkey的访问量较大,就会影响这个实例上其他请求的处理速度。解决办法:1.避免过多的数据对保存在
2022-02-12 15:07:55 1578
原创 redis脑裂
脑裂:在主从集群中,同时有两个主节点他们都能接收写请求。而脑裂最直接影响的就是客户端不知道往哪个主节点写入数据,结果就是不同的客户端往不同的主节点写入数据。而且严重的会导致数据丢失。为什么会发生脑裂?1.确认是不是数据同步出了问题:主库的数据还未同步到从库,结果主库发生了故障,等到从库升级为主库后,未同步的数据就发生了缺失。这种情况我们可以通过计算master_repl_offset和slave_repl_offset的差值,如果大于0就可以认定为是由于数据同步未完成导致的。2.排查客户端的操作日志
2022-02-04 08:06:57 2847
原创 redis数据结构
redis的数据结构:String(字符串)、List(列表)、hash(哈希)、Set(集合)、Shorted Set(有序集合)底层数据结构:简单动态字符串、双向链表、压缩列表、哈希表、跳表、整数数组1.哈希表:一个哈希表其实就是一个数组,数组中的每一个元素称为一个哈希桶。哈希冲突和rehash可能会带来操作阻塞。redis解决哈希冲突的方法是链式哈希,而rehash是增加现有hash桶的数量。rehash的操作步骤:1.给哈希表分配更大的空间,例如是当前hash表大小的两倍2.把哈希表
2022-02-03 19:36:16 4100
原创 Linux网络性能优化
网络栈示意图网卡是发送和接收网络包的基本设备。在系统启动过程中,网卡通过内核中的网卡驱动程序注册到系统中的,而在网络收发过程中,内核通过中断跟网卡进行交互。网卡的硬中断只处理最核心的网卡数据的读取或发送。而网络中大部分逻辑都放在了软中断中进行处理。网络包的接收流程当一个网络包到达网卡后,网卡通过DMA方式把这个数据包放入到收包队列中。然后通过硬中断告诉中断处理程序已经收到了网络包了,接着中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到sk_buff中;然后再通过软中断通知内核
2022-01-17 07:49:33 1807
原创 Linux文件系统
linux中一切皆文件,不仅普通的文件和目录。就连块设备、套接字、管道等都是通过统一的文件系统来管理的linux文件系统为每个文件都分配了两个数据结构:1.索引节点 2.目录项它们主要用来记录文件的元信息和目录结构...
2022-01-01 11:11:01 1172
原创 Linux内存
内存主要用来存储系统和应用程序的指令、数据、缓存等物理内存物理内存也被称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM),只有内核才能直接访问物理内存进程如何访问内存?linux内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便的访问虚拟内存。虚拟地址空间内部有被分为用户空间和内核空间32位的系统内核空间占用1G,剩余的3G时用户空间64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定
2021-12-28 22:46:05 1155
原创 软中断与硬中断
当iowait升高时,进程很可能因为得不到硬件的响应而长时间处于不可中断状态(D)。进程的状态划分:$ top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND28961 root 20 0 43816 3148 4040 R 3.2 0.0 0:00.01 top 620 root 20 0 37280 33676 908 D 0.3 0.4 0:00
2021-12-26 11:23:07 1347
原创 Nginx性能优化之cpu优化
如何有效的使用cpu?1.如何增大Nginx使用cpu的有效时长?能够使用全部cpu资源:master-worker多进程架构,woker进程数量应该大于等于cpu核数Nginx进程间不做无用功浪费cpu资源:worker进程不应在繁忙时,主动让出cpu资源(worker进程间不应由于争抢造成资源损耗,worker进程数应该等于cpu核数)worker不应调用一些api导致主动让出cpu(例如一些第三方库会调用阻塞的方法,使worker进程进入阻塞)不被其他进程争抢资源:1.提高优先级占用cpu
2021-12-25 18:52:49 2798
原创 cpu使用率
cpu使用率指标:通过cat /proc/stat | grep ^cpu查看:1.user:用户态cpu时间。注意:它不包含nice时间,但包含guest时间2.nice:代表低优先级用户态cpu时间,也就是进程的nice值被调整为1-19之间的cpu时间,值越大代表优先级越低3.system:内核态cpu时间4.idle:cpu空闲时间。⚠️注意:它不包含等待io的时间5.iowait:等待io的cpu时间6.irq:代表处理硬中断的cpu时间7.softirq:代表处理软中断的cpu时
2021-12-25 10:38:36 1611
原创 cpu上下文切换
上一节提到的等待cpu的进程也会导致平均负载升高是为什么呢?实际上是因为cpu上下文切换导致的,cpu分配时间片来执行每个任务,而在每个任务执行之前cpu需要知道从哪里加载又从哪里运行,也就是说需要系统帮它设置好cpu寄存器和程序计数器,也就是cpu的上下文保存的上下文是存储在系统内核中的,并在系统调度执行时再次加载进来而上文中的任务又是什么呢?实际上任务不单单包含进程和线程、硬件通过触发信号,会导致中断处理程序的调用,也是一种常见的任务,所以cpu上下文切换根据任务的不同分为:进程上下文切换、线程
2021-12-24 21:09:14 703
原创 理解平均负载
什么是平均负载?平均负载:单位时间内,系统处于可运行状态或者不可中断状态的平均进程数可运行状态是指正在等待cpu或者正在使用cpu的进程,也就是下图中处于R(Running或者Runnable)状态的线程不可中断进程则是内核中正处于关键流程中的进程,并且这些流程是不可以被打断的,例如最常见的就是等待硬件设备的io响应,也就是下图中处于D状态的进程,不可中断主要是为了保证数据的一致性即磁盘数据与进程数据的一致性平均负载的理想状态是等于cpu个数平均负载过高会有什么影响?平均负载过高会导致进程响应变
2021-12-23 22:27:01 965
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人