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

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

  •  
  •   torment5524 · 315 天前 · 1291 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近帮一个朋友维护一个网站,建在阿里云上,查看了下负载的峰值都是 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 条附言  ·  314 天前
    咳咳,找到原因了,也不是 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
        1
    rrfeng   315 天前 via Android   ♥ 1
    这个是 nodejs 控制的...
        2
    torment5524   315 天前
    @rrfeng 感谢答复,node.js 没用过,被折腾的不轻。
        3
    a7a2   315 天前   ♥ 1
    nodejs 又不是 python 为何一份代码要开 n 多端口做相同的服务???对开发者能力表示疑问?
        4
    D3EP   315 天前 via iPhone
    @a7a2 node 只能多进程吧,只能这样做
        5
    suconghou   315 天前 via Android   ♥ 1
    node 单个进程就能应对高并发了 但是单个进程不能充分利用多核, node 的运行模型更不适用于 cpu 密集型计算,这些场景下多进程是有必要的 。 猜测是你服务器上有什么管理 node 进程的东西 始终开启和 cpu 核数相同的进程端口号递增 导致的问题
        6
    a7a2   315 天前
    @suconghou 还是写代码那个不行 ,查了一下,nodejs 自从出了多线程支持 cluster 后就能充分利用 cpu 每个核
        7
    ryd994   315 天前 via Android
    @D3EP 多进程又不用多端口。Nginx 还不是多个进程。要效率高的话可以用 reuseport
        8
    janxin   315 天前
    @a7a2 本质上还是起子进程啊...
        9
    suconghou   315 天前
    @a7a2 cluster node 0.6 版本就有了,cluster 就是多进程,node 就没有用户代码的多线程,用 cluster 和启多个进程是一样的,只不多 cluster 也负责了负载均衡,而这里使用了 nginx 负责负载均衡.
        10
    inflationaaron   314 天前 via iPad
    V8 就是单线程引擎,怎么 node.js 就能用上多线程了?除了 async call 是系统用 thread pool 实现的,用户没法自己写多线程的。
        11
    torment5524   314 天前
    @suconghou 用的 pm2 做的管理,我有个小疑问,既然是通过 nginx 启动的多个 node.js 进程,这几个在 js 文件里都是同一个端口,这样没有冲突么,再就是老的业务是访问 17 个端口的,这还少了一个,怎么让 pm2 出啊过 cpu 多开个进程出来。。
        12
    suconghou   314 天前   ♥ 1
    @torment5524 首先,node 进程是 pm2 启动的,不是 nginx; 其次 ,你指出 node 进程是有多少进程就有多少个端口号,那 pm2 就不是以 cluster 模式启动的,应该是 fork 模式,端口号的使用规则要看你的代码或者相关配置,增加进程和减少进程可以参考 pm2 的命令行用法。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4083 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 10:29 · PVG 18:29 · LAX 03:29 · JFK 06:29
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1