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

2019-10-15 12:25:53刘景俊


应该指出一点:在脚本语言中没有什么东西是无法用 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 月):帮助您根据自己的应用程序需求选择最好的云计算平台。