自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Rings‘ Power,性能“世界第一”的Web I/O框架

我们看到,在简单的HTTP压力测试中,和其他的框架相比,在http测试中UringNet仍然保持者比较明显的优势,尤其是在连接数在200的情况下,由于测试是在同一台主机上运行,测试程序和被测试程序都运行在同一台宿主机的桌面虚拟机中,因此在多线程,高并发下实际上对被测试程序的结果有些影响。在2019年,从Linux内核5.1开始,引入了io_uring这样的异步框架,io_uring的设计非常精巧,经过验证,其性能极其强悍,在文件读写的领域已经证明了其巨大的价值。在创建和提交SQ的时候,可以加入。

2023-06-06 15:22:11 284

转载 Linux高性能异步I/O接口io_uring

io_uring这样原生的异步接口直接就能够采用proactor这样的主动通知模式,减少了轮询的开销,同时还能够设置内核线程自动提交SQE中的任务,理论上io_uring的IO性能一定是超过epoll接口和reactor模式的。通过上面的介绍,我们其实可以发现,如果普通应用程序运行的用户态需要访问硬件设备,或者访问网络,读取磁盘文件时,那就必须通过调用Linux提供的系统API,将命令参数压入用户态的应用栈中,系统调用将应用栈中命令参数取到内核执行栈中,在内核态中执行指令。这就是内核和用户态的上下文切换。

2023-06-06 15:14:50 523

原创 网桥、vlan、源目MAC地址的链路层处理

L2隧道处理则根据所属隧道的目的IP寻找路由,并根据路由结果指示的出接口转发报文;需要注意对于网桥和vlan的上本机的报文,会更新报文的输入接口,由从网卡驱动接收接口改为对应的桥端口或vlan子接口(vlan报文还会去除vlan头),这是因为事实上上层协议栈关心报文的“逻辑”输入接口,而不是“物理”输入接口,这些报文的反向报文也是由上层协议栈发送到桥端口或vlan子接口,再继而转换为其原始的报文输入接口通往网卡驱动,简单的说就是网桥、vlan报文对于上层协议栈可见的是桥端口、vlan子接口。

2023-02-20 13:48:04 705 1

原创 一文搞懂Linux内核页框回收(Page Frame Reclamation)

这就是像使用lru_cache_add()将page放置到inactive_list(A1)中,然后使用mark_page_accessed()将page移动到active_list(Am)中。通过find_get_page()来查询该page是否已经在page cache中存在,如果不存在,调用page_cache_alloc_cold()从cpu code list中分配page。avtive_list的目标是包含所有进程工作使用的page而inactive_list的目标是包含回收候选者的page。

2023-02-18 15:26:47 272

原创 深入理解Linux内核页表管理(Page Table Management)

从上面的章节我们可以知道kernel image的起始地址是物理地址1MB的地方,然后改物理地址转换成虚拟地址之后就是PAGE_OFFSET + 0x0010000,其后续的一个8MB的地址空间是留给内核的静态代码使用的区域。将swapper_pg_dir中的第0项和第768项设置为pg0的物理地址,第1项和第769项设定为pg1页框的物理地址,swapper_pg_dir中的其他项都填0.这也就是说当分页功能开启的时候,内核无论是用物理地址还是虚拟地址都可以将这两页表映射到正确的page中。

2023-02-18 15:24:55 572

原创 由浅入深的学习内存的基本原理——DDRx8

本章主要是针对DDR的发展和原理进行了学习,主要集中在硬件的组成原理,其中涉及到Channel > DIMM > Rank > Chip > Bank > Row/Column,其组成如下图所示:Channel:一个主板上可能有多个插槽,用来插多根内存。这些槽位分成两组或多组,组内共享物理信号线。这样的一组数据信号线、对应几个槽位(内存条)称为一个channel(通道)。简单理解就是DDRC(DDR控制器),一个通道对应一个DDRC。CPU外核或北桥有两个内存控制器,每个控制器控制一个内存通道。

2023-02-18 15:24:39 526

原创 Linux进程的内存管理之malloc和mmap

完成这段申请后,只是开辟了一段区域,通常还不会立马分配物理内存,物理内存的分配会发生在访问时出现缺页异常后再处理,这个后续文章咱们再进一步分析。分配内存时,将heap段的最高地址指针mm->brk往高地址扩展。释放内存时,把mm->brk向低地址收缩。这篇我们就看下进程动态申请的内存,我们知道进程动态申请内存的函数是malloc,这篇讲下其涉及到的vma,即heap和mmap。通过《Linxu进程的内存管理》,我们知道了进程内存的最小单位是vma,根据不同的用处又划分了不同类型的vma,比如。

