自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zerok的专栏

人生不是自我放逐,而是力求完美。

  • 博客(40)
  • 资源 (2)
  • 收藏
  • 关注

原创 用 C 写一个卷积神经网络

用 C 语言从 0 写一个卷积神经网络

2023-12-06 14:28:55 2528 1

原创 webRTC是怎么应对网络变化的

在视频通信的技术领域WebRTC已成为主流的技术标准,WebRTC包涵了诸多优秀的技术,譬如:音频数字信号处理技术(AEC, NS, AGC)、编解码技术、实时传输技术、P2P技术等,这些技术目的都是为了实现更好实时音视频方案。但是在高分辨率视频通信过程中,通信时延、图像质量下降和丢包卡顿是经常发生的事,甚至在WiFi环境下,一次视频重发的网络风暴可以引起WiFi网络间歇性中断,通信延迟和图像质量...

2018-05-25 11:46:02 8044 8

原创 P2P技术是如何将直播带宽降低75%的

实时直播经过去年的千播大战后已经成为互联网应用的标配技术,但直播平台的成本却一直居高不下,各个平台除了挖主播、挖网红以外,其背后高额的带宽费用也是他们最大的一块成本。现阶段直播技术在传输方面分为两块:CDN和连麦系统,CDN负责流媒体的分发传输,连麦系统负责解决同时多个主播间互动的实时通信传输问题。我们始终认为基于CDN+连麦系统的直播技术是一个高成本高消耗的技术,从各大直播平台纷纷亏损就验证了这

2018-01-04 18:14:52 15801 8

原创 如何实现1080P延迟低于500ms的实时超清直播传输技术

本文是去年我发布在高可用架构公众号的文章,在此做一次转载。本来打算将WiredTiger系列的技术继续分享出来的,由于这段时间都在忙关于超清视频实时传输的事情,只能把WiredTiger的分享文章延后了,在这里先把这半年做的事情分享出来。最近由于公司业务关系,需要一个在公网上能实时互动超清视频的架构和技术方案。众所周知,视频直播用CDN + RTMP就可以满足绝大部分视频直播业务,我们也接

2017-11-20 17:34:09 4745 4

原创 WiredTiger实现:一个LRU cache深坑引发的分析

从mongoDB 3.0版本引入WiredTiger存储引擎(以下称为WT)以来,一直有同学反应在高速写入数据时WT引擎会间歇性写挂起,有时候写延迟达到了几十秒,这确实是个严重的问题。引起这类问题的关键在于WT的LRU cache的设计模型,WT在设计LRU cache时采用分段扫描标记和hazardpointer的淘汰机制,在WT内部称这种机制叫eviction cache或者WT cache,

2017-11-14 09:49:36 2586 1

原创 RUDP传输那些事儿

最近和很多实时音视频领域的朋友交流中都有谈论到RUDP(Reliable UDP),这其实是个老生常谈的问题,RUDP在很多著名的项目上都有使用,例如google的QUIC和webRTC。

2017-11-06 09:43:48 5206 2

原创 解析MongoDB存储引擎WiredTiger:事务实现

WiredTiger从被MongoDB收购到成为MongoDB的默认存储引擎的一年半得到了迅猛的发展,也逐步被外部熟知。WiredTiger(以下简称WT)是一个优秀的单机数据库存储引擎,它拥有诸多的特性,既支持BTree索引,也支持LSM Tree索引,支持行存储和列存储,实现ACID级别事务、支持大到4G的记录等。WT的产生不是因为这些特性,而是和计算机发展的现状息息相关。现代计算机近20

2017-10-25 11:26:31 4636 5

原创 聊天系统中的用户列表并发问题分析

1.问题描述上周末一个做视频直播的朋友向我咨询他们遇到的一个关于大量内存对象并发的问题,具体问题描述是这样的,在游戏视频直播的时候,需要向观看直播的人提供一个可以自由聊天的功能(相当于QQ群),这就要涉及到在服务器端实现一个管理用户列表的功能,这个用户列表可能很大(最大可以容纳300万人观看和聊天)。他们的做法是在后端服务分为两层,如图:图-1gate用来做客户端连接和

2015-06-10 16:54:25 2300 2

原创 MySQL系列:innodb源码分析之redo log恢复

