记录自己对EventLoop和性能问题处理的一点心得
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和性能问题处理的一点心得的更多相关文章
- 记录自己对EventLoop和性能问题处理的一点心得【转】
转自:http://www.cnblogs.com/lanyuliuyun/p/4483384.html 1.EventLoop 这里说的EventLoop不是指某一个具体的库或是框架,而是指一种程序 ...
- PolarDB阿里初赛问题记录 PolarDB 阿里 中间件 比赛 性能 工程手册
Contents 这篇纯碎是碎碎念记录. 每个value都是4KB,总共最多会写6400W个value,算下来就是64 * 1000 * 1000 * 4 * 1024 Bytes ≈ 256G. 每 ...
- 记录bigdesk中ElasticSearch的性能参数
定时采集bigdesk中的Elasticsearch性能参数,并保存到数据库或ELK,以便于进行长期监控. 基于python脚本实现,脚本如下: #coding=gbk import httplibi ...
- 【测试记录】EF插入查询性能
介绍 背景什么就不提了,无外乎出现了大数据需要处理.简单的说就是我测试了EF正常的插入以及一个优化小方式而已,然后做了查询记录.其余没有什么,写这篇只是为了记录结果方便以后数据参考吧. 代码介 ...
- [记录]FIO测试磁盘iops性能
FIO测试磁盘iops性能 1.SATA和SAS盘原生IOPS如下: 2.RAID磁盘阵列对应的写惩罚级别: 3.计算功能性IOPS公式如下: 功能性 IOPS=(((总原生 IOPS×写 %))/( ...
- Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化
Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND&quo ...
- 之前做web性能优化的一些个人心得
一个web项目后期的维护主要在于性能方面.数据吞吐量一旦增大各种bug都出来了.那些通过硬件<数据库分表,数据库主从分离,读写分离>等的一些手段此处就不多说了.本文主要在编码方面做一个性能 ...
- 脱O把妹,记录这一周来迁移至MySQL的一些心得
· 背景 公司要把一些老设备退服,一些陪伴我多年的DB要下线了,舍不得.正好借此机会,手贱把自己3个"回收站"DB迁移到MySQL上,也算是赶一把时髦.等真正看着这些老设备下线了的 ...
- 利用GPU改善程序性能的一点心得
1. 硬件方面 a. 流处理器个数 Gpu内部的计算单元个数,决定分析模块实时性的关键因素. 实测效果: gtx760 1152个 Gtx960 1024个 单路1080p运动 ...
随机推荐
- Oracle数据库如何创建DATABASE LINK?
Oracle数据库如何创建DATABASE LINK? 2011-08-09 14:54 taowei20061122 CSDN博客 http://blog.csdn.net/taowei20061 ...
- Sqrtx
我只能想出二分的方法,而且还不一定能写出最简洁的代码.无论刷多少遍,牛顿迭代法我都想不到,莫名有种悲哀的感觉:智力是硬伤啊.就算如此,却还要一遍遍不厌其烦地刷,这才是最悲剧的.多说无益,上代码. 二分 ...
- 011-Scala中的apply实战详解
011-Scala中的apply实战详解 object中的apply方法 class中的apply方法 使用方法 apply方法可以应用在类或者Object对象中 class类 必须要创建实例化的类对 ...
- linux下用eclipse + GDBserver + JLINK 在线调试(ARM11)
(一)环境: 目标版:TINY6410 OS:centOS6.5 IDE:eclipse luna CDT:v8.3 GDB:V7.5 (二)环境监理 1.安装cenntos:参考其他相关文章,这里重 ...
- eap-peap/mschapv2
eap-peap/mschapv2 文件路径 用途 示例 备注 #gedit /usr/local/etc/raddb/sites-available/default #gedit /us ...
- Bootstrap-datetimepicker年月日
<div class="input-group date form_date" data-date="" data-date-format="y ...
- SharePoint Framework 概述
博客地址:http://blog.csdn.net/FoxDave 本文翻译自新出的SharePoint Framework概述介绍文章,原文地址:http://dev.office.com/sh ...
- css测试题
1.CSS 指的是? 您的回答:Computer Style Sheets 正确答案:Cascading Style Sheets 2.在以下的 HTML 中,哪个是正确引用外部样式表的方法? 您的回 ...
- 优化mysql运行环境的方法
Mysql优化已经讲过很多篇教程了,而且网上也很多相关内容,但是本文我们是讲Linux下Mysql运行环境如何进行优化,有些地方与以往有所不同,也具有参考价值.具体mysql教程 如下: 一.修改Li ...
- ajax 中boolean值技巧
// 利用判断 数据重复 function checkId () { var flag = true; $.ajax({ url: "", type: "post&quo ...