2023-02-18 15:21:43 477

原创 一文搞懂Linux内存管理之MMU的过程

我们知道内核中的寻址空间大小是由CONFIG_ARM64_VA_BITS控制的,这里以48位为例,ARMv8中,Kernel Space的页表基地址存放在TTBR1_EL1寄存器中,User Space页表基地址存放在TTBR0_EL0寄存器中,其中内核地址空间的高位为全1,(0xFFFF0000_00000000 ~ 0xFFFFFFFF_FFFFFFFF),用户地址空间的高位为全0,(0x00000000_00000000 ~ 0x0000FFFF_FFFFFFFF)这个过程也是mmu的过程。

2023-02-18 15:20:37 324

原创 2023年,Rust将成为Linux 内核第二官方语言吗?

日前,Linux 内核和 Rust on Linux 的主要开发者 Miguel Ojeda 向 Linux Kernel 邮件列表提交了一个新补丁 (v2),进一步推进了 Rust for Linux 的工作进展。邮件内容指出,新的补丁将为 Linux 内核增加对 Rust 作为第二语言的支持,并且对 Rust 的整体支持进行了多项改进。具体来说,Rust 代码现在已经依赖于稳定的 Rust 编译器而不是之前的 beta 版本状态。

2023-02-18 15:19:21 2882

原创 Linux内核读写锁与互斥锁的区别

读写锁与互斥量类似,不过读写锁允许更高的并行性。互斥量要么是锁住状态,要么是不加锁状态,而且一次只有一个线程对其加锁。读写锁可以有三种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。读写锁也叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的,当它以写模式锁住时,它是以独占模式锁住的。

2023-02-18 15:16:02 382

原创 网络开发中的“惊群”现象:多进程、多线程、异步事件

我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬。如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进程、多线程、异步事件驱动常用的三种模型。最经典的模型就是Nginx中所用的Master-Worker多进程异步驱动模型。今天和大家一起讨论一下网络开发中遇到的“惊群”现象。之前只是听说过这个现象,网上查资料也了解了基本概念,在实际的工作中还真没有遇到过。今天周末,结合自己的理解和网上的资料,彻底将“惊群”弄明白。

2023-02-18 15:13:29 170

原创 一文总结网络IO之阻塞、非阻塞、同步、异步

在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解。由于signal driven IO在实际中并不常用,所以我这只提及剩下的四种IO Model。再说一下IO发生时涉及的对象和步骤。对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。

2023-02-18 15:08:54 315

原创 Linux上分析死锁的简单方法(含运行代码)

本文简单介绍了一种在 Linux 平台下分析死锁问题的方法,对一些死锁问题的分析有一定作用。希望对大家有帮助。理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。

2023-02-18 14:59:13 761

原创 Linux中如何使用异步I/O 技术

本节将探索 Linux 的异步 I/O 模型,从而帮助我们理解如何在应用程序中使用这种技术。在传统的 I/O 模型中,有一个使用惟一句柄标识的 I/O 通道。在 UNIX® 中,这些句柄是文件描述符(这对等同于文件、管道、套接字等等)。在阻塞 I/O 中,我们发起了一次传输操作,当传输操作完成或发生错误时,系统调用就会返回。Linux 上的 AIOAIO 在 2.5 版本的内核中首次出现,现在已经是 2.6 版本的产品内核的一个标准特性了。在异步非阻塞 I/O 中,我们可以同时发起多个传输操作。

2022-12-26 21:37:37 771

原创 C++高性能服务器网络框架设计与实现

这篇文章将从两个方面来介绍,一个是服务器中的基础的网络通信部件;另外一个是,如何利用这些基础通信部件整合成一个完整的高效的服务器框架。注意:本文以下内容中的客户端是相对概念,指的是连接到当前讨论的服务程序的终端,所以这里的客户端既可能是我们传统意义上的客户端程序,也可能是连接该服务的其他服务器程序。

2022-12-26 21:35:53 3135 1

原创 浅谈Linux内核无锁编程原理

如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步。同步可分为阻塞型同步(Blocking Synchronization)和非阻塞型同步( Non-blocking Synchronization)。阻塞型同步是指当一个线程到达临界区时,因另外一个线程已经持有访问该共享数据的锁,从而不能获取锁资源而阻塞,直到另外一个线程释放锁。常见的同步原语有 mutex、semaphore 等。

