1、EventLoop

这里说的EventLoop不是指某一个具体的库或是框架,而是指一种程序实现结构。这种结构多是基于IO多路转接的API(select、poll、epoll之类)以reactor模型,实现IO事件处理、timer和异步事件处理。具体常见的库有libev、libevent,以及陈硕(@bnu_chenshuo)的muduo。这些库或是框架基本的原理流程都类似,区别都是在API接口功能和多平台支持之上。这里就不具体的对此进行展开讨论了,接下来说说自己对EventLoop的一点理解,欢迎各路大侠拍砖。

先简单抛出一个自己的结论:现在的程序服务基本上都可以使用EventLoop的结构来驱动。

其原因是需求都近乎于类似,基本上都要处理IO事件进行消息收发与外部进行通讯、都要实现timer来进行定时、都要发起一些异步处理过程。而这些都可以用EventLoop进行抽象。对这些功能实现了统一的抽象实现之后,在此之上实现基础的TcpServer、TcpClient、UDP Peer就方便的多了,在往上进一步加上各自的业务逻辑,就形成了各种Server、客户端。可以说核心的结构都是类似,细分的差别就体现在内存管理、包收发控制(拥塞控制)、并发模型设计、系统架构Scale和健壮容错能力方面。

如下图所示

虚线框中既是基本的EventLoop的组件功能了。功能丰富一点库会在APP Sever/APP Client中实现诸如http server/http request之类的功能了,比如陈硕的muduo,或是精简一点,TCP Server/TCP Client/UDP Peer都没做,只实现了IO Event Handle、Timer、Async Event,比如libev。自己分析了muduo实现,模仿其API,也用C杜撰了一套精简的实现,实现了上述框架的的功能,APP的部分具体实现了RTSP Server/RTSP Request功能,也在公司里用的挺好,这里要推荐一下muduo,其API是自己见过功能的库中使用最方便的一个(也可能是自己孤陋寡闻,没见过更牛掰的),也促成自己重新造了一个轮子。

2,性能问题问题

自己遇到的性能问题主要是体现在CPU使用率上。在自己最近做的项目中,遇到过三次CPU使用率过高的问题,但问题原因各不相同。这里记录一下

1) 一次是因为软件使用的一个第三方SDK中默认开启了软件解码运算而导致的。发现问题原因所在首先要进行度量,以确定具体是在哪里耗CPU明显。此时自己使用的是process explorer工具(windows)中线程查看功能,其可以具体的查看一个进程中各个线程的运行情况,包括CPU使用率和调用栈。对此很直接找到问题的元凶。之后联系对应厂商开发人员,对SDK进行修改,关闭默认解码操作,提供开关控制后解决。

2)一次是因为检测了IO句柄上的无用的write事件,而导致代码流程空转所致。经过实际验证,发现该问题可控,当停止所有的网络功能之后,CPU使用率立马回复正常,就基本确定于网络功能有关。解决该问题仍然是先进行度量,这次的度量工具是VS中的性能分析工具,用其对各个函数的调用情况进行采样,很轻松的发现那些函数调用的次数比较多,就直接定位到问题点,经过分析后将write事件监测改为按需进行后解决问题。

3)第三次是因为代码bug在一个不常见的处理分支中而陷入了死循环。同样先进行分析发现该现象不可控,整个程序已经完全不能相应更多的控制操作。遂用VS以调试方式将程序跑起来,将问题复现后,将程序暂停运行后恢复运行,重复几次之后,发现每次暂停时执行流程都陷入在同一个地方,就基本确定代码在这个地方陷入死循环了。仔细地分析了代码,结合实际外部触发条件后,找到了bug所在。修改代码重新进行验证测试,问题解决。

~~~~ end ~~~

