libevent

evpp网络库代码分析(一)

旧巷老猫 提交于 2020-08-18 07:15:05
evpp是奇虎360内部使用的开源多线程网络库,集tcp/udp/http多种协议的服务器和客户端支持。 github 代码路径是: https://github.com/Qihoo360/evpp ,可以不依赖boost库,使用现代c++14语言(evpp/invoke_timer.cc的lambda表达式使用到了c++14的特性)进行编码。本项目高度参考了muduo网络库,而底层使用现成的libevent库作为事件驱动库,典型的一个reactor网络编程模式的例子,本文就是通过分析evpp源码来达到学习c++网络编程的效果。 muduo代码我也拜读过,muduo有个特点,它完全是为linux而写的(譬如里面用到了eventfd,timerfd以及epoll等,都是linux系统特有的,而且还跟linux版本有关,系统版本太低也不支持,譬如eventfd),而evpp做了一定的平台兼容性,能一定程度做到支持windows平台,得益于libevent库。另外,木铎有个base库,是重复造轮子了,其他还好,也是一个不可多得的多线程网络服务器编程demo,值得参考,而evpp没有像muduo那样重新实现一套基础库(如线程库、互斥锁、条件变量等),而是利用了c++14自带的std::thread、std::mutex等,相对通用很多,而且学习这些类库使用在其他项目也能用得着,毕竟是c+

PHP 多任务秒级定时器的实现方法

戏子无情 提交于 2020-08-17 20:11:20
描述 最近在公司部署crontab的时候,突发奇想是否可以用PHP去实现一个定时器,颗粒度到秒级就好,因为crontab最多到分钟级别,同时也调研了一下用PHP去实现的定时器还真不太多,Swoole 扩展里面到实现了一个毫秒级的定时器很高效,后面写一篇,先用PHP去实现一个定时器类,以供学习参考。 实现 在实现定时器代码的时候,用到了PHP系统自带的两个扩展 Pcntl - 多进程扩展 : 主要就是让PHP可以同时开启很多子进程,并行的去处理一些任务。 Spl - SplMinHeap - 小顶堆 一个小顶堆数据结构,在实现定时器的时候,采用这种结构效率还是不错的,插入、删除的时间复杂度都是 O(logN) ,像 libevent 的定时器也在 1.4 版本以后采用了这种数据结构之前用的是 rbtree,如果要是使用链表或者固定的数组,每次插入、删除可能都需要重新遍历或者排序,还是有一定的性能问题的。 流程 说明 1、定义定时器结构,有什么参数之类的. 2、然后全部注册进我们的定时器类 Timer. 3、调用定时器类的monitor方法,开始进行监听. 4、监听过程就是一个while死循环,不断的去看时间堆的堆顶是否到期了,本来考虑每秒循环看一次,后来一想每秒循环看一次还是有点问题,如果正好在我们sleep(1)的时候定时器有到期的了,那我们就不能马上去精准执行,可能会有延时的风险

Memcache(1.2)Memcached安装与基本使用

自闭症网瘾萝莉.ら 提交于 2020-08-14 08:22:43
【1】下载与安装 【1.1】官网 下载: https://memcached.org/ 文档: https://github.com/memcached/memcached/wiki/Install    我们直接就下最新版吧。 Wiki 那里就是官方手册 【1.2】前置依赖 libevent 下载安装 官网: https://libevent.org/ (1)下载:wget https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/libevent-2.1.11-stable.tar.gz (2)解压:tar -zxvf libevent-2.1.11-stable.tar.gz (3)安装:   cd libevent-2.1.11-stable/   ./configure --prefix=/usr   make && make install 【1.3】memcached 下载、解压、安装 (1)下载:wget http://memcached.org/latest (2)解压:tar -zxvf latest    (3)安装 cd memcached-1.6.6 ./configure -with-libevent=/usr --prefix=/usr/local

evpp网络库代码分析(二)