2022-12-26 21:35:10 333

原创 基于Linux内核定时器时间轮实现方式

改进的单时间轮其实是一个对时间和空间折中的思路,即不会像单时间轮那样有O(1)的时间复杂度,但也不会像单时间轮那样对bucket个数有巨大的需求。在 Linux 系统中,我们可以设置slot为1个jiffy(1/HZ)的定时器,假设最大的到期时间范围要达到 2^32个 jiffies,如果采用上面这样的单时间轮,我们就需要2^32个 bucket,这会带来巨大的内存消耗,显然是需要优化改进的。相比简单的单时间轮,时间上仅仅多了1/256次(为约等于值,忽略了tv2以上产生的进位操作)的链表迁移操作耗时。

2022-12-26 21:32:56 434

原创 「游戏开发」游戏服务器端开发的一些经验

满足业务要求能迅速的实现策划需求,响应需求变更系统级的稳定性保障简化开发。将复杂性控制在架构底层,降低对开发人员的技术要求,逻辑开发不依赖于开发人员本身强大的技术实力,提高开发效率完善的运营支撑体系。

2022-12-26 21:30:36 731

原创 skynet框架如何使用socket+protobuf

编译成功的话,将protobuf.so放在config文件中lua_cpath项配置的目录下面,同时将protobuf.lua放在config文件lua_path配置的目录下,就可以调用protobuf中的库方法。这里因为没有安装 lua5.3,不能是lua5.2或是lua5.1等低版本,否则会报错。由于protobuf的lua版本的支持存在着部分缺陷,为了避免踩坑,这里我们直接使用云风博客中推荐的pbc动态proto解析库。先将下载好的文件拷贝到usr/local/src目录下。

2022-12-26 21:28:23 977

原创 大厂C++协作框架(基辅)技术详解

基辅是大推平台目前使用的Linux-C++后台开发框架。由多位资深架构师和资深C++工程师打造,在拥有数千万用户的大型分布式系统push平台上经过近年的测试。现在基辅每天为大推送平台中的数百个服务完成数百亿次RPC调用。基辅作为一个完整的开发框架,是专门为大规模分布式系统背景而构建的C++开发框架。RPC框架(TCP/UDP)FastCGI框架redis客户端(基于hiredis封装)mysql客户端(基于mysqlclient封装)mongodb客户端。

2022-12-26 21:26:41 1057

原创 Linux下C/C++代码编写指南———串讲

3. 链接就是把目标文件、目标文件所需要的库文件,其他目标代码(指所依赖的其他.o文件—可以是编译中生成的,不是源文件)等进行组织,生成可执行文件的过程,在linux系统上生成没有后缀的可执行文件,在windows系统中生成.exe文件。该过程的实现:在2中生成了main.o和test1.o两个目标文件,这里需要进行链接,按照定义,就是主要的目标文件(mian.o)和其他目标文件(test1.o)进行链接,如果main.o用到的库的文件,这里也会自动链接到库中。在makefile中用来清理产生的文件。

2022-12-26 21:20:06 452

原创 mycat实现MySQL读写分离

报表系统,借助于Mycat的分表能力,处理大规模报表的统计替代Hbase,分析大数据,作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择。作为海量数据实时查询的一种简单有效方案,比如 100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;#注意:数据库名字为mycat的逻辑数据库。

2022-12-26 21:18:33 253

原创 MySQL性能调优,你必须了解的15个重要变量

如果你已经在用MySQL 5.6或者5.7,并且你的数据表都是InnoDB,那么表示你已经设置好了。如果没有,确保把你的表转换为InnoDB并且设置default_storage_engine为InnoDB。 为什么?简而言之,因为InnoDB是MySQL(包括Percona Server和MariaDB)最好的存储引擎 – 它支持事务,高并发,有着非常好的性能表现(当配置正确时)。这个是InnoDB最重要变量。实际上,如果你的主要存储引擎是InnoDB,那么对于你,这个变量对于MySQL是最重要的。 基本

2022-12-26 21:16:14 136

原创 初学者都能看懂的缓存入门