在上一篇《innodb源码分析之重做日志结构》中我们知道redo log的基本结构和日志写入步骤,那么redo log是怎么进行数据恢复的呢?在什么时候进行redo log的日志推演呢?redo log的推演只有在数据库异常或者关闭后,数据库重新启动时会进行日志推演,将数据库状态恢复到关闭前的状态。那么这个过程是怎么进行的呢?以下我们逐步来解析。1.recv_sys_t结构 innod

2015-01-12 19:59:07 7111 3

原创 MySQL系列:innodb源码分析之重做日志结构

在innodb的引擎实现中,为了实现事务的持久性,构建了重做日志系统。重做日志由两部分组成:内存日志缓冲区(redo log buffer)和重做日志文件。这样设计的目的显而易见,日志缓冲区是为了加快写日志的速度,而重做日志文件为日志数据提供持久化的作用。在innodb的重做日志系统中,为了更好实现日志的易恢复性、安全性和持久化性,引入了以下几个概念:LSN、log block、日志文件组、che

2015-01-07 13:15:40 7735

原创 MySQL系列:innodb源码分析之page结构解析

在表空间结构分析当中,我们知道innodb的最小物理存储分配单位是page页,在MySQL-3.23版本的源码中,页只有两种页,一种是index page,一种是undo page。其类型值定义在fil0fil.h当中。                FIL_PAGE_INDEX                         数据索引页,在表空间的inode page和xdes page都是

2014-12-28 20:15:08 11738 4

原创 MySQL系列:innodb源码分析之表空间管理

innodb在实现表空间(table space)基于文件IO之上构建的一层逻辑存储空间管理,table space采用逻辑分层的结构:space、segment inode、extent和page.在实现层的逻辑使用了磁盘链表这种结构来管理逻辑关系。我们先来介绍磁盘链表。1.磁盘链表磁盘链表的实现fut0lst.*文件当中, innodb为了管理表空间和索引模块,定义了一个基于磁盘的链表

2014-12-14 15:55:18 9602 2

原创 MySQL系列:innodb源码分析之mini transaction

日志是innodb一个非常重要的模块,在innodb中有两类日志:redo log和undo log。其中redo log日志是用来做数据异常恢复和数据库重启时页数据同步恢复的,redo log是建立在在mini transaction基础上。数据库在执行事务时,通过mini transaction产生

2014-12-03 17:02:11 8132 2

原创 MySQL系列:innodb源码分析之文件IO

innodb作为数据库引擎,自然少不了对文件的操作,在innodb中所有需要持久化的信息都需要文件操作,例如:表文件、重做日志文件、事务日志文件、备份归档文件等。innodb对文件IO操作可以是煞费苦心,其主要包括两方面,一个是对异步io的实现,一个是对文件操作管理和io调度的实现。在MySQL-5.6版本的innodb还加入了DIRECT IO实现。做了这么多无非是优化io操作的性能。在inno

2014-11-23 21:50:40 6688 3

原创 MySQL系列:innodb源码分析之线程并发同步机制

innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比较高效的并发同步机制。innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进行自己的封装和实现优化,但是也兼容系统的锁。我们先看一段innodb内部的注释(MySQL-3.23):Semaphore operations in operating systems are s

2014-11-16 11:18:56 6504 2

原创 MySQL系列:innodb源码分析之内存管理

在innodb中实现了自己的内存池系统和内存堆分配系统,在innodb的内存管理系统中,大致分为三个部分:基础的内存块分配管理、内存伙伴分配器和内存堆分配器。innodb定义和实现内存池的主要目的是提供内存的使用率和效率,防止内存碎片和内存分配跟踪和调试。我们先来看看他们的关系和结构。以下是它的关系结构图:上图中的:ut_mem_block块是基础内存管理Buddy all

2014-11-10 20:05:05 6318 1

原创 MySQL系列:innodb源码分析之基础数据结构

近一年来一直在分析关于数据库相关的源码,前段时间分析了levelDB的实现和BeansDB的实现,这两个数据库网络上分析的文章很多,也都比较分析的比较深,所以也就没有太多必要重复劳动。最近开始关注关系数据库和MYSQL,当然主要还是数据库存储引擎,首先我还是从innodb这个最流行的开源关系数据库引擎着手来逐步分析和理解。我一般分析源码的时候都是从基础的数据结构和算法逐步往上分析,遇到不明白的地方

