使用 libevent 和 libev 提高网络应用性能的方法(2)
清单 6. 创建作为数据使用的静态文件
复制代码 代码如下:
$ ./basichttpfile
Loading file: sample.html (8046 bytes)
Server started on port 8081
现在,程序可以接受请求了,重新装载计时器也启动了。如果修改 sample.html 的内容,应该会重新装载此文件并在日志中记录一个消息。例如,清单 7 中的输出显示初始装载和两次重新装载:
清单 7. 输出显示初始装载和两次重新装载
复制代码 代码如下:
$ ./basichttpfile
Loading file: sample.html (8046 bytes)
Server started on port 8081
Reloading file: sample.html (8047 bytes)
Reloading file: sample.html (8048 bytes)
注意,要想获得最大的收益,必须确保环境没有限制打开的文件描述符数量。可以使用 ulimit 命令修改限制(需要适当的权限或根访问)。具体的设置取决与您的 OS,但是在 Linux® 上可以用 -n 选项设置打开的文件描述符(和网络套接字)的数量:
清单 8. 用 -n 选项设置打开的文件描述符数量
$ ulimit -n
1024
通过指定数字提高限制:$ ulimit -n 20000。
可以使用 Apache Bench 2 (ab2) 等性能基准测试应用程序检查服务器的性能。可以指定并发查询的数量以及请求的总数。例如,使用 100,000 个请求运行基准测试,并发请求数量为 1000 个:$ ab2 -n 100000 -c 1000 http://192.168.0.22:8081/。
使用服务器示例中所示的 8K 文件运行这个示例系统,获得的结果为大约每秒处理 11,000 个请求。请记住,这个 libevent 服务器在单一线程中运行,而且单一客户端不太可能给服务器造成压力,因为它还受到打开请求的方法的限制。尽管如此,在交换的文档大小适中的情况下,这样的处理速率对于单线程应用程序来说仍然令人吃惊。
--------------------------------------------------------------------------------
回页首
使用其他语言的实现
尽管 C 语言很适合许多系统应用程序,但是在现代环境中不经常使用 C 语言,脚本语言更灵活、更实用。幸运的是,Perl 和 PHP 等大多数脚本语言是用 C 编写的,所以可以通过扩展模块使用 libevent 等 C 库。
例如,清单 9 给出 Perl 网络服务器脚本的基本结构。accept_callback() 函数与 清单 1 所示核心 libevent 示例中的 accept 函数相同。
清单 9. Perl 网络服务器脚本的基本结构
复制代码 代码如下:
my $server = IO::Socket::INET->new(
LocalAddr => 'localhost',
LocalPort => 8081,
Proto => 'tcp',
ReuseAddr => SO_REUSEADDR,
Listen => 1,
Blocking => 0,
) or die $@;
my $accept = event_new($server, EV_READ|EV_PERSIST, \&accept_callback);
$main->add;
event_mainloop();
用这些语言编写的 libevent 实现通常支持 libevent 系统的核心,但是不一定支持 HTTP 包装器。因此,对脚本编程的应用程序使用这些解决方案会比较复杂。有两种方法:要么把脚本语言嵌入到基于 C 的 libevent 应用程序中,要么使用基于脚本语言环境构建的众多 HTTP 实现之一。例如,Python 包含功能很强的 HTTP 服务器类 (httplib/httplib2)。
应该指出一点:在脚本语言中没有什么东西是无法用 C 重新实现的。但是,要考虑到开发时间的限制,而且与现有代码集成可能更重要。
libev 库
与 libevent 一样,libev 系统也是基于事件循环的系统,它在 poll()、select() 等机制的本机实现的基础上提供基于事件的循环。到我撰写本文时,libev 实现的开销更低,能够实现更好的基准测试结果。libev API 比较原始,没有 HTTP 包装器,但是 libev 支持在实现中内置更多事件类型。例如,一种 evstat 实现可以监视多个文件的属性变动,可以在 清单 4 所示的 HTTP 文件解决方案中使用它。
但是,libevent 和 libev 的基本过程是相同的。创建所需的网络监听套接字,注册在执行期间要调用的事件,然后启动主事件循环,让 libev 处理过程的其余部分。
例如,可以使用 Ruby 接口按照与清单 1 相似的方式提供回显服务器,见 清单 10。
清单 10. 使用 Ruby 接口提供回显服务器
复制代码 代码如下:
require 'rubygems'
require 'rev'
PORT = 8081
class EchoServerConnection < Rev::TCPSocket
def on_read(data)
write 'You said: ' + data
end
end
server = Rev::TCPServer.new('192.168.0.22', PORT, EchoServerConnection)
server.attach(Rev::Loop.default)
puts "Listening on localhost:#{PORT}"
Rev::Loop.default.run
Ruby 实现尤其出色,因为它为许多常用的网络解决方案提供了包装器,包括 HTTP 客户端、OpenSSL 和 DNS。其他脚本语言实现包括功能全面的 Perl 和 Python 实现,您可以试一试。
结束语
libevent 和 libev 都提供灵活且强大的环境,支持为处理服务器端或客户端请求实现高性能网络(和其他 I/O)接口。目标是以高效(CPU/RAM 使用量低)的方式支持数千甚至数万个连接。在本文中,您看到了一些示例,包括 libevent 中内置的 HTTP 服务,可以使用这些技术支持基于 IBM Cloud、EC2 或 AJAX 的 web 应用程序。
参考资料
学习
- C10K problem 对处理 10,000 个连接的问题做了精彩的概述。
- IBM Cloud Computing 网站提供不同云实现的相关信息。
- 阅读 系统管理工具包: 标准化您的 UNIX 命令行工具(Martin Brown,developerWorks,2006 年 5 月),学习如何跨多台机器使用相同的命令。
- 让 UNIX 和 Linux 一起工作(Martin Brown,developerWorks,2006 年 4 月)讲解如何让传统的 UNIX 发行版和 Linux 一起工作。
- 揭秘云计算(Brett McLaughlin,developerWorks,2009 年 3 月):帮助您根据自己的应用程序需求选择最好的云计算平台。
- 阅读 用 Amazon Web Services 进行云计算(Prabhakar Chaganti,developerWorks,2008 年 7 月):详细讲解如何使用 Amazon Web Services。
- 可以通过 developerWorks Cloud Computing Resource Center 使用适用于 Amazon EC2 平台的 IBM 产品。
- developerWorks Cloud Computing Resource Center 使用适用于 Amazon EC2 平台的 IBM 产品。
- 在 developerWorks 的 云开发人员资源 中,发现和共享应用程序和服务开发人员构建其云部署项目的知识和经验。
- AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
- AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
- AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
- AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
- IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。
- 在 developerWorks 播客 上收听面向软件开发人员的有趣访谈和讨论。
- developerWorks 技术活动和网络广播:随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
- 获取 libev 库,包括下载和文档。
- 获取 libevent 库。
- ruby libev (rev) 库和文档。
- Memcached 是用于存储和处理数据的 RAM 缓存(其核心使用 libevent,也可以使用其他 libevent 服务器)。
- 使用 IBM 试用软件 改进您的下一个开放源码开发项目,这些软件可以通过下载或从 DVD 获得。
顶(0)
踩(0)
- 最新评论