由于应用访问数据库的连接数有限,当数据库的处理能力跟不上请求数时,新的请求将排队等待,从而导致我们的后台程序也会阻塞。可以在数据库之上增加一层缓存,当后台程序首次读取数据时,将得到的数据存入缓存中,那么后续的请求要读取相同数据时,只需从缓存中读取即可。而且如果是在分布式场景下,多个机器都要使用缓存,此时如果在每个服务器上单独维护一份本地缓存,不仅无法共享数据,而且非常浪费内存(因为每台机器可能缓存了相同的数据)。分布式缓存是指独立的缓存服务,不和任何一个具体的应用耦合,可以独立运行并搭建缓存集群。

2022-12-23 20:58:35 115

原创 初学者入门|一文带你读懂Kubernetes

其通过一个软件层的封装,提供和物理硬件相同的输入输出表现,实现了操作系统和计算机硬件的解耦,将OS和计算机从一对一转变为多对多(实际上是一对多)的关系。Pod的实现需要使用一个中间容器(Infra容器),在这个Pod中,Infra容器永远是第一个被创建的容器,用户定义的其他容器通过Join Network Namespace的方式与Infra容器关联在一起。对于声明式而言,用户设定目标为3,系统获取当前副本数为2,系统判定当前值与目标值的差为1,便自行加1,最终实现副本数为3的目标状态。

2022-12-23 20:52:57 183

转载 一文搞懂 Redis 架构演化之路

总结一下,我们是如何从 0 到 1,再从 1 到 N 构建一个稳定、高性能的 Redis 集群的,从这之中你可以清晰地看到 Redis 架构演进的整个过程。数据怕丢失-> 持久化(RDB/AOF)恢复时间久-> 主从副本(副本随时可切)故障手动切换慢-> 哨兵集群(自动切换)读存在压力-> 扩容副本(读写分离)写存在压力/容量瓶颈-> 分片集群分片集群社区方案-> Twemproxy、Codis(Redis 节点之间无通信,需要部署哨兵,可横向扩容)分片集群官方方案。

2022-12-23 20:51:01 275

原创 从架构层面了解Kubernetes

在K8s中控制面还有很多核心过程,但因为篇幅所限这里无法讨论所有的控制面板过程。架构设计过程:整体架构->核心流程设计。这里整理K8s架构的时候也是以类似的方式进行。K8s是由开源社区维护的,那随着不断的演进肯定会朝着好的方向前进。但在发展过程中,代码的水平设计的水平都会出现参差不齐的情况。在K8s中有好的有不好的,我们只需要取其精华,去其糟粕即可。

2022-12-23 20:48:01 582

原创 【万字长文】从Linux零拷贝深入了解Linux I/O

速度足够快:存储器的存取速度应当快于 CPU 执行一条指令,这样 CPU 的效率才不会受限于存储器容量足够大:容量能够存储计算机所需的全部数据价格足够便宜:价格低廉,所有类型的计算机都能配备但是现实往往是残酷的,我们目前的计算机技术无法同时满足上述的三个条件,于是现代计算机的存储器设计采用了一种分层次的结构:寄存器、高速缓存、主存和磁盘,这些存储器的速度逐级递减而容量逐级递增 存取速度最快的是寄存器。

2022-12-23 20:45:03 746

原创 高可用架构和系统设计经验

导语 | 本文从研发规范层面、应用服务层面、存储层面、产品层面、运维部署层面、异常应急层面这六大层面去剖析一个高可用架构和系统需要有哪些关键的设计和考虑。

2022-12-23 20:42:30 1333

原创 谈谈用户态 TCP 协议实现

TCP 协议是目前名气最大、使用最广泛的传输层网络协议。TCP 是一个可靠的(reliable)、面向连接的(connection-oriented)、基于字节流(byte-stream)、全双工的(full-duplex)协议。正是因为这些优点,TCP 协议成为了网络协议重点中的重点,是学习、面试、考试上的常客,这也导致了 TCP 的资料很多,但是普遍集中在“形”上面,很多人将三次握手、四次挥手、滑动窗口等知识点背得滚瓜烂熟,但却没有理解 TCP “可靠” 协议的精髓。

2022-11-24 16:52:32 1100

原创 万字总结线程池

社区版的MySQL的连接处理方法默认是为每个连接创建一个工作线程的one-thread-per-connection(Per_thread)模式。这种模式下,由于系统的资源是有限的,随着连接数的增加,资源的竞争也增加,连接的响应时间也随之增加,如response time图所示。对于数据库整体吞吐而言,则是在资源未耗尽时随着连接数增加,一旦连接数超过了某个耗尽系统资源的临界点,数据库整体吞吐就会随着各连接的资源争抢而下降,如下图所示。如何避免在连接数暴增时,因资源竞争而导致系统吞吐下降的问题呢?