江枫思渺然 提交于 2020-08-11 21:04:11
开局一张图! 上图是盗用自《Linux多线程服务端编程,使用muduo C++网络库》一书6.6.2章节(以及下面的时序图也是盗用该书的图)。该图列举出大部分常用的网络编程模型,当然了,这里并没有列出Boost.Asio的proactor模式。其中表中的“互通”是指多个客户端(连接)间是否能方便地交换数据,如chat聊天程序。我们的evpp库实际上是用到了“方案9”,方案9的时序图如下: 可以看出,每一个线程有一个EventLoop处理事件。这种方案是典型的“one loop per thread”流程,有一个“主EventLoop”负责accept连接,然后把连接通过round-robin(轮询调度)挂到底下的多个“子EventLoop”中(EventLoopThreadPool),每个连接都是由一个“子EventLoop”完成的,能保证请求的顺序性,也可以充分利用CPU,防止出现一个reactor的处理能力饱和,而且EventLoop线程池线程数量固定,不会因为连接数过多到达临界点(线程太多导致操作系统线程调度不过来)而性能下降! 另外还有一种网络编程模型比较常用,就是“方案8”,这个模型在muduo中有现成方案,而在evpp中需要自己实现,时序图如下: 这种方案,只有一个EventLoop,但它把计算密集的部分(decode、compute、encode

COTURN-JANUS WEBRTC环境搭建

笑着哭i 提交于 2020-08-11 17:02:25
概述: 注意端口 tcp/udp的开放 安装coturn和janus前先安装依赖包 证书和turnserver用户密码需配套 前提准备 基础环境的准备,包括服务器环境、地址、证书、防火墙配置等。</br> 环境准备</br> 操作系统:centos 7.6 x64</br> 一个带有SSL证书的域名</br> 需要开放对应的端口:8088 8188 3478 3480-3500 7000-9000 443</br> 证书转换 mkdir /etc/ssl/cert/domain.com cd /etc/ssl/cert/domain.com 上传证书至此目录,一般用Nginx适用的证书即可。如果有pem的最好,直接上传到此处,如果没有的话,需要转换。 openssl rsa -in domain.com.key -text > key.pem openssl x509 -inform PEM -in domain.com.crt > cert.pem 开始安装 开始Webrtc服务的部署及安装,将分步骤详细记录。以及在按步骤执行过程中遇到的问题的处理。 安装依赖包 yum update yum install texinfo libmicrohttpd-devel.x86_64 uncrustify yum -y install epel-release nginx

FastDfs配置nginx扩展模块进行文件访问

跟風遠走 提交于 2020-08-11 07:47:36
FastDfs配置nginx扩展模块进行文件访问 近期琢磨了下fastdfs分布式文件系统以及相关nginx扩展模块,发现其中存在的坑还是很多,社区中各种配置,各种安装方法,个人搞了一下,还是各种问题,解决后,为方便大家,特意总结下从头到尾的流程配置; 1. 删除过往安装残留物 因大家在社区找相关文档基础前提下,肯定是趟过坑,安装过多次,特此删除下残留物,保证健康干净的环境: find / -name nginx | xargs rm -rf find / -name fastdfs | xargs rm -rf find / -name fdfs | xargs rm -rf 删除完成后进行下一步; 2. 安装所需环境依赖 yum install gcc -y yum install libevent -y yum install libevent-devel -y fastdfs需要c语言环境支持,并且需要相关lib库,当然后面的libfastcommon在高版本环境下已经兼容libevent,可以选择不安装libevent,个人建议还是跟着步骤安装上为好; 3. 安装fastdfs核心类库 在个人目录下创建相应临时目录用于编译,安装(根据个人情况) cd /home/yangtuo/software/nginx 本人在自己家目录下创建了nginx文件夹,用于编译安装;

php开发memcached

雨燕双飞 提交于 2020-07-28 21:01:27
一、memcached 简介 memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展 性。 它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable 。 二、memcached 安装( 参考” Linux下的Memcache安装 ” ) 首先是下载 memcached 了,目前最新版本是 1.4.0,直接从官方网站即可下载到 memcached-1[1].4.0.tar.gz。除此之外,memcached 用到了 libevent,我yum install libevent libevent-devel 接下来是将 memcached-1[1].4.0.tar.gz 解开包、编译、安装: # tar -xzf memcached-1.1.12.tar.gz # cd memcached-1.1.12 # ./configure # make # make install 三、运行 memcached 守护程序 运行 memcached 守护程序很简单,只需一个命令行即可,不需要修改任何配置文件(也没有配置文件给你修改): /usr/local/bin/memcached -d -m

error while loading shared libraries: libevent cannot open shared object file

て烟熏妆下的殇ゞ 提交于 2020-04-22 22:25:24
错误提示 程序执行时,默认去/lib/或者/usr/lib下连接动态库 此时可以把要链接的动态库复制到这两个目录下,程序执行时就能自动链接执行 或者把动态链接库目录添加到/etc/ld.so.conf 文件中 执行ldconfig生效 来源: oschina 链接: https://my.oschina.net/u/4149215/blog/3301944

CodeBlocks 添加 lib(.so/.a) 包

倖福魔咒の 提交于 2020-04-19 23:56:21
用Ubuntu环境举个例子,在CodeBlocks里建个工程叫test。 点中test工程 -》 选 Build options ,会弹出 Project build options 对话框 在 Linker settings -》 Other linker options 里添加 -levent 在 Search directories -》 Linker 里添加 /usr/local/lib 在rebuild时你可以看到console里有如下信息: g++ -L/usr/local/lib -o bin/Debug/test obj/Debug/main.o -levent -L后面跟的是lib目录,-l后跟的是lib名 lib名字在/usr/local/lib里的全名是libevent.so或者libevent-2.1.so.7 再给一个后来看到的链接,讲ldd的,关于动态lib的问题。 https://blog.csdn.net/renwotao2009/article/details/51398739 来源: oschina 链接: https://my.oschina.net/bxnet/blog/3275616

【原创】公司自研缓存系统UPU的总结

蓝咒 提交于 2020-04-08 07:32:49
公司自主研发了这样一个缓存系统(名为 UPU),规格如下: 同机房间的两个 UPU 互为主备,但同一时刻只有一个 UPU 通过 keepalived 虚地址对外提供服务,主备切换也是通过 keepalived 实现; 同一(逻辑)域内的全部 UPU 形成集群,集群间通过 Erlang/OTP 内置的 Mnesia 数据库完成数据同步; UPU 集群不存在主的概念,故可以在集群中的任意节点上进行数据更新操作; 可以进行多级域的 UPU 级联; 业务的数据更新均在本地进行,但数据会向顶级域同步; 业务的数据查询均在本地进行,但会根据具体的请求类型决定是否还向顶级域查询; UPU 服务器部署架构图 UPU 服务器内部结构(Erlang 监督树结构 ) libupu(客户端库)的结构设计 这套系统存在的部分问题 : UPU 本身不支持针对缓存消息的超时控制,而是依赖于业务程序自己的控制。在业务自身发生异常的情况下,可能出现数据的不一致或残留(已通过其他方法规避); UPU 的数据同步功能依赖于 Erlang/OTP 内置的 Mnesia 数据库,官方明确说明在发生网络分区时,可能会导致数据不一致, 原开发人员本来打算采用 环形复制 来解决集群数据多写问题,但最终没有实现 ; 在 UPU 级联情况下,级联相关配置是手动写死在配置文件中的,在出现异常时,只能通过修改配置并重启服务的方式进行恢复