源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

使用 libevent 和 libev 提高网络应用性能的方法

  • 时间:2020-07-14 02:33 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:使用 libevent 和 libev 提高网络应用性能的方法
有许多解决方案,但是 libevent 库和 libev 库能够大大提高性能和事件处理能力。在本文中,我们要讨论在 UNIX® 应用程序中使用和部署这些解决方案所用的基本结构和方法。libev 和 libevent 都可以在高性能应用程序中使用,包括部署在 IBM Cloud 或 Amazon EC2 环境中的应用程序,这些应用程序需要支持大量并发客户端或操作。 [b]简介[/b] 许多服务器部署(尤其是 web 服务器部署)面对的最大问题之一是必须能够处理大量连接。无论是通过构建基于云的服务来处理网络通信流,还是把应用程序分布在 IBM Amazon EC 实例上,还是为网站提供高性能组件,都需要能够处理大量并发连接。 一个好例子是,web 应用程序最近越来越动态了,尤其是使用 AJAX 技术的应用程序。如果要部署的系统允许数千客户端直接在网页中更新信息,比如提供事件或问题实时监视的系统,那么提供信息的速度就非常重要了。在网格或云环境中,可能有来自数千客户端的持久连接同时打开着,必须能够处理每个客户端的请求并做出响应。 在讨论 libevent 和 libev 如何处理多个网络连接之前,我们先简要回顾一下处理这类连接的传统解决方案。 [b]处理多个客户端 [/b] 处理多个连接有许多不同的传统方法,但是在处理大量连接时它们往往会产生问题,因为它们使用的内存或 CPU 太多,或者达到了某个操作系统限制。 [b]使用的主要方法如下: [/b] 循环:早期系统使用简单的循环选择解决方案,即循环遍历打开的网络连接的列表,判断是否有要读取的数据。这种方法既缓慢(尤其是随着连接数量增加越来越慢),又低效(因为在处理当前连接时其他连接可能正在发送请求并等待响应)。在系统循环遍历每个连接时,其他连接不得不等待。如果有 100 个连接,其中只有一个有数据,那么仍然必须处理其他 99 个连接,才能轮到真正需要处理的连接。 poll、epoll 和变体:这是对循环方法的改进,它用一个结构保存要监视的每个连接的数组,当在网络套接字上发现数据时,通过回调机制调用处理函数。poll 的问题是这个结构会非常大,在列表中添加新的网络连接时,修改结构会增加负载并影响性能。 选择:select() 函数调用使用一个静态结构,它事先被硬编码为相当小的数量(1024 个连接),因此不适用于非常大的部署。 在各种平台上还有其他实现(比如 Solaris 上的 /dev/poll 或 FreeBSD/NetBSD 上的 kqueue),它们在各自的 OS 上性能可能更好,但是无法移植,也不一定能够解决处理请求的高层问题。 上面的所有解决方案都用简单的循环等待并处理请求,然后把请求分派给另一个函数以处理实际的网络交互。关键在于循环和网络套接字需要大量管理代码,这样才能监听、更新和控制不同的连接和接口。 处理许多连接的另一种方法是,利用现代内核中的多线程支持监听和处理连接,为每个连接启动一个新线程。这把责任直接交给操作系统,但是会在 RAM 和 CPU 方面增加相当大的开销,因为每个线程都需要自己的执行空间。另外,如果每个线程都忙于处理网络连接,线程之间的上下文切换会很频繁。最后,许多内核并不适于处理如此大量的活跃线程。 [b]libevent 方法 [/b] libevent 库实际上没有更换 select()、poll() 或其他机制的基础。而是使用对于每个平台最高效的高性能解决方案在实现外加上一个包装器。 为了实际处理每个请求,libevent 库提供一种事件机制,它作为底层网络后端的包装器。事件系统让为连接添加处理函数变得非常简便,同时降低了底层 I/O 复杂性。这是 libevent 系统的核心。 libevent 库的其他组件提供其他功能,包括缓冲的事件系统(用于缓冲发送到客户端/从客户端接收的数据)以及 HTTP、DNS 和 RPC 系统的核心实现。 创建 libevent 服务器的基本方法是,注册当发生某一操作(比如接受来自客户端的连接)时应该执行的函数,然后调用主事件循环 event_dispatch()。执行过程的控制现在由 libevent 系统处理。注册事件和将调用的函数之后,事件系统开始自治;在应用程序运行时,可以在事件队列中添加(注册)或删除(取消注册)事件。事件注册非常方便,可以通过它添加新事件以处理新打开的连接,从而构建灵活的网络处理系统。 例如,可以打开一个监听套接字,然后注册一个回调函数,每当需要调用 accept() 函数以打开新连接时调用这个回调函数,这样就创建了一个网络服务器。清单 1 所示的代码片段说明基本过程: 清单 1. 打开监听套接字,注册一个回调函数(每当需要调用 accept() 函数以打开新连接时调用它),由此创建网络服务器
[url=http://www.kegel.com/c10k.html]C10K problem[/url] 对处理 10,000 个连接的问题做了精彩的概述。 [*][url=http://www.ibm.com/ibm/cloud/]IBM Cloud Computing[/url] 网站提供不同云实现的相关信息。 [/*][*]阅读 [url=http://www.ibm.com/developerworks/cn/aix/library/au-satstandardsh.html]系统管理工具包: 标准化您的 UNIX 命令行工具[/url](Martin Brown,developerWorks,2006 年 5 月),学习如何跨多台机器使用相同的命令。 [/*][*][url=http://www.ibm.com/developerworks/cn/aix/library/au-linuxtogether/index.html]让 UNIX 和 Linux 一起工作[/url](Martin Brown,developerWorks,2006 年 4 月)讲解如何让传统的 UNIX 发行版和 Linux 一起工作。 [/*][*][url=http://www.ibm.com/developerworks/cn/web/wa-cloudflavor/]揭秘云计算[/url](Brett McLaughlin,developerWorks,2009 年 3 月):帮助您根据自己的应用程序需求选择最好的云计算平台。 [/*][*]阅读 [url=http://www.ibm.com/developerworks/cn/web/ar-cloudaws1/]用 Amazon Web Services 进行云计算[/url](Prabhakar Chaganti,developerWorks,2008 年 7 月):详细讲解如何使用 Amazon Web Services。 [/*][*]可以通过 [url=http://www.ibm.com/developerworks/cn/downloads/cloud.html]developerWorks Cloud Computing Resource Center[/url] 使用适用于 Amazon EC2 平台的 IBM 产品。 [/*][*][url=http://www.ibm.com/developerworks/cn/downloads/cloud.html]developerWorks Cloud Computing Resource Center[/url] 使用适用于 Amazon EC2 平台的 IBM 产品。 [/*][*]在 developerWorks 的 [url=https://www.ibm.com/developerworks/cn/cloud/index.html]云开发人员资源[/url] 中,发现和共享应用程序和服务开发人员构建其云部署项目的知识和经验。 [/*][*][url=http://www.ibm.com/developerworks/cn/aix/]AIX and UNIX 专区[/url]:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。 [/*][*][url=http://www.ibm.com/developerworks/cn/aix/newto/]AIX and UNIX 新手入门[/url]:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。 [/*][*][url=http://www.ibm.com/developerworks/cn/aix/lpsummary.html]AIX and UNIX 专题汇总[/url]:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。 [/*][*][url=http://www.ibm.com/developerworks/cn/aix/downloads/]AIX and UNIX 下载中心[/url]:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。 [/*][*][url=http://www.ibm.com/developerworks/cn/aix/systemmaga/index.html]IBM Systems Magazine for AIX 中文版[/url]:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。 [/*][*]在 [url=http://www.ibm.com/developerworks/podcast/]developerWorks 播客[/url] 上收听面向软件开发人员的有趣访谈和讨论。 [/*][*]developerWorks [url=http://www.ibm.com/developerworks/cn/offers/techbriefings/]技术活动[/url]和[url=http://www.ibm.com/developerworks/cn/swi/]网络广播[/url]:随时关注 developerWorks 技术活动和网络广播。 [/*][/list] [b]获得产品和技术[/b] [list] [*]获取 [url=http://software.schmorp.de/pkg/libev.html]libev 库[/url],包括下载和文档。 [/*][*]获取 [url=http://www.monkey.org/~provos/libevent/]libevent 库[/url]。 [/*][*][url=http://rev.rubyforge.org/rdoc/]ruby libev[/url] (rev) 库和文档。 [/*][*][url=http://memcached.org/]Memcached[/url] 是用于存储和处理数据的 RAM 缓存(其核心使用 libevent,也可以使用其他 libevent 服务器)。 [/*][*]使用 [url=http://www.ibm.com/developerworks/cn/downloads/]IBM 试用软件[/url] 改进您的下一个开放源码开发项目,这些软件可以通过下载或从 DVD 获得。 [/*][/list]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部