记录自己对EventLoop和性能问题处理的一点心得的更多相关文章

  1. 记录自己对EventLoop和性能问题处理的一点心得【转】

    转自:http://www.cnblogs.com/lanyuliuyun/p/4483384.html 1.EventLoop 这里说的EventLoop不是指某一个具体的库或是框架,而是指一种程序 ...

  2. PolarDB阿里初赛问题记录 PolarDB 阿里 中间件 比赛 性能 工程手册

    Contents 这篇纯碎是碎碎念记录. 每个value都是4KB,总共最多会写6400W个value,算下来就是64 * 1000 * 1000 * 4 * 1024 Bytes ≈ 256G. 每 ...

  3. 记录bigdesk中ElasticSearch的性能参数

    定时采集bigdesk中的Elasticsearch性能参数,并保存到数据库或ELK,以便于进行长期监控. 基于python脚本实现,脚本如下: #coding=gbk import httplibi ...

  4. 【测试记录】EF插入查询性能

    介绍     背景什么就不提了,无外乎出现了大数据需要处理.简单的说就是我测试了EF正常的插入以及一个优化小方式而已,然后做了查询记录.其余没有什么,写这篇只是为了记录结果方便以后数据参考吧. 代码介 ...

  5. [记录]FIO测试磁盘iops性能

    FIO测试磁盘iops性能 1.SATA和SAS盘原生IOPS如下: 2.RAID磁盘阵列对应的写惩罚级别: 3.计算功能性IOPS公式如下: 功能性 IOPS=(((总原生 IOPS×写 %))/( ...

  6. Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化

    Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND&quo ...

  7. 之前做web性能优化的一些个人心得

    一个web项目后期的维护主要在于性能方面.数据吞吐量一旦增大各种bug都出来了.那些通过硬件<数据库分表,数据库主从分离,读写分离>等的一些手段此处就不多说了.本文主要在编码方面做一个性能 ...

  8. 脱O把妹,记录这一周来迁移至MySQL的一些心得

    · 背景 公司要把一些老设备退服,一些陪伴我多年的DB要下线了,舍不得.正好借此机会,手贱把自己3个"回收站"DB迁移到MySQL上,也算是赶一把时髦.等真正看着这些老设备下线了的 ...

  9. 利用GPU改善程序性能的一点心得

    1.     硬件方面 a. 流处理器个数    Gpu内部的计算单元个数,决定分析模块实时性的关键因素.    实测效果: gtx760  1152个 Gtx960  1024个 单路1080p运动 ...

随机推荐

  1. Eclipse插件开发中对于Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)(转)

    目的:Eclipse插件开发中,经常要引用第三方包或者是引用其他插件中的类,由于插件开发环境引用类路径的设置和运行平台引用类路径的设置不同,经常导致开发过程OK,一旦运行则出现NoClassDefFo ...

  2. ctags and vim

    1,源码目录下第归检索. ctags -R * 2,搜索tag并用vim打开: vim -t <tag> 3,在vim 下的一些操作: Keyboard command Action Ct ...

  3. [转] 从 C 到 Objective C 入门1

    转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...

  4. Spring中的JDBCTemplate

    src\dayday\JDBCTestTest package dayday;import com.sun.org.apache.xalan.internal.xsltc.compiler.Templ ...

  5. entity framework 新手入门篇(1.5)-lambda表达式与linq

    在建立好了EF模型之后,先不着急使用它,在使用它之前,你还需要了解两个相关的技术,lambda表达式与linq. 作为微软C#语言中重要的语法糖-lambda表达式与LINQ,本质都是一个方法,以la ...

  6. ios手写代码添加控制器

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  7. 使用easeui dialog弹出框中使用CKeditor多次加载后无法编辑问题

    问题呈现:弹出框页面 <tr class="addtr"> <th>内容</th> <td> <!-- <textare ...

  8. NSDateFormatter遇到无法转换的问题

    NSDateFormatter并不是万能的,并不是给出什么字符串都能转遍为NSDate类型,所转换的格式必须必须和你给出的格式想对应 比如说:NSString *dateStr = @"20 ...

  9. BZOJ 1018 线段树维护图连通性

    用8个bool维护即可分别为LURU,LURD,LDRU,LDRD,LULD,RURD,Side[1],Side[2]即可. Side表示这一块有没有接到右边.Merge一下就可以了.码农题,WA了一 ...

  10. linux命令:df

    1.命令介绍: df用来检测磁盘空间占用情况. 2.命令格式: df [选项] 文件 3.命令参数: 必要参数: -a 全部文件系统列表 -h 方便阅读方式显示 -H 等于“-h”,但是计算式,1K= ...