老师,请教一个问题,往有空回答一下。
大概的场景如下:
1、在windows环境,使用openresty搭建一个图片服务器。由于图片的数据是在云存储上面,也就是需要通过sdk采用才能访问到图片数据。
所以流程如下:openresty访问lua,lua通过ffi访问dll库。通过dll这个库获取到图片数据。另外一个服务需要不断的访问图片,用来做图片数据分析。
2、不做负载均衡的时候,速度有点达不到要求。于是乎对本机做了“负载均衡”。
重点的配置如下:
upstream homebackend
{
server 127.0.0.1:8600;
server 127.0.0.1:8601;
server 127.0.0.1:8602;
server 127.0.0.1:8603;
server 127.0.0.1:8604;
server 127.0.0.1:8605;
server 127.0.0.1:8606;
server 127.0.0.1:8607;
server 127.0.0.1:8608;
server 127.0.0.1:8609;
}
server {
#真正的访问入口
listen 8081;
server_name localhost;
location / {
proxy_pass http://homebackend;
proxy_set_header Host $host;
}
}
server {
listen 8600;
server_name localhost;
location / {
content_by_lua_file pic_dll.lua;
}
}
server {
listen 8601;
server_name localhost;
location / {
content_by_lua_file pic_dll.lua;
}
}
...很多个不同端口的server
问题:
发现的结果是:采用本地的“负载均衡”速度竟然提高了好多倍。这是为什么呢?
如果nginx基于进程和事件模型,多个server并没有增加进程或者是事件的处理能力,为什么能够提供性能呢?谢谢!
展开
作者回复: 我猜测你那个dll库的API方法是阻塞的,会导致大量的进程间切换,用多线程可以缓解。有两个办法验证:1、第5部分有一节课是介绍googleperftool的,你可以使用它生成一张调用耗时图。2、第5部分还有一节课介绍观察Nginx的进程间切换,例如pidstat,观察是不是有大量的主动进程切换。Nginx在繁忙的时候不应该有主动进程切换的。