2014-11-09 10:29:42 7942

原创 通过Nginx访问FastDFS文件系统并进行图片文件裁剪的性能测试和分析

前段时间公司的分布式图片文件系统(FastDFS)做了图片裁剪和缩放功能,并把缩放计算和FastDFS做了解耦分离,前端用虚拟机作为图片文件缩放的访问代理层(Nginx Proxy),后端使用nginx直接访问FastDFS的文件系统。以下是测试和分析过程。1测试场景         为了测试解耦后的图片读取并发和分析系统瓶颈,我们在内网中搭建了一个测试环境。以下是测试环境的网络的物理架构

2014-10-29 10:14:37 3817

原创 夏夜

儿时的夏夜毕竟是最有夏夜的味道,屋堂的煤油灯啪嗒的跳动,忽明忽暗,真怕它脆弱的明亮突然变黑暗。屋外弯月星稀,月光优雅的撒在平静的湖面上,纯洁而又温柔。水鸟在湖岸边慵懒的伸了伸脖子,正享受着夏夜的宁静和清凉。调皮的小孩朝它扔了个石头,鸟惊飞远,湖面上泛起涟漪的月光,仿佛出尘少女的羞涩。远方不知名的笛声,清脆、古老而悠扬,一直在诉说莫名的忧伤。村中唯一的石板路上铺满了纳凉的竹板床,劳累了的人们正享受一

2014-10-23 10:23:25 1324

原创 我程序世界的“术”与“道”

17年前高考的时候,本人就立志要从事所谓的科技行业,所以在填写志愿的时候填写的是通信工程,顺便后面同意了服从志愿调剂。就因为服从调剂,我这个完全能上得了通信工程专业分数的人得到了“爱因斯坦”老先生的眷顾被调到物理专业了(在这里不得不吐槽一下高考招生的黑暗与混乱)。本着对他老先生的好心就将就成为他的徒子徒孙吧。但经过一段时间,我才发现本人对物理一点兴趣没有,他老人家肯定对我是恨铁不成钢,彻底把我抛弃

2014-09-24 21:38:54 2756 5

原创 libpaxos分析心得

前一段时间在《大型分布式存储与实践》中作者提http://到一个观点:弄清楚PAXOS协议会大大增强你对分布式系统理解的信心。后来陆陆续续看过网络上的一些PAXOS的介绍,包括PAXOS的历史、PAXOS的第一版论文(The Part-Time Parlinment)、第二版论文( Paxos Made Simple)以及chubby的论文。都没太搞懂里面的细节,后来结合wiki上对paxos

2014-08-25 17:05:32 3586

原创 C的字符串操作接口实现

最近在写一个关于用HTTP控制storm的的UI功能,已经实现完成,采用在nginx里面加入对应的模块调用来实现,模块中调用一个动态加载的SO,这个SO用THRIFT和zookeeper client实现对storm的控制和信息的存储固化。开始我使用了std::string来做字符串处理。后来发现string实在太多未知的对象构建和内存分配,加上我想把so改用纯C的实现。std::string自然

2014-08-18 13:58:20 1815

原创 用C/C++实现对STORM的运行信息查看和控制

使用C++控制STORM需要在后端应用服务器上实时获取STORM集群的运行信息和topology相关的提交和控制,经过几天对STORM UI和CMD源码的分析,得出可以通过其thrift接口调用实现这些功能。先下载一个thrift库进行编码和安装。关于thrift可以参见这个地方。安装完成后,从STORM源码中将storm.thrift拷贝到thrift目录下。

2014-07-24 17:29:05 1973

原创 supervisord监控详解

1 Supervisord的安装Supervisord是运行在python环境下的服务监控程序。所以在安装supervisord之前必须有python环境。 如果系统没有PYTHON,键入:yum install python(CENTOS)或者apt-get installpython(UBUNTU) 键入:yum install python-setuptools

2014-06-05 15:09:01 9973 2

原创 Redis的字典(dict)rehash过程源码解析