2022-11-23 21:24:17 1553

原创 万字长文总结分布式事务,总有一款适合你

分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,相对的,传统事务也称之为单机事务。在单机事务时代,我们通常可以使用数据库的事务操作来解决数据的一致性问题;那么在微服务越来越流行的当下,我们应该如何保证不同服务器上数据的一致性?本文先从CAP理论和BASE理论说起,之后从一致性强弱的角度梳理当前主流的强一致性方案、最终一致性方案和弱一致性方案,最后总结一下各个方案的特点和适用场景,希望对你有所帮助。

2022-11-23 21:20:20 859

原创 【后台技术】异步编程指北,问题和重点

同步、异步,并发、并行、串行,这些名词在我们的开发中会经常遇到,这里对异步编程做一个详细的归纳总结,希望可以对这方面的开发有一些帮助。

2022-11-23 21:15:20 650

原创 Docker常用命令的原理与简单实战

docker export命令创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容(译者注:expoxt后的容器再import到Docker中,通过docker images –tree命令只能看到一个镜像;docker stop和docker kill命令会发送UNIX的信号给运行中的进程,docker pause命令则不一样,它利用了cgroups的特性将运行中的进程空间暂停。和export命令不同,这个命令为每一个层都保存了它们的元数据。

2022-11-23 21:11:47 218

原创 由CPU高负载引发内核探索之旅

最后,总结整个问题和定位过程,我们从一次CPU高负载问题出发,从最开始在问题机器上猜想和分析,找不到确切答案。通过比较不同机型函数实现差异找到关键点。再通过代码分析、复现验证、社区求证这三个方面将问题的前因后果分析清楚,最终给出了解决方案。t=M85B大厂面试题锦集+视频教程https://docs.qq.com/doc/DTlhVekRrZUdDUEpy。

2022-11-23 21:10:12 386

原创 FasterKV存储引擎介绍

微软开源的FasterKV存储引擎,使用Hash作为主索引,基于Log追加写和原地更新的混合存储方式,无锁并发,性能亮眼。而另一类基于log存储的存储是使用hash作为主索引组织数据,如Bitcask,因为Hash,不具备范围查询这种重要的功能,但可以在其他方面发挥优势,如极高的性能的点查,FasterKV也是这类引擎。

2022-11-23 21:07:34 889

原创 高并发架构设计经验

并发问题一直是服务端编程中的重点和难点问题,为了优化系统的并发量,单机解决高并发问题从最初的 Fork 进程开始,到进程池/线程池,再到 Epoll 事件驱动(Nginx),再到协程(如 Goroutine)。不过,既然是高并发系统,不能应用层直接读写 DB 的,一定有一个缓存在上面,如果直接读写 DB 能够搞定,其实不能叫高并发了,只能说是并发有点高。消息队列也是一种异步化操作,但是除了依赖外部的中间件如消息队列,在应用内我们也可以通过线程池、协程的方式做异步化,能异步的尽量异步处理,这样可以提高并发。

2022-11-23 21:05:00 210

原创 c++异步从理论到实践 -总览篇

来源于1.6X boost同期的asio standalone版本去除了各平台网络处理相关的代码仅保留了post和相关的功能(新版本有executor实现)早期c++11兼容, 无coroutine支持除网络库外, asio非常有使用价值的一部分代码。

2022-11-23 21:01:27 219

原创 浅谈缓存最终一致性的解决方案

在解决缓存一致性的过程中,有多种途径可以保证缓存的最终一致性,应该根据场景来设计合适的方案,读多写少的场景下,可以选择采用“ Cache-Aside 结合消费数据库日志做补偿”的方案,写多的场景下,可以选择采用“ Write-Through 结合分布式锁”的方案 ,写多的极端场景下,可以选择采用“ Write-Behind ” 的方案。

2022-11-23 20:58:01 133

原创 Golang简洁架构实战

以上就是我对 golang 的项目中发现问题的一点点总结与思考,思考的先不管对不对,总归是解决了我们当下的一些问题。不过,项目总归是需要不断重构完善的,所以下次有问题的时候下次再改呗。对于我上面的总结和描述感觉有不对的地方,请随时指出来一起讨论。

2022-11-23 20:55:48 1044

空空如也

空空如也

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

TA关注的人

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