brpc(1)—bthread执行器
本人最近一个月由于绩效不错,奋斗劲反而没了,比较摆烂,深感惭愧。特此挖坑,给我好好学brpc!!!
前面提到,CPU运算的瓶颈往往不在于计算,而在于内存、存储和网络。相比于设计算法模型,CPU计算更侧重于工程。
相比下,GPU运算才是真正的高性能运算,虽然它的瓶颈同样可能来自GPU、显存、存储和网络,但提高计算能力、设计优秀的算法、编写高性能低开销的算子,是GPU运算的核心。GPU运算的典型场景就是大模型。
由于本人是存储方向,前面的文章大多数是关于存储的。计算机系统=计算+存储,其中计算包括计算单元(CPU、GPU)、cacheline和内存态的处理, 而存储特指IO处理。计算可分为CPU计算和GPU计算两部分,前者的典型场景是操作系统处理、进程执行、互联网业务处理和大数据和OLAP处理等。后者的典型场景是大模型的训练推理。
本文介绍CPU计算。CPU计算主要包括业务处理和大数据处理两部分,CPU运算的瓶颈往往不在于计算,而在于内存、存储和网络(可能这是ddia 把大数据计算也放到内的原因)。相比于算法模型,CPU计算更侧重于工程。
C++右值和右值引用是最容易用错的特性之一,相关教程普遍写得不清晰。实际上,只有在所有权转移时才需要使用右值引用,移动语义移动的是所有权,完美转发转发的也是所有权。
先放总结
C++可以写出性能高效的程序,一个原因来自语言本身的因素,例如
除了语言本身的因素,生态因素对于高性能同样重要。用户程序不可能每次都造轮子,如果没有高性能的库,C++不会成为性能高效程序的首选。例如Python语言的性能虽然差,但python有tensorflow, pytorch等高性能神经网络框架,这让python写出的神经网络性能同样高效。
dpdk和spdk工具链让C++开发高性能网络服务器和高性能存储服务变得容易,GPU等新硬件和cuda等生态让C++成为高性能计算的基础。C++20提供了协程支持,deepseek 开源的3FS 就是C++20高性能编程的典型例子。
文件系统是组织磁盘的形式, 文件系统提供了文件元数据信息,以及文件内容寻址能力(即将文件offset+length映射为磁盘位置);另一方面适配不同的磁盘硬件,让用户程序无须考虑硬件的区别。对用户程序来说,存储等于文件系统。
文件系统整体可以由客户端、元数据服务、数据服务三个部分组成, 包括read, write, setattr, getattr, lookup, readdir, create, rename, hardlink, symlink, readlink, remove等12个接口,支持随机读写文件。
为什么要有分布式文件系统? 1. 提供水平可扩展, 海量高性能存储 2. 提供多客户端的并发访问服务
leveldb前台可并发读,但只能串行写。
leveldb memtable通过无锁skiplist结构 支持读写并发
leveldb的后台线程只有一个,只处理compaction这一个任务, leveldb的minor compaction和major compaction是一起处理的
redis 通过网络服务接收远程命令,进行处理,将执行结果返回。
redis 4.0版本监听网络请求,处理请求和命令都由一个主线程完成。
redis的rdb和aof 都是经典的数据持久化/备份手段,rdb关注数据库的数据, aof关注数据库的操作。
redis 是最值得学习的开源项目,
本文阐释redis数据结构,redis 数据结构设计的一大特点是节省内存。原因是redis作为内存数据库需要节省内存使用(连续内存的数组能减少内存碎片)。这对架构设计同样有借鉴意义,通过节省元数据内存使用来把更多元数据/索引放在内存上,可以大大提高处理的吞吐和延迟。
leveldb 可分为五大块。db, iterator,version, memtable+log, tablefile。
leveldb 的架构图资料上有很多,可以参考网站