c/c++Linux服务器架构学习笔记
文章平均质量分 90
该专栏是参加腾讯课堂零声教育C/C++Linux服务器高级架构系统学习笔记总结
Mr.简锋
一个不会计算机的小白
展开
-
内核编译bpf
缺少 bison库。缺少clang编译器。原创 2023-08-19 17:36:00 · 303 阅读 · 0 评论 -
openresty学习笔记
openresty 是一个基于 nginx 与 lua 的高性能 web 平台,其内部 集成了大量精良的 lua 库、第三方模块以及大数的依赖项。用于 方便搭建能够处理超高并发、扩展性极高的动态 web 应用、 web 服务和动态网关。openresty 通过汇聚各种设计精良的 nginx 模块,从而将 nginx 有效地变成一个强大的通用 Web 应用平台。原创 2023-02-26 10:28:59 · 1039 阅读 · 1 评论 -
googletest 笔记
1 测试应该是独立的和可重复的。调试一个由于其他测试而成功或失败的测试是一件痛苦的事情。googletest 通过在不同的对象上运行测试来隔离测试。当测试失败时,googletest 允许您单独运行它以快速调试。2 测试应该很好地“组织”,并反映出测试代码的结构。googletest将相关测试分组到可以共享数据和子例程的测试套件中。这种通用模式很容易识别,并使测试易于维护。当人们切换项目并开始在新的代码库上工作时,这种一致性尤其有用。3 测试应该是可移植的和可重用的。原创 2023-02-21 09:59:53 · 432 阅读 · 0 评论 -
Kubernetes 基本概念
Kubernetes 是一个可移植、可扩展的开源平台。用于管理容器化的工作负载和服务,可促进声明式配 置和自动化。是谷歌保密了十几年的秘密武器Borg的开源版本,谷歌一直通过Borg系统管理着数量庞大 的应用程序集群。由于Kubernetes是基于容器技术的分布式架构方案,所以不局限于任何编程语言。Kubernetes是一个可插拔的开放式平台,那些默认的解决方案可都是可选的。Kubernetes为构建开发 人员平台提供了基础,但是在重要的地方保留了用户的选择权,拥有更高的灵活性。原创 2023-01-18 17:27:27 · 1144 阅读 · 0 评论 -
Docker Swarm
Docker Swarm 是Docker官方的跨节点的容器编排工具。用户只需要在单一的管理节点上操作,即可管理集群下的所有节点和容器。原创 2023-01-17 18:43:55 · 942 阅读 · 0 评论 -
Docker-Compose
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。其代码目前在 https://github.com/docker/compose 上开源。原创 2023-01-17 17:47:49 · 883 阅读 · 0 评论 -
Docker 容器监控
源码:https://github.com/google/cadvisor源码:https://github.com/prometheus/node_exporter官方文档:https://prometheus.io/ PromQL文档:https://prometheus.io/docs/prometheus/latest/querying/basics/源码:https://github.com/prometheus/prometheus。原创 2023-01-17 14:39:21 · 1337 阅读 · 1 评论 -
Docker 网络
在一台未经特殊网络配置的Ubuntu机器上安装完Docker之后,在宿主机上通过ifconfig命令可以看到多 了一块名为docker0的网卡。该网卡即是docker0网桥,网桥在这里的作用相当于交换机,为连接在其上 的设备转发数据帧。网桥上的veth网卡设备相当于交换机上的端口,可以将多个容器或虚拟机连接其 上,这些端口工作在二层,所以是不需要配置IP信息的。原创 2023-01-17 10:31:06 · 2491 阅读 · 0 评论 -
Docker数据卷
Docker的镜像是有一系列的只读层组合而来,当启动一个容器时,Docker加载镜像的所有只读层,并在最上层加入一个读写层。这个设计使得Docker可以提高镜像构建、存储和分发的效率,节省了时间和存储空间,然而也存在一些问题:为了解决这些问题,Docker引入了数据卷(volume)机制。Volume 是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享和持久化提供便利。Docker run 和 docker create 通原创 2023-01-16 17:54:38 · 686 阅读 · 0 评论 -
dockerfile笔记
Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令和说明, 每条指令构建一层, 通过 docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建.有了 Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 就可生成 docker 镜像.原创 2023-01-15 21:13:56 · 1024 阅读 · 0 评论 -
Docker镜像
容器解决应用开发、测试和部署的问题,而镜像解决应用部署环境问题。镜像是一个只读的容器模板, 打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件,是启动容器的基础。镜像所打包的文件内容就是容器的系统运行环境——rootfs(根文件系统或根目录)。容器与镜像类似对象与类的关系。原创 2023-01-15 17:38:28 · 1510 阅读 · 0 评论 -
docker 命令
docker 命令官方文档Reference documentation | Docker Documentationdocker events : 从服务器获取实时事件docker logs : 获取容器的日志docker history : 查看指定镜像的创建历史。docker run --rm -dit --cpu-period=50000 --cpu-quota=25000 ubuntu /bin/bashdocker run --rm -dit --cpu-rt-period=50000 --cp原创 2022-12-03 22:26:45 · 1064 阅读 · 0 评论 -
Docker介绍
根据官方的定义,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。 引用网图:docker是容器化技术,针对的是应用及应用所依赖的环境做容器化。遵循单一原则,一个容器只运行一 个主进程。多个进程都部署在一个容器中,弊端很多。比如更新某个进程的镜像时,其他进程也会被迫 重启,如果一个进程出问题导致容器挂了,所有进程都将无法访问。再根据官网的提倡的原则而言,容器 = 应用 + 依赖的执行环境而不是像虚拟机一样,把原创 2022-12-03 19:35:47 · 1917 阅读 · 0 评论 -
Docker环境搭建
1. 安装sudo apt install docker.io2. 卸载1. 官方文档:https://docs.docker.com/engine/install/ubuntu/2. 有三种安装方式:1. 基于官方存储库安装;2. 下载软件包安装;3. 基于官方给出的快捷脚本安装。1. 更新 apt 包索引,并且安装一些软件使得apt可以通过HTTPS协议访问软件库。2. 添加docker官方的GPG 秘钥3. 设置一个标准的docker软件仓库。4. 更新apt 包索引并查看docke原创 2022-12-03 17:29:58 · 341 阅读 · 0 评论 -
GRPC远程调用
RPC 即远程过程调用协议(Remote Procedure Call Protocol),可以让我们像调用本地对象一样发起远程调用。RPC 凭借其强大的治理功能,成为解决分布式系统通信问题的一大利器。gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2+PB 保证了的高性能。原创 2022-11-30 16:51:42 · 2064 阅读 · 0 评论 -
Protobuf3语法笔记
先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果 所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了}文件的第一行指定了你正在使用proto3语法:如果你没有指定这个,编译器会使用proto2。这个指定语法行必须是文件的非空非注释的第一个行。SearchRequest消息格式有3个字段,在消息中承载的数据分别对应于每一个字段。其中每个字段都有一个名字和一种类型。原创 2022-11-29 21:00:46 · 471 阅读 · 0 评论 -
Protobuf应用层协议设计
什么协议:协议是⼀种约定,通过约定,不同的进程可以对⼀段数据产⽣相同的理解,从⽽可以相互协作,存在进程间通信的程序就⼀定需要协议。为什么说进程间通信就需要协议?⽽不是说客户端和服务器端之前?为什么需要⾃⼰设计协议?⽐如不同表的插头,还需要进⾏各种转换,如果我们两端进⾏通信没有约定好协议,那彼此是不知道对⽅发送的数据是什么意义。原创 2022-11-29 19:48:00 · 1306 阅读 · 0 评论 -
KafKa存储机制
Kafka 是为了解决大数据的实时日志流而生的, 每天要处理的日志量级在千亿规模。1. 数据实时产生2. 海量数据存储与处理所以它必然要面临分布式系统遇到的高并发、高可用、高性能等三高问题。对于 Kafka 的存储需要保证以下几点:1. 存储的主要是消息流(可以是简单的文本格式也可以是其他格式,对于 Broker 存储来说,它并不关心数据本身)2. 要支持海量数据的高效存储、高持久化(保证重启后数据不丢失)3. 要支持海量数据的高效检索(消费的时候可以通过offset或者时间戳高效查询并处理)原创 2022-11-28 20:37:31 · 4069 阅读 · 0 评论 -
KafKa C++实战
1. Kafka架构是由producer(消息生产者)、consumer(消息消费者)、borker(kafka集群的 server,负责处理消息读、写请求,存储消息,在kafka cluster这一层这里,其实里面是有很多个 broker)、topic(消息队列/分类相当于队列,里面有生产者和消费者模型)、zookeeper 这些部分 组成。原创 2022-11-28 10:47:57 · 5781 阅读 · 0 评论 -
GRPC C++开发环境搭建
必须在 grpc 执行 git submodule update --init 命令之后生成的。如果cmake低于3.15, gcc/g++ 低于 7.0 ,请根据文档进行安装。查看此时grpc目录内容的大小du -h --max-depth=1, 可以看到。升级gcc和gdb的版本,至少需要6.3以上的版本。,下载完后会发现整个grpc目录内容明显变大=注: 文件路径是可以指定的, 一般选择在。里面编译安装对应的 protobuf。编译helloworld。再次查看 目录大小,原创 2022-11-27 09:37:08 · 804 阅读 · 0 评论 -
死锁检测组件
死锁,是指多个线程或者进程在运行过程中因争夺资源而造成的一种僵局,当进程或者线程处于这种僵持状态,若无外力作用,它们将无法再向前推进。如下图所示,线程 A 想获取线程 B 的锁,线程 B 想获取线程 C 的锁,线程 C 想获取线程 D 的锁,线程 D 想获取线程 A 的 锁,从而构建了一个资源获取环。死锁的存在是因为有资源获取环的存在,所以只要能检测出资源获取环,就等同于检测出 死锁的存在。原创 2022-11-26 22:47:24 · 140 阅读 · 0 评论 -
无锁CAS_无所队列
⽐较并交换(compare and swap, CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据 交换操作,从⽽避免多线程同时改写某⼀数据时由于执⾏顺序不确定性以及中断的不可预知性产⽣的数据 不⼀致问题。该操作通过将内存中的值与指定数据进⾏⽐较,当数值⼀样时将内存中的数据替换为新的 值。上⾯的CAS返回bool告知原⼦性交换是否成功。原创 2021-10-09 21:51:03 · 774 阅读 · 0 评论 -
进程控制笔记
每一个进程都有一个非负整数的唯一进程ID。虽然是唯一的,但是进程ID是可复用的。当一个进程终止后,其进程ID就成为复用的候选者。大多数UNIX系统实现延迟复用算法,使得赋予新建进程的ID不同于最近终止进程所使用的ID。这防止了将新进程误认为是使用同一ID的某个已经终止的先前进程。 ID=0的进程为调度进程,常常被称为交换进程(swapper)。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。进程ID=1的通常是init进程,在自举过程结束时由内核调用。此进程负责在自举内核...原创 2021-10-16 10:09:32 · 261 阅读 · 0 评论 -
kafka使用场景与设计原理
Kafka 本质上是一个 MQ(Message Queue),使用消息队列的好处?解耦:允许我们独立的扩展或修改队列两边的处理过程。可恢复性:即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。缓冲:有助于解决生产消息和消费消息的处理速度不一致的情况。灵活性&峰值处理能力:不会因为突发的超负荷的请求而完全崩溃,消息队列能够使关键组件顶住突发的访问压力。异步通信:消息队列允许用户把消息放入队列但不立即处理它。原创 2022-11-27 15:57:04 · 900 阅读 · 0 评论 -
kafka开发环境搭建
登陆网址https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载完成后,Linux默认下载位置在当前目录下的Download或下载文件夹下,通过命令cd ~/Downloads或cd ~/下载即可查看到对应的文件。原创 2022-11-22 18:27:08 · 1218 阅读 · 0 评论 -
Nginx入门笔记
代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过 HTTP 以外的协议将请求传递给应用服务器。压缩响应通常会显着减少传输数据的大小。然而,由于压缩在运行时发生,它还可以增加 相当大的处理开销,这会对性能产生负面影响 在向客户端发送响应之前,NGINX 会执行压 缩,但不会“压缩”已压缩的响应(例如,由代理的服务器)。当启用缓存时,NGINX 将响应保存在磁盘缓存中,并使用它们来响应客户端,而不必每次都为同一内容代理请求。原创 2022-11-19 22:01:52 · 1862 阅读 · 0 评论 -
用户态协议栈之协议栈设计
用户态协议栈原创 2021-10-21 23:10:08 · 497 阅读 · 0 评论 -
mysql连接池和redis连接池
定义:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成 一个连接池,由程序动态地对池中的连接进行申请,使用,释放。大白话:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的 时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度, 还更加安全可靠。这里讲的数据库,不单只是指Mysql,也同样适用于Redis。原创 2022-11-06 21:23:58 · 710 阅读 · 0 评论 -
Redis主从同步与对象模型
为什么会涉及到这个问题?因为redis是一个内存数据库,如果此时redis是数据量已经达到了最大值,这时候我们再发送一个写命令去操作redis,此时如何定义我们的行为。这时候就涉及到淘汰策略的问题。原创 2022-10-31 21:15:21 · 151 阅读 · 0 评论 -
Redis源码分析-存储原理与数据模型
redis源码学习redis是单线程,分治 , 内存wsl2安装安装 WSL | Microsoft Docsvscode开始通过 WSL 使用 VS Code | Microsoft Docsc/c++基本配置Get Started with C++ and Windows Subsystem for Linux in Visual Studio Code建议学习方法1. 首先定一个小的主题,预期要得到的效果;2. 准备测试数据以及调试环境;3. 查看流程,把.原创 2022-10-28 15:44:23 · 764 阅读 · 0 评论 -
Redis协议与异步方式
redis网络层eactor并发处理连接,线程串行处理命令;单reactor,一个线程同时处理命令+网路IO (mysql则是一个连接一个线程处理)redis pipeline redis pipeline 是一个客户端提供的,而不是服务端提供的;pipeline就是多个请求依次发送出去,然后依次接收回包对于request操作,只是将数据写到fd对应的写缓冲区,时间非常快,真正耗时操作在读取 response;send这是将数据写到写缓冲区,真正的发送...原创 2021-12-05 14:58:56 · 1464 阅读 · 0 评论 -
Redis相关命令以及持久化
RedisRedis 是Remote Dictionary Service 的简称;也是远程字典服务;Redis 是内存数据库,KV数据库,数据结构数据库;Redis 应用非常广泛,如Twitter、暴雪娱乐、Github、Stack Overflow、腾讯、阿里巴巴、京东、华为、新浪微博等,很多中小型公司也在使用;Redis命令查看:http://redis.cn/commands.html应用记录朋友圈点赞数、评论数和点击数(hash)记录朋友圈说说列表(排序),便于快速显示原创 2021-12-03 22:52:46 · 309 阅读 · 0 评论 -
协程学习笔记
ntyco协程学习原创 2022-10-15 20:43:10 · 214 阅读 · 0 评论 -
锁与原子操作CAS的底层实现
线程1:线程就是程序的执行路线,即进程内部的控制序列,或者说是进程的子任务。2:一个进程可以同时拥有多个线程,即同时被系统调度的多条执行路线,但至少要有一个主线程。3: 一个进程的所有线程都共享进程的代码区、数据段、BSS段、堆、命令行参数和环境变量,唯有栈区是一个线程一个。4:一个进程的所有线程共享系统内核中与进程有关的部分资源,如文件描述符表、信号处理函数、工作目录、各种ID等。5:一个进程的每个线程都有一个独立的ID(线程ID)、独立的寄存器上下文、独立的调度策略和优先级、独立的原创 2021-10-08 21:32:25 · 321 阅读 · 0 评论 -
C++11 function、bind、可变参数模板
在设计回调函数的时候,无可避免地会接触到可回调对象。在C++11中,提供了std::function和 std::bind两个方法来对可回调对象进行统一和封装。C++语言中有几种可调用对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用 运算符的类。和其他对象一样,可调用对象也有类型。例如,每个lambda有它自己唯一的(未命名)类类型;函数及函数指针的类型则由其返回值类型和实参类型决定。原创 2022-09-15 09:25:41 · 1855 阅读 · 0 评论 -
C++11 条件变量
互斥量是多线程间同时访问某一共享变量时,保证变量可被安全访问的手段。但单靠互斥量无法实现线 程的同步。线程同步是指线程间需要按照预定的先后次序顺序进行的行为。C++11对这种行为也提供了 有力的支持,这就是条件变量。条件变量位于头文件condition_variable下。条件变量使用过程:1. 拥有条件变量的线程获取互斥量;2. 循环检查某个条件,如果条件不满足则阻塞直到条件满足;如果条件满足则向下执行;原创 2022-09-14 16:48:59 · 1902 阅读 · 0 评论 -
线程池笔记
问题1:多个线程同时在一个任务队列里面取任务 任务队列就相当于这多个线程的临界资源,取任务的时候需要对任务队列进行加锁。问题2:当任务不足的时候,线程的状态(如何休息) 条件变量(挂起) ---->进入条件等待,等待任务队列不为空的条件满足,然后唤醒线程。网络数据处理的阶段1. 检测IO里面是否有数据(是否可读是否可写) IO事件是否就绪 EPOLL2. 对IO进行读写操作。 ...原创 2021-10-02 23:58:46 · 174 阅读 · 0 评论 -
UDP的可靠传输
◼ ACK机制 (用来确认对方到底有没有收到)◼ 重传机制 (在协议栈不会重传)◼ 序号机制 3 2 1 -》2 3 1 (先发的包不一定最先到达)◼ 重排机制 2 3 1 ->3 2 1 (将收到的包进行重组)◼ 窗口机制Tcp不用我们管可靠性udp 5种机制都需要用户层处理udp场景1)实时性要求: 音视频的通话 、 游戏(王者荣耀) 。2)节省资源的要求: 嵌入式设备(电池供电) , 手机状态报告 、户外设备UDP与TCP,我们如...原创 2021-09-29 12:45:40 · 2380 阅读 · 0 评论 -
redis,memcached,nginx网路组件
⽹络编程关注的问题连接建⽴ 连接断开 消息到达 消息发送完毕readbuffer里面有数据就read出去 , writebuffer里面没有数据就write进去。⽹络编程流程阻塞io模型和⾮阻塞io模型阻塞在哪⾥? 阻塞在⽹络线程什么来决定阻塞还是⾮阻塞?连接的fdfcntl(c->fd, F_SETFL, O_NONBLOCK);io函数 read,wrirte ,recv , send具体的差异?io函数在数据未到达时是否⽴刻返回...原创 2021-09-28 17:11:46 · 195 阅读 · 0 评论 -
IO_uring
iouring转载 2022-09-06 22:07:48 · 375 阅读 · 0 评论