0

在过去的几年里,我们一直在运行一个用 C++、libevent 和嵌入式 Lua(LuaJit 使用与 openresty,一个 Nginx 包使用的 LuaJit 共享库完全相同的 LuaJit 共享库)编写的自定义、预分叉、HTTP 服务器。巧合的是,它的架构与 Nginx 几乎相同。

该服务器的大部分业务功能都在 Lua 脚本“处理程序”中,当我们看到 Nginx 支持 Lua 时,我们认为我们应该将代码库转移到 Nginx 并利用 Nginx 拥有的所有社区支持。我们把所有的代码都移过来了,我们的测试显示一切正常,就功能被保留,然而......

我们遇到了一个问题。在旧的自定义 C++ 服务器上,HTTP 请求的延迟通常为 2 毫秒往返。基于 Nginx 的新服务器启动时间约为 60 毫秒。奇怪的是,我们对实际 Lua 代码执行的内部测量(使用 Lua os.clock() 对代码区域进行计时)显示,就 Lua 执行速度而言,两个服务器版本几乎相同。

使用各种分析器不会在 Nginx 代码上显示出任何非常大的缓慢区域。pcre 是最高的,大约花费了 6% 的时间。

还有一件事。我们的设置有一个代理 Nginx 服务器与我们的 Nginx Lua 服务器通信,两者都在同一台机器上,通过 127.0.0.1 进行通信,所以它是 LAN => Nginx 代理 => Nginx Lua 服务器。

ldd nginx
    linux-vdso.so.1 =>  (0x00007ffc02ff3000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f88d0b46000)
    libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f88d090f000)
    libluajit-5.1.so.2 => /d1/apps/mt3/openresty/luajit/lib/libluajit-5.1.so.2 (0x00007f88d069a000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f88d0418000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f88d01db000)
    libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f88cff79000)
    libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f88cfb81000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f88cf97d000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f88cf765000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88cf3da000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f88d0d72000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f88cf1c4000)

有人有什么想法吗?

4

0 回答 0