自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(224)
  • 收藏
  • 关注

原创 tcp_transmit_skb的发送时机梳理

在梳理了调用流程上来说,当前会触发调用的场景里面,在tcp_ack或者超时重传的场景下,会继续发送未经ack的数据,在其他的场景下更多的是发送一些窗口探测等相关的协议数据来完成tcp设计的保活,mtu等探测的功能,由于对tcp/ip协议的理解还不够还未能详细的将每个调用函数的场景细节进行学习。

2023-02-28 09:57:48 226 1

原创 Linux网络发送流程概述

本文就是简单的学习了一下有关Linux网络的数据发送的整个流程,其实网上有好多资料描述的都相对比较详细,核心的要点就是网络数据在发送的时候其实要拷贝两次,一次是用户态拷贝到内核态,一次是内核态拷贝到网卡的skb,在用户态调用send的时候其实只是第一次拷贝,拷贝完成之后有可能发送或者等待满足条件再发送,有关发送的时机后续引用博客写的很详细。最后到达了设备层之后再通过软中断的形式将数据发送出去,软中断发送数据后续再可详细学习。

2023-01-29 10:39:46 703

原创 Linux内核延迟写机制学习

本文主要是通过资料跟着源码学习了一下数据回写的机制,主要是通过bdi机制,通过workqueue来进行数据的写入,并且在数据写入的时候其实就写到了page层就返回,然后再延迟写入机制将page中的数据落入到底层的存储介质中。触发的时机也引用到下文中的内容,即可以通过系统调用sync主动调用,也可以等待系统配置的定时来执行,在内存分配数据不足的时候也会触发数据回写的流程。由于本人才疏学浅,如有错误请批评指正。

2022-12-31 21:26:28 1774

原创 Linux进场调度-中断/系统调用调度与进程的调度类型

本文主要就是了解了一下中断调度和系统调用的场景下的调度时机,有关中断和系统调用的逻辑流程本文没有深入学习(可查阅相关资料),在了解了调度时机之后在了解了有关进程调度的类型,在Linux3.10中有四种调度的类型,本文也并没有深入去分析每个调度类的具体的逻辑详细,只是简单的概述了rt的优先级和cfs公平调度的红黑树的选择下一个进场的内容,后续有机会再深入学习。由于本人才疏学浅,如有错误请批评指正。

2022-11-21 18:11:08 808

原创 Linux进程调度-显示调度和时间中断调度标志位设置

本文只是简单的查看了硬件中断的处理与注册流程,大致框架流程就是如上所示。。

2022-10-26 12:33:41 843

原创 Linux中断概述

本文只是简单的查看了硬件中断的处理与注册流程,大致框架流程就是如上所示。。

2022-09-25 17:33:50 324

原创 linux网卡驱动注册与接受数据处理

Linux网卡驱动

2022-08-28 17:19:16 559

原创 Linux-软中断概述

本文简单的概述了有关Linux软中断的处理的基本流程,软中断包括了网络数据的发送与接受,tasklet机制的执行等几种类型的响应,在执行完成硬件中断之后在执行到irq_exit来检查当时是否有软中断待执行,如果有则直接执行,如果执行的超过限定时候或者次数则调用softirqd的守护进程来进行剩余的软中断的响应处理。由于本人才疏学浅,如有错误请批评指正。httphttpshttpshttpshttps。...

2022-07-31 14:12:05 1480

原创 Linux1.2.13文件的读取流程概述

ext2是一个比较经典的文件系统类型,在最新的内核中仍然支持该文件系统。本文就基于ext2来简单的学习一下文件系统的工作流程。从读取的逻辑上看直接就行调用file的文件操作read函数,基于ext2的文件系统,选择的位于fs/ext2/file.c中的ext2_file_read。从流程上来看,在获取完成所有的node信息之后就会调用ll_rw_block来进行数据的读取。从流程上看,在经过参数的检查、设备信息的检查之后会调用make_request来进行数据的读取。主要是在经过检查,获取请求之后将

