转自:http://www.cnblogs.com/lanyuliuyun/p/4483384.html

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所在。修改代码重新进行验证测试,问题解决。

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

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

    1.EventLoop 这里说的EventLoop不是指某一个具体的库或是框架,而是指一种程序实现结构.这种结构多是基于IO多路转接的API(select.poll.epoll之类)以reactor模 ...

  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. A01-java学习环境准备

    1, 需要去oracle官网下载,JDK     https://www.oracle.com/technetwork/java/javase/downloads/index.html 点击SE Do ...

  2. 团队项目设计完善&编码测试

    任务1:软件设计方案说明书 <基于弹幕评论的大数据分析平台软件设计方案说明书>仓库链接:点击跳转 任务2:搭建并配置项目集成开发环境: 开发环境 java version "1. ...

  3. Oracle client 使用 .net程序连接 数据库时 出现 8.1.7 的解决办法

    1. GS产品 连接oracle数据库时出现错误图示 2. 其实解决这个问题的办法很简单 一般是 修改一下 Oracle的app 目录的权限 最简单的办法是增加 everyone 权限 然后重启机器即 ...

  4. FuelPHP 系列(一) ------ Oil 命令

    之前用过 Laravel,框架自带的 artisan 命令,用得爽到爆.现在工作需要,要学习 FuelPHP,首先看到框架目录结构,有 coposer.json 框架可以用 composer 管理,一 ...

  5. dos批量导入不受信任的证书及软件限制策略的应用

    certmgr.exe -add "证书.cer" -s -r localMachine Disallowed 导入授信机构 certmgr -add "证书.cer&q ...

  6. ThinkPHP从零开始(一)安装和配置

    序: 对PHP一无所知的我,将从这里从零开始. 1.下载与安装 ThinkPHP的下载: ThinkPHP中文站下载页面 有 核心版和完整版两种,由于不了解.所以我选择了完整版.    WampSer ...

  7. Java之序列化和反序列化

    序列化的对象: package test_demo.SerializableOper; import java.io.Serializable; /* * 序列化对象需要实现序列号接口 * */ pu ...

  8. jmeter测试soap协议时候 路径不需要添加

  9. BZOJ 3516 国王奇遇记加强版(乱推)

    题意 求\(\sum_{k=1}^{n}k^mm^k (n\leq1e9,m\leq1e3)\) 思路 在<>中有一个方法用来求和,称为摄动法. 我们考虑用摄动法来求这个和式,看能不能得到 ...

  10. eclipse 安装报错

    14 11:17:13] ERROR: org.eclipse.equinox.p2.transport.ecf code=1002 Unable to read repository at http ...