![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux server
文章平均质量分 87
congchp
这个作者很懒,什么都没留下…
展开
-
反碎片技术
内存碎片分为内部碎片和外部碎片:内部碎片指内存页里面的碎片;外部碎片指空闲的内存也是分散的,很难找到一组物理页连续的空闲内存页,无法满足超过一页的内存分配请求;内核有时需要分配超过一页的物理内存,因为内核使用线性映射区的虚拟地址,需要分配连续的物理页;使用巨型页,也需要分配连续的物理页;为可决外部碎片问题,内核引入反碎片技术:1)虚拟可移动区域;2)内存碎片整理;虚拟可移动区域是预防外部碎片的技术;内存碎片整理是在出现外部碎片以后消除外部碎片的技术;原创 2024-04-26 10:37:32 · 417 阅读 · 0 评论 -
tidb数据同步及事务原理
本文主要介绍了以下内容:1. tidb如何进行数据同步;2. raft分布式一致性算法;3. tidb分布式事务的实现;原创 2022-04-01 10:28:07 · 2390 阅读 · 0 评论 -
tidb存储基本原理
本文主要介绍以下内容:1. tidb是什么;2. tidb解决了什么问题;3. tidb的整体架构原创 2022-04-01 10:24:11 · 2787 阅读 · 0 评论 -
mongodb原理与实现
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习为什么使用mongodb?关系型数据存在以下问题:大数据处理能力差;水平扩展能力差;分库分表复杂;应用程序开发效率低;表结构变动困难;比如要增加字段,就需要改变表结构。Mongodb是一个Nosql数据库,可以很好地解决上面的问题;m原创 2022-03-30 13:35:20 · 1820 阅读 · 0 评论 -
rocksdb的特性与应用
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习列族(column family)列族相当于mysql中的table;多个列族共享一个WAL文件,但有独立的memtable和sst文件;WAL是预写日志,对rocksdb的写操作,都是记录WAL,之后才会写磁盘,当数据写入磁盘后,才会删除WAL中对原创 2022-03-27 10:34:28 · 2118 阅读 · 0 评论 -
rocksdb原理与实现
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习rocksdb是什么?rocksdb是facebook的项目,目的是开发一套能在服务器压力下,真正发挥高速存储硬件性能的高效数据库系统;使用C++实现;是嵌入式数据库kv数据库;不提供网络服务,只提供数据持久化的方案。rocksdb是基于leve原创 2022-03-27 10:29:00 · 3435 阅读 · 1 评论 -
Nginx反向代理与conf原理
Nginx主要功能Webservice, 反向代理, 负载均衡。逻辑上,nginx和server的关系是这样的:Nginx和路由器/交换机有什么区别?路由器是物理网关,nginx是应用层网关。物理上,他们的关系是下图这样的。Nginx、haproxy、lvs、F5,都可以做负载均衡,有什么区别?他们处于tcp/ip协议不同层。Nginx安装所需要的安装包nginx、openssl、pcre、zlib安装命令./configure --prefix=/usr/local/ngin原创 2022-03-15 17:17:19 · 5189 阅读 · 1 评论 -
nginx-fastdfs-mod,fastcgi,文件上传和下载原理
fastcgicgi什么是cgi?通用网关接口(Common Gateway Interface、CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。cgi处理流程web服务器收到客户端(浏览器)的请求Http Request,启动CGI程序,并通过环境变量、标准输入传递数据;对于每个http request,都要fork出来一个cgi程序进行处理,这是cgi性能低的主要原因;cgi进程启动解析器、加载配置(如业务相原创 2022-03-15 17:15:02 · 1382 阅读 · 0 评论 -
FastDFS集群部署和同步机制
如何选择tracker?当集群中有多个tracker server时,由于tracker之间是对等的关系,客户端在upload文件时可以任意选择一个tracker。如何选择storage?当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:Round robin,在group内的所有storage间轮询;First server ordered by ip,ip最小的storage;First server原创 2022-03-15 17:13:30 · 3701 阅读 · 0 评论 -
fastdfs存储原理
本文主要介绍fastdfs客户端的上传下载原理以及以及服务端的网络io模型;主要介绍storage,不涉及tracker;storage和tracker使用的网络io模型是一样的。协议格式FastDFS采用二进制TCP通信协议。一个数据包由 包头(header)和包体(body)组成。client、tacker、storage之间通信的消息格式,都是这样的。包头只有10个字节,格式如下:@ pkg_len:8字节整数,body长度,不包含header,只是body的长度@ cmd:1字节整数,命令原创 2022-03-15 17:11:27 · 1975 阅读 · 0 评论 -
无锁队列的实现
为什么需要无锁队列无锁队列解决了什么问题?无锁队列解决了锁引起的问题。cache失效当CPU要访问主存的时候,这些数据首先要被copy到cache中,因为这些数据在不久的将来可能又会被处理器访问;CPU访问cache的速度要比访问内存要快的多;由于线程频繁切换,会造成cache失效,将导致应用程序性能下降。阻塞引起的CPU浪费mutex是阻塞的,在一个负载较重的应用程序中使用阻塞队列来在线程之间传递消息,会导致频繁的线程切换,大量的时间将被浪费在获取mutex,而不是处理任务上。这就需要非阻塞来原创 2022-03-15 17:08:20 · 1860 阅读 · 0 评论 -
redis计数, 布隆过滤器, hyperloglog
redis计数布隆过滤器redis扩展redis通过对外提供一套API和一些数据结构,可以供开发者开发自己的模块并加载到redis中。本质在不侵入redis源码的基础上,提供一种高效的扩展数据结构的方式。API及数据结构参考redismodule.hRedisBloomRedisBloom是redis的一个扩展,我们主要使用了它的布隆过滤器。关于布隆过滤器的原理,参考《hash,bloomfilter,分布式一致性hash》加载到redis中的方法git clone https:/原创 2022-02-28 16:51:00 · 682 阅读 · 0 评论 -
skynet设计原理
skynet是一个轻量级的游戏服务器框架;实现了actor的并发模型;可以基于skynet框架去实现业务。多核并发编程多线程在一个进程中开启多线程,为了充分利用多核,一般设置工作线程的个数为 cpu 的核心数;memcached 就是采用这种方式;多线程在一个进程当中,所以数据共享来自进程当中的内存;这里会涉及到很多临界资源的访问,所以需要考虑加锁;多进程在一台机器当中,开启多个进程充分利用多核,一般设置工作进程的个数为 cpu 的核心数;nginx 就是采用这种方式;CSP以 go 语原创 2022-02-25 13:21:50 · 482 阅读 · 0 评论 -
协程调度器实现与性能测试
主要通过以下10个方面来了解协程的原理:为什么会有协程,协程解决什么问题?协程的原语协程的切换协程的运行流程协程的结构体定义协程调度的策略协程调度器如何定义协程api的实现,hook协程的多核模式协程如何测试1-4在《协程的设计与汇编实现》中已经介绍过。本文主要介绍6-10协程结构体定义struct coroutine { struct cpu_register_set *set; // 保存CPU寄存器组 void *func; // coroutine_原创 2022-02-25 13:17:31 · 1044 阅读 · 0 评论 -
协程的设计原理与汇编实现
主要通过以下10个方面来了解协程的原理:为什么会有协程,协程解决什么问题?协程的原语协程的切换协程的运行流程协程的结构体定义协程调度的策略协程调度器如何定义协程api的实现,hook协程的多核模式协程如何测试本文主要介绍1-4,6-10会在《协程调度器实现与性能测试》中介绍。为什么要有协程?协程解决了什么问题?关于协程,我们经常看到这样的话:同步的编程方式,异步的性能。那么什么是同步,什么是异步呢?同步与异步同步和异步,是形容两者之间的关系。两者在一个流程内,就是同步;两者原创 2022-02-25 11:20:50 · 892 阅读 · 0 评论 -
数据库连接池
什么是数据库连接池数据库连接池(connection pool)是程序启动时建立多个数据库连接,并将这些连接组成一个连接池,统一进行管理,由程序动态地对池中的链接进行申请,使用,释放。为什么使用连接池资源复用数据库连接得到复用,避免了频繁的创建、释放连接带来的性能开销,减少内存碎片。更快的系统相应速度数据库连接池初始化时,已经创建多个数据库连接置于池中备用。此时连接的初始化工作已经完成。对于业务请求而言,直接利用连接池中的可用连接,避免了数据库连接的创建和释放,从而缩减了系统整体响应时间原创 2022-02-11 16:50:55 · 8379 阅读 · 2 评论 -
btree实现
为什么会有btree多叉树的作用,使得节点数量变少。查找节点的数量变少。多叉树,降层高。为了寻址次数减少。rbtree如果用在内存,意义不大。多叉树和btree之间的关系多叉树没有约束平衡多叉树没有约束每个节点子树的数量btree遍历是顺序的。btree的定义一颗M阶B树T,满足以下条件每个结点至多拥有M棵子树根结点至少拥有两棵子树除了根结点以外,其余每个分支结点至少拥有M/2棵子树所有的叶子结点都在同一层上有k棵子树的分支结点则存在k-1个关键字,关键字按照递增顺序进行排原创 2022-02-11 16:47:08 · 546 阅读 · 0 评论 -
epoll实现原理
用户态协议栈,为什么要实现epoll?epoll并不是协议栈里面的,为什么要实现用户态协议栈?因为内核的epoll是对内核文件系统vfs fd进行的管理,是跟内核协议栈一起使用的,内核协议栈处理io后通过回调的方式来操作epoll中的就绪队列;而用户态协议栈,fd是用户空间的,内核的epoll没办法对用户空间fd进行管理,所以用户态协议栈必须要有用户态的epoll。用户态epoll是参考内核的epoll,在用户空间实现了epoll的功能。内核epoll代码:fs/eventpoll.cepoll设原创 2022-02-11 16:36:35 · 2719 阅读 · 3 评论 -
tcp协议栈实现,tcp定时器与滑动窗口
要实现用户态协议栈,必须要搞懂TCP,TCP 11个状态、滑动窗口、拥塞控制、定时器等等。要使用用户态协议栈,内核提供的epoll就不起作用了,我们需要自己实现用户态的epoll。epoll内部涉及到一个回调的时机,回调的作用是将红黑树中的节点添加进就绪队列,具体在epoll原理里面会具体讲解。搞清楚TCP的11个状态,我们就明白应该在什么时机进行回调了。TCP状态转换图在前面的[posix与网络协议栈](https://github.com/congchp/Linux-server/blob/mai原创 2022-02-11 16:31:14 · 882 阅读 · 0 评论 -
用户态协议栈的实现
协议栈协议栈,指的是TCP/IP协议栈。linux系统中,协议栈是内核实现的。协议,是通信双方对包格式的一种约定。为什么是栈呢?因为对于包的组织,类似于栈的数据结构。发送端组织包的顺序是应用层->传输层->网络层->数据链路层,之后通过网卡将数字信号转换成光电信号,发送给接收端;接收端的网卡将光电信号转换成数字信号,解包的顺序是数据链路层->网络层->传输层->应用层。如何拿到最原始的数据?raw socket,socket的第二个参数,可以设置SOCK_S原创 2022-02-11 16:25:15 · 1556 阅读 · 2 评论 -
posix api和网络协议栈
网络编程相关的posix api包括那些?posix api, Portable operating system interfacesocket插 座,由两部分组成fd, tcb(tcp control block)调用socket()后,得到一个fd和tcb,tcb的状态是close的。fd是我们操作的;tcb是协议栈的,和tcp连接的生命周期是一致的。进程第一次创建fd的时候,值为3,因为0-2是标准输入输出。[root@4af22fda6f4b webserver]# l原创 2022-02-11 16:21:25 · 600 阅读 · 0 评论 -
hash,bloomfilter,分布式一致性hash
场景使用word 文档时,判断某个单词是否拼写正确垃圾邮件过滤算法Redis缓存穿透bitcoin core中交易校验需求从海量数据中查询某个字符串是否存在?平衡二叉搜索树增删改查时间复杂度是O(log2nlog_2nlog2n)。平衡的目的是保证操作的时间复杂度稳定,保证下次搜索能够稳定排除一半的数据。O(log2nlog_2nlog2n)的直观理解:100万个节点,最多比较20次;10亿个节点,最多比较30次。总结:通过比较保证有序,使用二分查找,通过每次排原创 2022-02-11 16:07:18 · 1206 阅读 · 0 评论 -
websocket服务器实现
websocket是什么,用在哪里?websocket与http都属于tcp/ip协议簇中的应用层协议,基于tcp协议,主要用于浏览器和服务器通信。websocket与httphttp是request-reply模式,只能由client先发数据;而websocket中,server可以主动发送数据给client。http也是可以做长连接的, 只是一般不这么用;websocket一般用作长连接。对于传输数据不大的情况下,http包头所占字节比较多,消息利用率不高,需要自定义协议。自定义协议由两部分原创 2022-02-11 14:57:37 · 3328 阅读 · 0 评论 -
reactor实现http服务器
如何在reactor的基础上实现业务?就是怎么利用reactor做服务器,并实现服务器的业务。本文基于reactor,实现简单的http协议封装。只是为了说明reactor如何做业务,真正的http服务器业务逻辑是很复杂的。服务器网络这一层,如nginx、redis,核心是epoll,实现使用的是reactor。http协议封装与reactor的关系reactor包含内容reactor_run,event loop,通过epoll进行io检测;accept_cb,处理网络连接;re原创 2022-02-11 14:48:01 · 822 阅读 · 0 评论 -
reactor百万连接的并发
epoll水平触发/边沿触发LT,recvbuff中有数据就一直触发;ET,recvbuff中收到数据,只触发一次。如果recvbuff中数据没有读完,不会再次触发,当recvbuff中收到新的数据时,再次触发。也就是收到一个包,只触发一次。比如客户端发送32byte的包,服务器只recv了10byte的数据,那么epoll不会再次触发,等到下一次客户端再发送32byte的数据,epoll会再一次触发。对于ET,对于recv,最好是一个循环的读,直到读完,返回-1。所以LT适合用于大包,数据没读完会一原创 2022-02-11 14:37:34 · 1521 阅读 · 0 评论 -
redis io多线程
redis io多线程redis单线程是指logic在单线程中执行。redis io多线程指read、decode、encode、write在io线程池中处理。开启多线程的时候,同一个连接的命令还是按顺序处理的吗?对于多线程,每一个线程都有一个任务队列,redis做了负载均衡,把任务平均分配到每一个线程对应的队列,这里并没有考虑任务是否是同一个连接来的;对于reactor,使用的是request-reply的模式,read后,会将epoll的状态设置为writable,write后,再将状态设.原创 2022-01-29 10:29:43 · 1690 阅读 · 0 评论 -
redis存储结构与数据模型
存储结构redis对外主要提供5种数据类型,string、list、set、zset、hash。对于这些数据类型,最终主要由下图数据结构进行存储。存储转换redis是一个内存数据库,非常注意内存的使用。对于每种数据类型,在不同的条件下,redis使用不同的数据结构进行存储。redis有如下encoding方式,可以通过object encoding key命令查看实际编码方式。/* Objects encoding. Some kind of objects like Strings and.原创 2022-01-29 10:25:27 · 2494 阅读 · 0 评论 -
CPU亲缘性
CPU亲缘性,affinity使用进程或者线程都是可以的。CPU粘合的作用,更大程度的利用CPU的性能。如果开4个进程去处理网络io,进行CPU粘合后,进程只在绑定的CPU上调度,每个CPU都有一个调度队列,进程只会出现在绑定的CPU的调度队列中,不会切换到其他CPU中调度,一定意义上节省了CPU进程切换的代价。// 进程粘合#include <stdio.h>#define __USE_GNU#include <sched.h>#include <sys.原创 2022-01-26 14:29:59 · 1085 阅读 · 0 评论 -
redis持久化与主从复制
持久化redis 的数据全部在内存中,如果突然宕机,数据就会全部丢失,因此需要持久化来保证 redis 的数据不会因为故障而丢失,redis 重启的时候可以重新加载持久化文件来恢复数据。redis持久化有以下4种方式:aofrdbaof rewriteaof-rdb混用从以下方面了解redis持久化:aof与rdb比较aof rewrite解决了aof什么问题?aof-rdb混用解决aof-rdb什么问题?该如何进行持久化方法的选择redis持原创 2022-01-26 13:44:42 · 325 阅读 · 0 评论 -
异步请求实现
什么是异步请求redis/mysql提供的客户端,hiredis/mysqlclient都是同步的。request发出后,就在等着response。mysql_query(sql), 一个请求发出后,当前线程挂起等待,当mysql server返回结果后,函数才返回。这就是一个同步的请求过程。异步请求,就是请求发出后,不需要等待结果,函数直接返回,当server返回结果后,调用回调函数进行处理。如何做一个异步请求?发送请求,是一个连接还是多个连接?指的是一个请求没有返回,再发起一个请求,是.原创 2022-01-21 16:34:19 · 1923 阅读 · 0 评论 -
定时器原理与实现
定时器概述对于服务端来说,驱动服务端逻辑的事件主要有两个,⼀个是⽹络事件,另⼀个是时间事件;在不同框架中,这两种事件有不同的实现⽅式;第⼀种,⽹络事件和时间事件在⼀个线程当中配合使⽤, 将定时器中最近的时间,设置为epoll_wait的timeout参数;例如nginx、redis;第⼆种,⽹络事件和时间事件在不同线程当中处理;例如linux crontab, skynet;// 第⼀种while (!quit) { int now = get_now_time();// 单位:ms.原创 2022-01-21 16:24:00 · 1249 阅读 · 0 评论 -
redis事务与异步请求
redis的网络层为什么mysql每一条连接对应一个线程?mysql有网络io,磁盘io,涉及的操作比较多,需要有一个单独的线程来处理。使用单线程或者线程池都不太合适。redis使用的是单reactor网络模型,因为redis都是网络io,单reactor可以满足。redis pipelineredis pipeline 是由客户端提供的,而不是服务端提供的,是将多条命令一起发送到redis。redis是单线程的,所以会顺序执行pipeline中的命令,但是pipeline不具备事务性,所以并.原创 2022-01-21 16:07:52 · 734 阅读 · 0 评论 -
mysql缓存方案
数据库提升性能的方式数据库连接池。使用的是阻塞io,连接池一般结合线程池一起使用。异步请求。使用异步io,需要自己实现mysql的协议。从sql执行处罚,使用sql预编译执行的方式,prepare,跳过词法句法分析、权限验证、优化器等步骤,提高执行效率。读写分离。对于一致性要求不是特别高的场景,也就是最终一致性,并且读多写少的场景,可以使用主数据库写,从数据库读的方式。数据库主从方式可以解决数据库单点故障的问题。使用数据库主从方式,如果一致性要求高:使用主从半同步复制;读去主数据库读原创 2022-01-21 10:13:36 · 1850 阅读 · 0 评论 -
Mysql事务原理
事物目的事务将数据库从一种一致性状态转换为另一种一致性状态;组成事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成;Innodb支持事务,Myisam是不支持事务的。这个是Myisam和Innodb一个主要的区别。对于一条SQL语句,Innodb默认是加上事务的。Myisam为什么不支持事务?因为Myisam不支持行锁,只支持表锁。Myisam为什么不支持表锁呢?因为Myisam B+树叶子结点存储索引+数据在磁盘中的位置,同时有多个B+树,但是并原创 2022-01-14 16:09:02 · 1447 阅读 · 0 评论 -
Mysql索引原理及sql优化
索引索引分类:主键索引、唯一索引、普通索引、组合索引、全文索引主键索引非空唯一索引,一个表只有一个主键索引;在 innodb 中,主键索引的 B+ 树包含表数据信息;PRIMARY KEY(key)唯一索引不可以出现相同的值,可以有NULL值;UNIQUE(key)普通索引允许出现相同的索引内容;INDEX(key)-- ORKEY(key[,...])组合索引对表中的多个列进行索引INDEX idx(key1,key2[,...]);U原创 2022-01-11 14:36:56 · 344 阅读 · 0 评论 -
应用层协议设计protobuf
为什么需要协议设计?什么是协议?协议就是双方的一种约定,通过约定,通信的双方可以对一段数据有相同的理解,从而可以相互协作。我们自定义的协议,一般是在TCP/IP模型的应用层。什么是序列化?序列化: 将数据结构或对象转换成二进制串的过程 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程为什么不能直接使用结构体进行通信呢?主要因为结构体无法跨平台、跨语言。协议中会使用序列化和反序列化。消息帧的完整性判断为了让对端知道如何给包分界,一般有以下做法:以特定符原创 2022-01-10 14:57:15 · 826 阅读 · 0 评论 -
log4cpp日志方案
read/write与fread/fwriteread/write:linux底层操作; 内核调用,将数据copy到内核,涉及到进程上线文的切换,即用户态到内核态的转换,这是个比较耗性能的操作。fread/fwrite:C语言标准规定的io流操作,建立在write之上 在用户层,增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝。两者之间的关系,见下图:对于输入设备,调用fsync/fflush将清空相应的缓冲区,其内数据将被丢弃;对于输出设备或磁盘文件,ffl原创 2022-01-06 16:17:32 · 830 阅读 · 0 评论 -
手动实现try-catch组件
线程私有空间线程内部的全局变量比如一个线程一个reactor,reactor可以作为线程内部的全局变量。下面代码中,在主线程中定义了一个pthread_key_t key, 传入到子线程,对于这个key,在用pthread_key_create创建后,对于同样的key,每个线程都会有自己的私有空间。每个线程可以设置不同的值。#include <stdio.h>#include <string.h>#include <pthread.h>#defi原创 2021-12-29 13:16:19 · 748 阅读 · 0 评论 -
锁和原子操作的实现
操作的原子性10个线程同时对count变量进行++,每个线程进行10万次++,理想情况的结果是100万,但最后的结果却是小于100万的。#include <stdio.h>#include <unistd.h>#include <pthread.h>#define THREAD_COUNT 10void *func(void *arg) { volatile int *pcount = (int *)arg; int i = 0原创 2021-12-29 13:06:59 · 832 阅读 · 0 评论 -
手写死锁检测组件
死锁发生的原因当一个进程/线程在等待永远不可能获取到的资源时,就会产生死锁。死锁产生的四个必要条件:资源互斥 每个进程占有资源并等待其他资源系统不能剥夺进程资源 进程资源图是一个环路如下图所示,线程A占有资源1,线程B占有资源2,线程C占有资源3。如果线程A要申请资源2,线程B要申请资源3,线程C要申请资源1,进程之间就形成了一个资源依赖的环路,就会发生死锁。#include <pthread.h>#include <unistd.h>..原创 2021-12-29 11:14:12 · 376 阅读 · 0 评论