![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++后端开发
文章平均质量分 94
简说Linux
这个作者很懒,什么都没留下…
展开
-
网络开发中的“惊群”现象:多进程、多线程、异步事件
我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬。如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进程、多线程、异步事件驱动常用的三种模型。最经典的模型就是Nginx中所用的Master-Worker多进程异步驱动模型。今天和大家一起讨论一下网络开发中遇到的“惊群”现象。之前只是听说过这个现象,网上查资料也了解了基本概念,在实际的工作中还真没有遇到过。今天周末,结合自己的理解和网上的资料,彻底将“惊群”弄明白。原创 2023-02-18 15:13:29 · 181 阅读 · 0 评论 -
一文总结网络IO之阻塞、非阻塞、同步、异步
在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解。由于signal driven IO在实际中并不常用,所以我这只提及剩下的四种IO Model。再说一下IO发生时涉及的对象和步骤。对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。原创 2023-02-18 15:08:54 · 328 阅读 · 0 评论 -
Linux上分析死锁的简单方法(含运行代码)
本文简单介绍了一种在 Linux 平台下分析死锁问题的方法,对一些死锁问题的分析有一定作用。希望对大家有帮助。理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。原创 2023-02-18 14:59:13 · 780 阅读 · 0 评论 -
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 · 800 阅读 · 0 评论 -
C++高性能服务器网络框架设计与实现
这篇文章将从两个方面来介绍,一个是服务器中的基础的网络通信部件;另外一个是,如何利用这些基础通信部件整合成一个完整的高效的服务器框架。注意:本文以下内容中的客户端是相对概念,指的是连接到当前讨论的服务程序的终端,所以这里的客户端既可能是我们传统意义上的客户端程序,也可能是连接该服务的其他服务器程序。原创 2022-12-26 21:35:53 · 3211 阅读 · 1 评论 -
浅谈Linux内核无锁编程原理
如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步。同步可分为阻塞型同步(Blocking Synchronization)和非阻塞型同步( Non-blocking Synchronization)。阻塞型同步是指当一个线程到达临界区时,因另外一个线程已经持有访问该共享数据的锁,从而不能获取锁资源而阻塞,直到另外一个线程释放锁。常见的同步原语有 mutex、semaphore 等。原创 2022-12-26 21:35:10 · 348 阅读 · 0 评论 -
基于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 · 443 阅读 · 0 评论 -
「游戏开发」游戏服务器端开发的一些经验
满足业务要求能迅速的实现策划需求,响应需求变更系统级的稳定性保障简化开发。将复杂性控制在架构底层,降低对开发人员的技术要求,逻辑开发不依赖于开发人员本身强大的技术实力,提高开发效率完善的运营支撑体系。原创 2022-12-26 21:30:36 · 758 阅读 · 0 评论 -
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 · 992 阅读 · 0 评论 -
大厂C++协作框架(基辅)技术详解
基辅是大推平台目前使用的Linux-C++后台开发框架。由多位资深架构师和资深C++工程师打造,在拥有数千万用户的大型分布式系统push平台上经过近年的测试。现在基辅每天为大推送平台中的数百个服务完成数百亿次RPC调用。基辅作为一个完整的开发框架,是专门为大规模分布式系统背景而构建的C++开发框架。RPC框架(TCP/UDP)FastCGI框架redis客户端(基于hiredis封装)mysql客户端(基于mysqlclient封装)mongodb客户端。原创 2022-12-26 21:26:41 · 1081 阅读 · 0 评论 -
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 · 459 阅读 · 0 评论 -
mycat实现MySQL读写分离
报表系统,借助于Mycat的分表能力,处理大规模报表的统计替代Hbase,分析大数据,作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择。作为海量数据实时查询的一种简单有效方案,比如 100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;#注意:数据库名字为mycat的逻辑数据库。原创 2022-12-26 21:18:33 · 268 阅读 · 0 评论 -
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 · 143 阅读 · 0 评论 -
初学者都能看懂的缓存入门
由于应用访问数据库的连接数有限,当数据库的处理能力跟不上请求数时,新的请求将排队等待,从而导致我们的后台程序也会阻塞。可以在数据库之上增加一层缓存,当后台程序首次读取数据时,将得到的数据存入缓存中,那么后续的请求要读取相同数据时,只需从缓存中读取即可。而且如果是在分布式场景下,多个机器都要使用缓存,此时如果在每个服务器上单独维护一份本地缓存,不仅无法共享数据,而且非常浪费内存(因为每台机器可能缓存了相同的数据)。分布式缓存是指独立的缓存服务,不和任何一个具体的应用耦合,可以独立运行并搭建缓存集群。原创 2022-12-23 20:58:35 · 117 阅读 · 0 评论 -
一文搞懂 Redis 架构演化之路
总结一下,我们是如何从 0 到 1,再从 1 到 N 构建一个稳定、高性能的 Redis 集群的,从这之中你可以清晰地看到 Redis 架构演进的整个过程。数据怕丢失-> 持久化(RDB/AOF)恢复时间久-> 主从副本(副本随时可切)故障手动切换慢-> 哨兵集群(自动切换)读存在压力-> 扩容副本(读写分离)写存在压力/容量瓶颈-> 分片集群分片集群社区方案-> Twemproxy、Codis(Redis 节点之间无通信,需要部署哨兵,可横向扩容)分片集群官方方案。转载 2022-12-23 20:51:01 · 276 阅读 · 0 评论 -
【万字长文】从Linux零拷贝深入了解Linux I/O
速度足够快:存储器的存取速度应当快于 CPU 执行一条指令,这样 CPU 的效率才不会受限于存储器容量足够大:容量能够存储计算机所需的全部数据价格足够便宜:价格低廉,所有类型的计算机都能配备但是现实往往是残酷的,我们目前的计算机技术无法同时满足上述的三个条件,于是现代计算机的存储器设计采用了一种分层次的结构:寄存器、高速缓存、主存和磁盘,这些存储器的速度逐级递减而容量逐级递增 存取速度最快的是寄存器。原创 2022-12-23 20:45:03 · 775 阅读 · 0 评论 -
高可用架构和系统设计经验
导语 | 本文从研发规范层面、应用服务层面、存储层面、产品层面、运维部署层面、异常应急层面这六大层面去剖析一个高可用架构和系统需要有哪些关键的设计和考虑。原创 2022-12-23 20:42:30 · 1369 阅读 · 0 评论 -
谈谈用户态 TCP 协议实现
TCP 协议是目前名气最大、使用最广泛的传输层网络协议。TCP 是一个可靠的(reliable)、面向连接的(connection-oriented)、基于字节流(byte-stream)、全双工的(full-duplex)协议。正是因为这些优点,TCP 协议成为了网络协议重点中的重点,是学习、面试、考试上的常客,这也导致了 TCP 的资料很多,但是普遍集中在“形”上面,很多人将三次握手、四次挥手、滑动窗口等知识点背得滚瓜烂熟,但却没有理解 TCP “可靠” 协议的精髓。原创 2022-11-24 16:52:32 · 1128 阅读 · 0 评论 -
万字总结线程池
社区版的MySQL的连接处理方法默认是为每个连接创建一个工作线程的one-thread-per-connection(Per_thread)模式。这种模式下,由于系统的资源是有限的,随着连接数的增加,资源的竞争也增加,连接的响应时间也随之增加,如response time图所示。对于数据库整体吞吐而言,则是在资源未耗尽时随着连接数增加,一旦连接数超过了某个耗尽系统资源的临界点,数据库整体吞吐就会随着各连接的资源争抢而下降,如下图所示。如何避免在连接数暴增时,因资源竞争而导致系统吞吐下降的问题呢?原创 2022-11-23 21:24:17 · 1607 阅读 · 0 评论 -
万字长文总结分布式事务,总有一款适合你
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,相对的,传统事务也称之为单机事务。在单机事务时代,我们通常可以使用数据库的事务操作来解决数据的一致性问题;那么在微服务越来越流行的当下,我们应该如何保证不同服务器上数据的一致性?本文先从CAP理论和BASE理论说起,之后从一致性强弱的角度梳理当前主流的强一致性方案、最终一致性方案和弱一致性方案,最后总结一下各个方案的特点和适用场景,希望对你有所帮助。原创 2022-11-23 21:20:20 · 879 阅读 · 0 评论 -
【后台技术】异步编程指北,问题和重点
同步、异步,并发、并行、串行,这些名词在我们的开发中会经常遇到,这里对异步编程做一个详细的归纳总结,希望可以对这方面的开发有一些帮助。原创 2022-11-23 21:15:20 · 657 阅读 · 0 评论 -
FasterKV存储引擎介绍
微软开源的FasterKV存储引擎,使用Hash作为主索引,基于Log追加写和原地更新的混合存储方式,无锁并发,性能亮眼。而另一类基于log存储的存储是使用hash作为主索引组织数据,如Bitcask,因为Hash,不具备范围查询这种重要的功能,但可以在其他方面发挥优势,如极高的性能的点查,FasterKV也是这类引擎。原创 2022-11-23 21:07:34 · 948 阅读 · 0 评论 -
高并发架构设计经验
并发问题一直是服务端编程中的重点和难点问题,为了优化系统的并发量,单机解决高并发问题从最初的 Fork 进程开始,到进程池/线程池,再到 Epoll 事件驱动(Nginx),再到协程(如 Goroutine)。不过,既然是高并发系统,不能应用层直接读写 DB 的,一定有一个缓存在上面,如果直接读写 DB 能够搞定,其实不能叫高并发了,只能说是并发有点高。消息队列也是一种异步化操作,但是除了依赖外部的中间件如消息队列,在应用内我们也可以通过线程池、协程的方式做异步化,能异步的尽量异步处理,这样可以提高并发。原创 2022-11-23 21:05:00 · 224 阅读 · 0 评论 -
c++异步从理论到实践 -总览篇
来源于1.6X boost同期的asio standalone版本去除了各平台网络处理相关的代码仅保留了post和相关的功能(新版本有executor实现)早期c++11兼容, 无coroutine支持除网络库外, asio非常有使用价值的一部分代码。原创 2022-11-23 21:01:27 · 240 阅读 · 0 评论 -
浅谈缓存最终一致性的解决方案
在解决缓存一致性的过程中,有多种途径可以保证缓存的最终一致性,应该根据场景来设计合适的方案,读多写少的场景下,可以选择采用“ Cache-Aside 结合消费数据库日志做补偿”的方案,写多的场景下,可以选择采用“ Write-Through 结合分布式锁”的方案 ,写多的极端场景下,可以选择采用“ Write-Behind ” 的方案。原创 2022-11-23 20:58:01 · 139 阅读 · 0 评论 -
一文搞懂Redis架构演化之路
总结一下,我们是如何从 0 到 1,再从 1 到 N 构建一个稳定、高性能的 Redis 集群的,从这之中你可以清晰地看到 Redis 架构演进的整个过程。数据怕丢失-> 持久化(RDB/AOF)恢复时间久-> 主从副本(副本随时可切)故障手动切换慢-> 哨兵集群(自动切换)读存在压力-> 扩容副本(读写分离)写存在压力/容量瓶颈-> 分片集群分片集群社区方案-> Twemproxy、Codis(Redis 节点之间无通信,需要部署哨兵,可横向扩容)分片集群官方方案。原创 2022-11-19 17:48:07 · 131 阅读 · 0 评论 -
C++17新特性的使用场景总结
过去当我们编写一个获取目标值的函数时,如果这个函数在某些情况下不能返回目标值,那么我们就必须通过两个参数去获得目标值:一个参数来表明是否存在目标值,另一个参数返回目标值;类型的输入参数,当我们传入C风格字符串时,那么首先要生成一个string对象,此时带来了额外的拷贝操作。在上述代码中,每分割完一次字符串,都需要把已经分割完的部分去掉,但是我们不能改变原字符串,因此只能拷贝一个新的字符串传入下一次递归中。语句来进行静态类型检查,保证模板输入的类型满足某种要求,例如在下列的判断一个数是奇数还是偶数的。原创 2022-11-19 17:45:41 · 681 阅读 · 0 评论 -
从无栈协程到C++异步框架
了解了协程在C++中的部分历史, 我们来简单了解一下协程的执行机制, 这里我们直接以C++20为例, 先来看一下概览图:有栈协程和无栈协程定义中断点和重入点的方式和机制略有差异, 执行到中断点和重入点的时候大家使用的保存和恢复机制不太一样, 但以Host App的视角来看, 整体的执行过程其实是比较一致的. 这里我们是以C++20的无栈协程来举例的, 通过图中的关键字co_await, 我们定义了point1和point2两个成对的中断点和重入点.原创 2022-11-19 17:38:33 · 420 阅读 · 0 评论 -
万字详解C++避坑指南总结
C++是一门古老的语言,但仍然在不间断更新中,不断引用新特性。但与此同时C++又甩不掉巨大的历史包袱,并且C++的设计初衷和理念造成了C++异常复杂,还出现了很多不合理的“缺陷”。 本文主要有3个目的: 1. 总结一些C++晦涩难懂的语法现象,解释其背后原因,作为防踩坑之用 2. 和一些其他的编程语言进行比较,列举它们的优劣 3. 发表一些我自己作为C++程序员的看法和感受C++有一个很大的历史包袱,就是C语言。C语言诞生时间很早,并且它是为了编写OS而诞生的,语法更加底层。有人说,C并不是针对程序员友好的转载 2022-11-19 17:29:29 · 328 阅读 · 0 评论 -
腾讯企业级消息中间件CMQ技术解密
架构图CMQ属于典型的三层架构,支持业界主流协议,业务可以选择HTTP/AMQP/MQTT等多种协议,适配层主要负责协议适配和路由控制,同时支撑系统水平弹性伸缩,后端Broker Set 提供消息持久化存储、转发以及基于消息的高阶功能,例如延时消息、事务消息、死信消息等;控制Server和管控平台负责对整个系统进行智能调度、故障处理、运营监控。原创 2022-11-19 17:23:12 · 677 阅读 · 0 评论 -
深入浅出百亿请求高可用Redis分布式集群
随着直播元年开启,越来越多的直播产品如春笋般出现,在拉动营收的过程中,产品竭尽全力思考着各种活动来刺激用户的消费欲望,而这类活动的基础形式就是榜单,在2016年我们基于cmem及扫描流水表的方式来实现榜单排名,2017开始,我们对原有系统进行重构,使用redis作为我们的榜单基础存储,在重构的过程中接到调研redis分布式解决方案的任务之后,比对业内各种开源产品,最后定下Codis,并对其中细节做了一些研究,期间在与Codis作者交流的过程中,有幸知道增值产品部的simotang已经在部门引入codis近2原创 2022-11-19 16:35:25 · 291 阅读 · 0 评论 -
腾讯开源DCache,分布式NoSQL存储系统
作为一个分布式存储系统,DCache 的应用场景没有限制在缓存上,山宝银介绍,对于有高性能 NoSQL 存储需求的场景,都可以使用 DCache,而且因为 DCache 具备容量淘汰与过期自动清理数据的功能,对于需要存储热点数据(如热门文章)与临时数据(如有时效性的聊天记录)的场景也可以提供很好的支持。有一种普遍的观点是,数据库 SQL 与分布式之间存在天然对立性,山宝银的理解是:“分布式系统因为数据分散在不同的节点,所以像 SQL 的联表、事务等操作需要全局的锁保护,这样处理起来比较复杂,并且影响性能。原创 2022-11-19 16:32:10 · 231 阅读 · 0 评论 -
深入浅出 C++ 11 右值引用
(参考 [sec|值类别 vs 变量类型]),对返回的对象进行 [sec|移动语义] 移动构造(语言标准);尽管 C++ 引入了移动语义,移动的过程 仍有优化的空间 —— 与其调用一次 没有意义的移动构造函数,不如让编译器 直接跳过这个过程 —— 于是就有了。由于每个类型可能是左值引用或右值引用,针对所有可能的左右值引用组合,并不一定代表右值引用,它也可能是左值引用 —— 如果一个引用符号需要通过 左右值类型推导(模板参数类型 或。,具体是否移动对象的资源、如何移动对象的资源,都需要通过编写代码。原创 2022-11-18 19:48:07 · 426 阅读 · 0 评论 -
设计一个高并发、高可用秒杀系统
上图是一个典型的互联网业务,用户完成一个写操作,一般会通过接入层和逻辑层,这里的服务都是无状态,可以通过平行拓展去解决高并发的问题;到了 db 层,必须要落到介质中,可以是磁盘/ssd/内存,如果出现 key 的冲突,会有一些并发控制技术,例如 cas/加锁/串行排队等。微视春节项目中的集卡瓜分活动,是一个典型的秒杀场景,自己参与其中,分享一些心得和总结。漏斗型业务,指的是,用户的请求,从客户端到 db 层,层层递减,递减的程度视业务而定。在比较简单的业务中,才会采用这个模型。原创 2022-11-18 19:43:55 · 111 阅读 · 0 评论 -
深入理解 Mysql 索引底层原理
Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 Mysql 数据的存储形式以及索引的设计,决定了 Mysql 整体的数据检索性能。我们知道,索引的作用是做数据的快速检索,而快速检索的实现的本质是数据结构。通过不同数据结构的选择,实现各种数据快速检索。在数据库中,高效的查找算法是非常重要的,因为数据库中存储了大量数据,一个高效的索引能节省巨大的时间。比如下面这个数据表,如果 Mysql 没有实现索引算法,那么查找 id=7 这个数据,那么只能采取暴力顺序遍历查找原创 2022-11-18 19:39:20 · 170 阅读 · 0 评论 -
万字详文:TCP 拥塞控制详解
在了解 TCP 的拥塞控制之前,先来看看 TCP 的首部格式和一些基本概念。TCP 头部标准长度是 20 字节。包含源端口、目的端口、序列号、确认号、数据偏移、保留位、控制位、窗口大小、校验和、紧急指针、选项等。该字段长 4 位,单位为 4 字节。表示为 TCP 首部的长度。所以 TCP 首部长度最多为 60 字节。目前的 TCP 控制位如下,其中 CWR 和 ECE 用于拥塞控制,ACK、RST、SYN、FIN 用于连接管理及数据传输。1.3 窗口大小(Window)该字段长度位 16 位,即原创 2022-11-18 16:03:55 · 2156 阅读 · 0 评论 -
程序员精进之路:性能调优利器--火焰图
SystemTap 是动态追踪工具,它通过探针机制,来采集内核或者应用程序的运行信息,从而可以不用修改内核和应用程序的代码,就获得丰富的信息,帮你分析、定位想要排查的问题。火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的,和所有其他的 profiling 方法不同的是,火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。使用 SystemTap 统计相关数据往往需要自己依照它的语法,编写脚本,具有一定门槛。原创 2022-11-18 16:02:22 · 2730 阅读 · 0 评论 -
彻底搞懂TCP协议:从 TCP 三次握手四次挥手说起
下面两图大家再熟悉不过了,TCP 的三次握手和四次挥手见下面左边的”TCP 建立连接”、”TCP 数据传送”、”TCP 断开连接”时序图和右边的”TCP 协议状态机” 。要弄清 TCP 建立连接需要几次交互才行,我们需要弄清建立连接进行初始化的目标是什么。TCP 进行握手初始化一个连接的目标是:分配资源、初始化序列号(通知 peer 对端我的初始序列号是多少),知道初始化连接的目标,那么要达成这个目标的过程就简单了,握手过程可以简化为下面的四次交互:1)client 端首先发送一个 SYN 包告诉 Serv原创 2022-11-18 15:56:53 · 219 阅读 · 0 评论 -
高效大数据开发之 bitmap 思想的应用
当然任何事情不可能只有优点,而不存在缺点的情况,这里这个优化的模型只是参考了 bitmap 思想,并不是 bitmap 方案实现,虽然可以将 31 天活跃用户压缩 80%多存储,但是每天都存储 31 天活跃用户的压缩数据,因此相比之前只保留天增量表来说,还是增加了实际存储空间,但是这个以存储换计算的方案是符合数仓设计原则的,因为计算是用成本昂贵的 cpu 和内存资源,存储是用成本低廉的磁盘资源,因此有涉及最近 N 天累计或者留存计算需求的朋友可以借鉴这样的思路。答案是肯定的,可以借助 bitmap 思想。原创 2022-11-18 15:54:48 · 287 阅读 · 0 评论 -
Linux I/O 原理和 Zero-copy 技术全面分析
如今的网络应用早已从 CPU 密集型转向了 I/O 密集型,网络服务器大多是基于 模型,也即 模型,客户端需要和服务端进行大量的网络通信,这也决定了现代网络应用的性能瓶颈:I/O。传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和用户进程地址空间定义的缓冲区之间进行传输。设置缓冲区最大的好处是可以减少磁盘 I/O 的操作,如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作;然而原创 2022-11-17 17:07:39 · 431 阅读 · 0 评论