V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
torment5524
V2EX  ›  NGINX

请教一个 nginx 的 upstream 跟 cpu 数量的问题

  •  
  •   torment5524 · 2018-06-11 11:19:42 +08:00 · 3023 次点击
    这是一个创建于 2383 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近帮一个朋友维护一个网站,建在阿里云上,查看了下负载的峰值都是 3 左右,cpu 和内存使用都不超过 5%,于是给降了配置,从 16c 降到了 8c,结果部分客户端出现了访问服务器失败的情况。
    然后去排查原因,发现服务器就一个 node.js 服务,通过 nginx 做代理,配置大概如下:

    upstream io_nodes {
    ip_hash;
    server 127.0.0.1:69;
    server 127.0.0.1:70;
    server 127.0.0.1:71;
    server 127.0.0.1:72;

    一共 10 多个端口,都是对应本机的同一个 node.js 服务,我是没大搞懂意义何在,但是,降到 8c 之后,查了下,端口就只剩下了 8 个,把服务器改成了 16c 之后又全都出现了。
    本来以为是 worker_processes 参数的问题,但是经过测试,woker 确实根据设定的值来了,但是打开的端口还是跟 cpu 数量一致。
    请教下,这个是由什么配置控制的?
    ================
    刚好在群里问到了,说是 node.js 的进程数和 cpu 有关,是这个开不起来了,现在变成 node.js 的进程数和 cpu 数量的问题了。
    再就是这种模式还有救么。。
    第 1 条附言  ·  2018-06-12 09:21:05 +08:00
    咳咳,找到原因了,也不是 node.js 的锅。
    js 里是这样的
    …………
    var num_processes = require('os').cpus().length;
    …………
    if (cluster.isMaster) {
    for ( var i = 0; i < num_processes; i++ ) {
    cluster.fork();
    }
    …………
    }

    var server = http.createServer().listen(port+cluster.worker.id)

    …………
    唉,真心搞不懂啊,明明一个端口就足够的事。。。
    感谢大家。
    12 条回复    2018-06-12 10:08:10 +08:00
    rrfeng
        1
    rrfeng  
       2018-06-11 11:27:12 +08:00 via Android   ❤️ 1
    这个是 nodejs 控制的...
    torment5524
        2
    torment5524  
    OP
       2018-06-11 11:29:42 +08:00
    @rrfeng 感谢答复,node.js 没用过,被折腾的不轻。
    a7a2
        3
    a7a2  
       2018-06-11 11:46:58 +08:00   ❤️ 1
    nodejs 又不是 python 为何一份代码要开 n 多端口做相同的服务???对开发者能力表示疑问?
    D3EP
        4
    D3EP  
       2018-06-11 12:26:40 +08:00 via iPhone
    @a7a2 node 只能多进程吧,只能这样做
    suconghou
        5
    suconghou  
       2018-06-11 12:42:42 +08:00 via Android   ❤️ 1
    node 单个进程就能应对高并发了 但是单个进程不能充分利用多核, node 的运行模型更不适用于 cpu 密集型计算,这些场景下多进程是有必要的 。 猜测是你服务器上有什么管理 node 进程的东西 始终开启和 cpu 核数相同的进程端口号递增 导致的问题
    a7a2
        6
    a7a2  
       2018-06-11 13:11:08 +08:00
    @suconghou 还是写代码那个不行 ,查了一下,nodejs 自从出了多线程支持 cluster 后就能充分利用 cpu 每个核
    ryd994
        7
    ryd994  
       2018-06-11 14:40:34 +08:00 via Android
    @D3EP 多进程又不用多端口。Nginx 还不是多个进程。要效率高的话可以用 reuseport
    janxin
        8
    janxin  
       2018-06-11 14:43:37 +08:00
    @a7a2 本质上还是起子进程啊...
    suconghou
        9
    suconghou  
       2018-06-11 14:48:00 +08:00
    @a7a2 cluster node 0.6 版本就有了,cluster 就是多进程,node 就没有用户代码的多线程,用 cluster 和启多个进程是一样的,只不多 cluster 也负责了负载均衡,而这里使用了 nginx 负责负载均衡.
    inflationaaron
        10
    inflationaaron  
       2018-06-12 03:14:08 +08:00 via iPad
    V8 就是单线程引擎,怎么 node.js 就能用上多线程了?除了 async call 是系统用 thread pool 实现的,用户没法自己写多线程的。
    torment5524
        11
    torment5524  
    OP
       2018-06-12 08:45:56 +08:00
    @suconghou 用的 pm2 做的管理,我有个小疑问,既然是通过 nginx 启动的多个 node.js 进程,这几个在 js 文件里都是同一个端口,这样没有冲突么,再就是老的业务是访问 17 个端口的,这还少了一个,怎么让 pm2 出啊过 cpu 多开个进程出来。。
    suconghou
        12
    suconghou  
       2018-06-12 10:08:10 +08:00   ❤️ 1
    @torment5524 首先,node 进程是 pm2 启动的,不是 nginx; 其次 ,你指出 node 进程是有多少进程就有多少个端口号,那 pm2 就不是以 cluster 模式启动的,应该是 fork 模式,端口号的使用规则要看你的代码或者相关配置,增加进程和减少进程可以参考 pm2 的命令行用法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1289 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:39 · PVG 07:39 · LAX 15:39 · JFK 18:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.