Redis的内存存储结构是个大的字典存储,也就是我们通常说的哈希表。Redis小到可以存储几万记录的CACHE,大到可以存储几千万甚至上亿的记录(看内存而定),这充分说明Redis作为缓冲的强大。Redis的核心数据结构就是字典(dict),dict在数据量不断增大的过程中,会遇到HASH(key)碰撞的问题,如果DICT不够大,碰撞的概率增大,这样单个hash 桶存储的元素会越来愈多,查询效率就

2014-04-30 13:35:37 4500

原创 关于C函数memcpy的实现细节思考

前段时间和朋友讨论关于C基础函数memcpy的实现细节时,收货颇多。这个函数在C / C++编程领域中使用率是比较高的(可能排在前10左右)。但鲜有人去研究其实现原理。为了弄清楚其实现,我给自己出了一道题目,就是用C实现一个memcpy的函数。

2014-04-15 18:03:10 8548 1

原创 丢弃RTMP协议的FLASH视频直播方案所踩过的坑

很久没有写博客了,最近一直在忙FLASH直播相关的事情,终于完成了阶段性工作。先描述下我们的FLASH方案。我们主要用FLASH在浏览器展示实时游戏直播视频,视频可以除了可以再WEB上观看,也可以在语音客户端观看和手机观看。开始我们采用基本的FLASH FMS/RTMP方式

2014-04-13 12:10:37 6678 10

原创 Google File System系列:Snapshot流程

GFS的snapshot采用的是写时复制的机制进行的,GFS快照操作几乎可以瞬间完成对一个文件或者目录树(“源”)做一个拷贝,并且几乎不会对正在进行的其它操作造成任干扰。我们的用户可以使用快照迅速的创建一个巨大的数据集的分支拷贝(而且经常是递归的拷贝拷贝),或者是在做实验性的数据操作之前,使用快照操作备份当前状态,这样之后就可以轻松的提交或者回滚到备份时的状态。闲话少说,以下是我个人理解的流程序列

2014-04-03 18:01:11 2423

原创 Merkle Tree算法详解

Merkle Tree是Dynamo中用来同步数据一致性的算法,Merkle Tree是基于数据HASH构建的一个树。它具有以下几个特点:1、数据结构是一个树,可以是二叉树,也可以是多叉树(本BLOG以二叉树来分析)2、Merkle Tree的叶子节点的value是数据集合的单元数据或者单元数据HASH。3、Merke Tree非叶子节点value是其所有子节点value的HASH值。

2014-03-29 11:14:55 15085 4

原创 C++高性能服务框架revolver:RUDP(可靠UDP)算法详解

上一篇BLOG已经介绍了revolver RUDP的传输性能、基本的框架和接口,这篇文章我重点讲述RUDP的实现细节。在RUDP的模块中最为重要的是其收发缓冲控制和CCC发送窗口控制、CCC发送慢启动控制、CCC快恢复控制等几个过程。数据块定义在RUDP模块中,所有发送的数据被定义成RUDPRecvSegment 和 RUDPSendSegment结构,其中RUDPSendSegm

2014-03-19 10:45:05 10979 3

原创 C++高性能服务框架revover:rudp总体介绍(可靠UDP传输)

在revolver框架中实现了一个高效可靠的RUDP通信方式,这个通信方式是基于UDP实现一种模拟TCP传输数据的行为。在很多实际应用中,udp/TCP都不是最好的通信方式,例如:点对点文件传输、视频数据高速传输、服务器之间大数据备份同步、高实时rts操作类网游等。TCP和UDP在一定程度上是无法满足此类要求。故revolver实现了一套可靠UDP的传输方式。我们先来看看它的传输效率,以下是WIN...

2014-03-18 17:56:40 14653 25

原创 linux和windows下UDP发送效率的有趣比较