2022-06-27 20:14:45 461

原创 Linux网络设备loopback概述

Linux网络处理流程概述本文主要是学习了解一下整个Linux网络中loopback的原理,代码基于5.17版本。网络子系统初始化在Linux启动的过程中,会初始化网络子系统从而来完成网卡上面的网络包的接受和发送。/* * Initialize the DEV module. At boot time this walks the device list and * unhooks any devices that fail to initialise (normally hardware no

2022-05-28 12:56:11 1402

原创 redis6运行架构-多线程处理流程

redis6运行架构图redis6新特性中加入的最大的特性就是加入了多线程来处理网络的读写从而来提高响应性能,本文就简单的剖析一下redis6的运行的机制,学习一下redis6的多线程机制是如何在事件驱动中执行的。下图就是redis6的主题的运行的逻辑。redis6任务分类在redis6中以事件驱动的工作流程中主要包括了三种类型的任务执行。事件驱动处理程序任务,即网络IO的读写事件通过epoll来触发执行。定时任务,同样也是随着epoll的触发来判断进行任务的执行。事件任务,即在第一步事件驱

2022-04-21 17:09:19 1041 1

原创 pika主从同步原理

pika主从同步主要为了分析探索一下pika是如何实现主从同步的,pika的主从同步的原理与redis的同步方案还不相同,本文主要是为了分析其主从同步的相关流程(pika基于3.4版本)。pika主从同步原理主从同步的原理,主要是通过在启动的时候启动了两部分的线程来进行的。auxiliary_thread线程pika_rm中的pika_repl_client线程池和pika_repl_server线程池先逐个分析一下两个部分线程的工作的流程。auxiliary_thread线程在pika

2022-04-01 15:05:12 1159

原创 ptrace原理与性能对比

stracestarce在Linux上面是一个比较实用的工具,平常可以跟踪线上进程执行了哪些协同调用的工具,并在debug调试的情况下也能很好的使用,这一切的功能也都是基于Linux提供的强大的ptrace系统调用函数。ptrace原理根据官方介绍: The ptrace() system call provides a means by which one process (the "tracer") may observe and control the execution

2022-03-03 16:27:27 804

原创 golang异步协程调度原理

golang异步协程调度在1.14的go版本中,官方通过加入信号来进行协程的调度,后续就都支持了这种异步协程抢占,避免了早起的考栈调度时来检查是否执行超时的逻辑。本文简单来对比这种实现的原理。调度代码package mainimport "fmt"func main() { go func() { for i:=0;i>=0;i++{ fmt.Println(i) } }() for{}}1.12版本对比通过将该段代码放在1.12环境中运行。 GOMAX

2022-02-25 11:44:14 1588

原创 pika在codis中的探索

背景面对kv类型数据在公司的存储量越来越大,以及在性能响应不敏感的情况下,利用原生的codis方案来存储数据的方案,成本也越来越高,在这种场景下,急需一种替代方案能够有效兼顾成本与性能。故引入了pika来作为codis的底层存储,来替换成本较高的codis-server,并围绕pika的方案进行了一系列的设计改造。codis的原理设计codis项目主要分为codis-fe、codis-dashboard、codis-proxy和codis-server这四个组件。codis-fe主要是方便统一管理多

2022-01-30 18:27:43 2319

原创 runc原理概述

runcrunc作为容器的运行时,现在作为独立的项目来进行发展,runc提供一套简单的容器运行环境,包括进程的命名空间、cgroups和文件系统权限等管理的功能,runc是基于oci标准的产物,可以让大家都通过统一的接口来进行运行时的操作。其本质的管理工作也是最主要的几个重要的函数clone,unshare和setns等重要的操作函数。runc原理流程runc作为运行时,即在提供了挂载目录、运行权限等运行参数的情况下将容器启动运行,真正的作为一个运行管理的工具使用,一些例如镜像、日志配置等待交互清理功

2021-12-24 19:05:45 3928

原创 flannel原理初探针对0.1.0版本

flannelflannel是针对k8s设计的三层的网络解决方案。在k8s中为了使pod之间能够使用一种偏平的网络架构,从而完成跨Pod的网络通信。官网给的原理图如下:flannel 使用TUN/TAP 设备,并使用 UDP 创建覆盖网络来封装 IP 数据包。 子网分配是在 etcd 的帮助下完成的,它维护覆盖到实际 IP 的映射。从以上的原理图也可知大概的流程是是怎么操作的。其中具体是一个什么流程呢,本文就根据flannel的0.1.0版本的源码进一步学习。flannel流程-基于Backen

2021-11-11 10:57:52 658

原创 MVVM框架原理浅谈

MVVM基本原理MVVM(Model-View-ViewModel)本质上就是MVC 的改进版,MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。数据修改通知ViewModel通知Model数据修改View数据修改通知ViewModelViewModel数据修改通知ViewModelViewModelViewMVVM相比与MVC模式主要是分离了试图和模型...

2020-01-07 15:38:54 5764

原创 pika-NoSQL原理概述

pikapika是一款基于rocksdb可持久化兼容redis协议的kv存储。当前最新的特性中还支持codis,可作为codis的后端存储使用,但是运维命令稍微有些不同。pika相对于redis而言主要是适合在容量大的场景下,简化了数据加载和迁移的相关操作,但是整体基于硬盘或者SSD的存储响应性能可能会差些。不过本文只是简单的来了解一下pika的设计的思路,方便以后在使用过程中加快对问题的诊断。pika设计pika在设计的时候支持了两种运行模式,即经典模式和分布式模式。模式原理经

2021-10-27 17:39:44 1045 1

原创 rkt简单概述

rkt项目rkt项目最早跟随k8s使用的运行时的组件,并且也入选过cncf的沙箱项目,但是在最后的使用中还是被抛弃了,其中主要的是croi-o和containerd两个项目的接受度更高,并且社区活跃度越来越低,最终停止维护。虽然停止维护但是也可以是一个很好的案例来学习一下rkt项目的设计思路与思想。主要的学习资料就是官网提供的 运行原理 与架构。rkt原理梳理rkt 的主要界面是一个命令行工具 rkt,它不需要长时间运行的守护进程。 这种架构允许 rkt 就地更新,而不会影响当前正在运行的应用程序容器

2021-10-22 15:27:56 4147

原创 redis分析-内存碎片动态回收概述

内存碎片动态回收在redis4版本中,新加入了内存碎片动态回收特性,该特性支持动态的将内存碎片进行回收,该功能的主要是运行redis压缩一些小空间和未利用的空闲空间,从而允许内存回收。通常情况下出现内存碎片是每一个内存分配器都会碰到这个问题并且占用额外资源,平常情况下只需要重启服务就可以降低内存的碎片率,或者将所有数据都先迁移走然后等数据删除完成之后再重新迁移回来。因为如上的原因redis提供了一种在服务运行中也可以内存整理的方法。基本流程是当碎片率超过一个比率之后,redis会通过jemalloc的

2021-10-13 11:33:11 478

原创 gossip协议与memberlist实现

gossip协议gossip协议是基于流行病传播传播方式的节点或者进程之间信息交换的协议。主要在分布式系统中使用gossip协议来达到数据的最终一致性,利用一种随机的方式将信息传播到整个网络中,并在一定时间之后完成数据的最终一致性,并且该算法时一种去中心化的算法,当前应用较多的为redis,consul等分布式组件中。优点扩展性较好,节点的加入和退出都可以无损有序,对应用优化。容错性较好,任何节点的宕机都不会影响正在运行的节点。健壮性较好,因为没有中心化的节点,所有对象都是对等。最终一致性,当

2021-09-22 10:59:14 1476

原创 遍历百万级Redis的键值的曲折经历

背景暖心同学突然跟我说想要获取线上所有的Redis的key的大小信息,就是想知道redis中所有对应Key的大小信息(线上使用的redis存储的信息基本统一而且没有其他复杂的如set等数据结构),让我帮忙来解决一下这个问题。听到这个问题之后,我对着电脑深吸一口气,表面表现出嗯嗯这个问题有点复杂,我需要整理一下思绪。内心早就想着这个问题好像不难吧,抄起电脑吭哧吭哧几行代码不就搞定了嘛,哈哈哈。Redis心花路放第一版import redisimport timerip = "192.168

2020-05-27 16:10:42 2454 8

原创 golang实践LSM相关内容

LSMLSM(log-structured merge-tree)是一种分层,有序,面向磁盘的数据结构,其核心思想是充分了利用了,磁盘批量的顺序写要远比随机写性能高出很多,在计算机科学中,日志结构的合并树是一种具有性能特征的数据结构,这使得它对于提供对具有高插入量的文件(例如事务日志数据)的索引访问很有吸引力。与其他搜索树一样,LSM树也维护键值对。LSM树以两个或多个单独的结构来维护数据,每种结构都针对其各自的底层存储介质进行了优化;数据在两个结构之间批量有效地同步。在日志的写入过程中通过批量顺序写会

2021-08-12 15:33:07 782

原创 golang-实现自己的事件驱动

golang实现自己的事件驱动众所周知,go中的异步操作都已经封装在了运行时的过程中,有关socket的网络的异步操作都封装到了go的netpoll中,从而简化了编程形式。本文也就根据evio库总结而来。golang跨平台库如何编写golang的跨平台库,现在主流的方式如下:evserver│ go.mod│ main.go │└───show│ │ show.go│ │ show_darwin.go│ │ show_linux.go通过创建

2021-07-30 17:39:09 1852 1

原创 反应器(Reactor)模式-golang探索

反应器模式在以前的博文模式设计概述:反应器(Reactor)模式介绍过相关的概念和流程,当时使用了python但是从结果上来看并没有起到很明显的效果。最近在接受有关proxy的项目中,刚刚好涉及到有关性能的问题,故本文探索一下go的反应器模式的探索过程,当前比较知名的项目有两个一个是evio和gnet,都是反应器模式的很好的实现范例,特别是gnet在反应器模式上还加入了协程池从而比evio性能更好,本文就从头开始探索如何一步步优化改进。go原生服务流程package mainimport ( "

2021-06-29 16:06:47 1906 1

原创 k8s概念入门之apiserver-针对1.1.版本阅读

apiserverk8s中最重要的一个通信节点就是apiserver,是一个中心节点连接着每一环,是kubelet,kube-proxy和control-manager的交互的中心点,提供基于API服务来管理每一步的流程,后端采用高可用的etcd等组件作为数据库来提供数据的高可用。从介绍来看,apiserver的整个架构也基于上基于传统的http服务端来实现,这对外可提供友好的接口进行二次开发。apiserver流程func main() { runtime.GOMAXPROCS(runtime.N

2021-05-13 19:41:00 591

原创 k8s概念入门之control-manager-针对1.1.版本阅读

control-manager资源控制器主要是为了控制各种资源的变更信息,例如pod的创建新增,副本控制器和账户控制器等信息,资源控制器的主要职责就是通过list-watch机制,从APIServer处获取所有的操作,从而将资源的操作依次解耦,通过不同的事件来驱动整个k8s的步骤。最容易理解的一张图(该图摘自于网络)如下所示;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WJOtxeiq-1620452706803)(/Users/wuzi/Desktop/屏幕快照 20

2021-05-08 13:45:32 872

原创 codis3数据迁移探索

背景在测试codis的过程中,由于现网使用的codis的每个集群的量相对较大,为了确保在codis的升级过程中能够紧急处理突发的一些问题故熟悉一下codis有关的基本原理。codis的逻辑codis3相对于codis2性能各方面都有一个比较大的提升,性能提升较大的改造。例如将信息同步从zk中解耦出来,将dashborad的功能跟偏向于一个master管理功能,将迁移的最小的锁的粒度缩小到slot上,在迁移slot的过程中通过设置状态来完成迁移工作,并且在迁移的过程中通过问询的方式来开始以整个迁移的流程

2021-04-23 16:07:53 396

原创 k8s概念入门之kubelet-针对1.1.版本阅读

kubeletkubelet是在每个节点上运行的主要“节点代理”。它可以使用以下之一向apiserver注册该节点:主机名;用于覆盖主机名的标志;或云提供商的特定逻辑。kubelet根据PodSpec起作用。 PodSpec是一个描述Pod的YAML或JSON对象。 kubelet接收通过各种机制(主要是通过apiserver)提供的PodSpec集合,并确保这些PodSpec中描述的容器正在运行且运行状况良好。 Kubelet不管理不是Kubernetes创建的容器。kubelet流程kubele

2021-04-21 14:11:41 384

原创 k8s概念入门之kube-proxy-针对1.1版本阅读

背景在后续阅读k8s0.4版本的过程中,发现文档上描述的确实是一个不完整的版本,故切换版本到1.1,因为在1.1文档中已经标明了可以在生成环境中使用,故重新再学习一下有关kube-proxy的内容,本文主要是做一个补充。kube-proxy功能还是以前那样通过部署在每个node节点上面,来提给service层面和node层面的通信支持。其主要的功能内容就是通过iptables来进行网络的联通与路由功能。proxy通过master提供的api直接获取对应的endpoints和services,通过定

2021-04-16 17:33:25 335

原创 k8s概念入门之kube-proxy-针对早期(0.4)版本阅读

k8s的kube-proxy分析Kube-proxy主要是伴随着kubtlet进程一起部署在每个node节点中,proxy的功能主要就是为了完成在k8s集群中实现集群内部的通信,也可完成集群外的数据到集群内部的通信。从功能上来说确实是完成了完成更高层次的网络封装,让用户能够忽略网络层的部分细节从而专注于业务层的功能。在早期的k8s的实现中,使用了最简单快速的方式来实现流量的转发,即通过用户态的数据接受直接转发到后端的目标地址上去。首先查看proxy的main函数:var ( etcdServerL

2021-04-09 11:13:15 436

原创 pip包管理工具-install执行流程简单查看

pip概述pip是python提供的包管理工具,该工具提供了对python包的查找、下载、安装与卸载等功能的工具,当前是python中比较主流的管理工具。pip下载安装包的概述pip工具的本质通过网络请求去请求服务端对应名称的文件然后解压到本地的python的库文件夹中,从而达到讲远端的python包下载并安装到本地。概述流程如下:pip install django1.先获取到远端的...

2019-06-20 18:51:18 12672 4

原创 codis3.2升级redis3.11到redis6.0.10调研

codis升级redis3.11到redis6.0.10背景当前codis最新版本为3.2对应的redis的版本为3.2.11,针对以往的redis在使用过程中当内存碎片率过高时只能重启节点,无法动态释放故调研升级到redis6版本。codis调研从codis的架构可以知道,codis中的jodis-client(通过zk)或者redis-client直连的方式来访问codis-proxy,codis-proxy通过计算对应的key的slot来转发到对应的codis-group中去,这样完成一个完整

2021-03-26 16:16:08 964 2

原创 邮件服务器SMTP概述

邮件服务器最近由于涉及到邮件服务器相关内容的工作,并且需要进行部分的协议转发的工作故了解一下邮件服务器的协议。当前选择应用较为广泛的SMTP的邮件协议。SMTP协议概述SMTP全称是Simple Mail Transfer Protocol,最近的协议定稿是rfc5321,根据文档的描述,基础的设计方案如下;通过SMTP客户端发送邮件信息到一个或者多个SMTP服务端,并记录发送的状态结果。SMTP客户端一旦确定目标的方式域,确定要向其复制副本的SMTP服务器的身份一条消息将被传输,然后执行该传输。

2021-02-26 11:15:15 4069

原创 ServiceMesh有关sidecar理解

理解sidecar的功能特性在前文中分享了有关ServiceMesh的大概的一个演进过程,该过程都是大家对于服务管理与规划的解决方案。本文主要是通过简单的代码的编写来更加体会sidecar相关的功能与优缺点。sidecar的功能点sidecar实现的过程中,主要包含了sidecar与sidecar的通信,sidecar对应用流量的管控,对于不同的应用的限流、熔断等策略的实现。主要架构图如下;大致功能流程如上所示,将以往在应用程序A或B中实现的服务发现、应用限流等功能都集成在了sidecar中,后续

2021-01-30 22:15:44 780

原创 ServiceMesh架构的演变过程概述

ServiceMesh概述在软件体系结构中,服务网格是专用的基础结构层,用于通常使用Sidecar代理来促进微服务之间的服务之间通信。具有这样一个专用的通信层可以提供许多好处,例如,提供对通信的可观察性,提供安全的连接,或针对失败的请求自动进行重试和后退。以上为维基百科对于服务网格的解释,服务网格基于当前的微服务的进一步的发展演进,其实本质上服务发现、服务熔断等内容仍然是服务网格的核心内容,但是服务网格进一步抽象提炼了微服务中的公共组件的功能,并添加了对于这些公共的基础组件的管理能力,从而达到了对微服

2020-12-31 16:57:01 350

原创 分布式集群任务调度概述

分布式集群任务调度在以往单机的任务执行中,任务都在一台机器上执行,所有任务都需要有序排队等待执行,多个任务执行的时间大致为每个任务在单机上执行的时间。但是当执行任务的机器数量变多之后,就需要将任务有序合理的分配到不同的机器上去执行,这也催生了一些分布式集群中任务调度的算法。集群任务调度算法当前较为主流的经典算法有如下两个,Min-Min算法和Max-Min算法,这两种算法计算过程相对简单并且不复杂,但是缺点也很明显就是对任务的负载均衡,长短任务的分配效果会差点。Min-Min算法1.假设网格任务集

2020-12-24 15:12:01 2177 2

原创 分布式链路追踪zipkin

分布式链路追踪分布式链路追踪最早由谷歌的Dapper论文中提出的,提供提供简单易用的API来记录不同系统之间的调用的链路及耗时情况,从而提供各个系统的性能分析的依据。Dapper论文概述Dapper对分布式跟踪系统提出了一系列的要求如,性能低损耗,分布式跟踪系统对服务的性能损耗应尽可能做到小的影响,特别是对性能要求较高的业务。应用级别的透明,对于应用的开发者,需要对代码的侵入性要小,尽量提供开箱即用的工具提供给应用开发者使用,例如将跟踪系统封装到公共组件中去等。延展性要好,即可以方便的拓展。

2020-11-26 17:50:33 767

原创 分布式多层次限流概述

分布式限流分布式限流常见于对外提供服务的API,例如阿里云的语音服务接口等。对于这类的服务一般常见于资源消耗比较大,服务相对比较敏感,而且某些提供的限流功能要满足多层次的限流功能,比如一分钟一次,一小时十五次,一天三十次这种功能,相对于当前常见的分布式限流方案有采用zk、etcd等组件来实现的,优点就是分布式限流过程中对于使用方来说保证了高可用,也有使用redis来实现的,在redis的实现方案中如果需要保证高可用可考虑redis的哨兵功能来实现(如果集群模式下要保持访问的客户端的时钟一致),本文就基于r

2020-11-20 13:38:52 287

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除