今天在测试UDP发送效率和RUDP代码时效的问题,偶然的机会发现一个比较有趣的事情,先把我的测试代码贴上来看看,代码如下:int test_udp(){ //_beginthread(sock_recv, 0, NULL); CUDPRecvhread recv_thr; recv_thr.start(); usleep(1000000); Inet_Addr remote_

2014-03-18 15:33:50 3610

原创 redis数据记录过期源代码分析

最近在分析redis源代码,一直想写一点相关的东西,空不出时间来整理。今天好不容易空出时间来,把自己对redis关于记录过期和过期检测的流程理解写来。用过redis的人都知道,redis对相关记录的过期设置和memcached是相似的。

2014-03-14 13:20:43 5092

原创 C++高性能服务框架revolver:协议接口描述和翻译语言

在一个稍微复杂的系统中会涉及到多语言编程,例如:后端C++和JAVA,脚本用LUA,前端可能是C++ AS等等。所以所有模块之间的协议统一变得非常重要,这样做的目的是减少中间的调试和差错。在revolver框架中,实现了一个基于简单的接口语言来实现多语言之间接口协议的实现。所有的协议接口通过一个简单的def文件就可以将协议翻译成对应的语言程序代码,这样尽可能的避免中间环节的差错,也大大提高了编码效

2014-03-08 14:01:45 2664 1

原创 关于多路语音混音的思考与实现

在最近的项目开发中涉及到一个伴奏和类似K歌的功能,最明显的做法就是将播放器里播放的声音扑捉到缓冲区里与麦克风的声音做混合,然后编码发送出去。这里有个关键环节就是混音。因为是音乐类的声音混合,所以要求尽量保真。我看了数字信号处理方面关于波形混合的算法描述,其实就是两个波形值线性相加得到新的波形就可以了。用符号描述:Si= Bi + Pi; (i = 1 , 2, ,3 ...N, B表示背景音,

2014-03-07 10:38:53 8634 2

原创 C++高性能服务框架revolver:同时支持100万个的定时事件的定时器

在高性能的服务器程序当中,定时器是必不可少的部件,而且定时器的效率是直接影响到服务的性能。在众多的开源项目中,定时器设计都有各有各的方法,例如ACE和libEvent都采用了最小堆的算法实现,还有其他的开源项目采用平衡二叉树来做定时的器管理算法。不管是最小堆还是平衡二叉树,其定时器扫描都是O(1),但定时器插入和删除都是O(logN)的复杂度。在定时事件少的情况下,这种算法是足够的,如果超过上百万

2014-03-03 16:16:09 5914 6

原创 C++高性能服务框架revolver:core结构与接口介绍

revolver的核心部件库core是基于revolver base之上进行封装的,实现TCP连接管理、消息隐射管理、服务登记和感知 、IFrame框架和插件等。以下是core的模块结构图:

2014-02-27 10:43:21 2735

原创 一种服务器的负载均衡选取算法

在很多分布式系统里面会遇到一个均衡节点选取的问题:一般是1个负载管理服务器,多个应用服务单元。当有连接或者业务来是,先会去询问负载管理器获取一个负载轻的服务单元,一般的选取就是选取负载最轻的那个。通常情况下是不会有问题的,如果你的应用服务器单元跑的是类似视频服务这种应用,就会出现这样一种情况,某个视频服务A崩溃或者异常了,这个视频服务的所有用户在瞬间会转移到负载最轻的B上,这个时候可能B也异常了,

2014-02-25 18:02:03 1831 1

原创 C++高性能服务框架revolver:base结构分析

revolver基础库的结构图如下:主要是三部分:reactor模块、关联组件模块、独立组件。1.reactorreactor模块主要是实现网络的分时复用设计的模块,可以在同一个线程模式下处理来自网络的读写事件、内部消息事件、定时器事件。以下是reactor的接口定义:class CReactor{public: .... void set_message_proc

2014-02-25 16:52:08 2630

原创 C++高性能服务框架revolver:下载、编译和工程介绍

昨天我把自己的第一个开源项目revolver代码提交到了GitHub上,revolver是一个C++开发的LINUX网络服务框架。这个代码算是我从2012年到现在的积累,开源的目的是希望高手指正问题和分享自己的一些经验,我会持续改进和优化,也希望更多的地方使用revovler。revolver框架除了基础的网络库封装以外,还是实现了网络连接管理、服务单元管理、消息隐射、协议自动化等,可以快速基于它...

2014-02-25 13:48:37 4465 1

MYSQL技术内幕

MYSQL技术内幕第二版,innodb引擎解析。

2015-02-27

raft-论文.pdf

raft算法论文,paxos的升级版算法。

2015-02-26

空空如也

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

TA关注的人

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