nodejs的express负载均衡(续)

之前写过一篇《nodejs的express负载均衡》,给出了两种方式实现express web服务的nlb。一种是利用nodejs自带的cluster,创建多个worker进程,绑定同一个服务端口,由主进程负责监听和调度;另一种启动多个nodejs实例,每个实例绑定一个不同的端口,在nginx上配置成一个upstream pool由nginx来负责反向代理转发。对用户端来说实现的效果是一样的。不过有一些坑要提醒大家注意下。

如果是在windows环境下,那么nodejs的cluster的调度策略,不像linux环境中默认是轮询,而是啥也没有配置,所以你会发现,总是同一个worker进程在处理请求,代码里加入下面一条语句,可以将调度策略设为轮询:

javascript 复制代码
cluster.schedulingPolicy = cluster.SCHED_RR;

这样就万事大吉了么?还有坑!

nodejs.org官方说,虽然理论上,分发请求策略可以给出最佳性能,但是一个有8个worker的场景中,观察到80%的请求落在2个worker上,并没有实现负载均衡。

究其原因,可能是创建进程时,操作系统并没有将这CPU核数的worker运行在不同的CPU核上。

linux下,有条命令taskset可以将指定pid的进程设置在指定的CPU核上,但是windows下,情况有些复杂,虽然图形界面可以对任务管理器中看到的指定进程设置CPU Affinity,可以使它跑在指定的一个或几个CPU核上,没有好用的系统命令来设置的话,得靠人肉手点。。。

下面附一段python代码调实现将指定进程ID的进程限制在指定CPU核上运行。

python 复制代码
#Usage: python adjpid.py pid cpuid
import win32api, win32con, win32process, sys
pid = int(sys.argv[1])
mask = 2**int(sys.argv[2])
handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid)
win32process.SetProcessAffinityMask(handle, mask)

之所以贴这段python代码,是因为python实现最简单直观,微软是开放了相应接口,但是其他语言开发实现这个功能需要更多的折腾。。。。

好吧,完成了上述工作的话,是不是就好用了么?这也只是完成了轮询,并可以公平地将任务分配到每个CPU核上。

不用nodejs的cluster,用nginx的upstream怎样呢?客观的说,效果会好一些,upstream里有丰富的参数可配置,比如权重,最大失败次数,负载均衡算法等。

另外在程序代码更新发布时,nginx的upstream方式对业务连接会更友好,怎么说呢?你每停掉一个老程序的进程后,启动一个新进程监听刚停掉的那个老进程的端口,依次完成旧程序的下线和新程序的上线,那么几乎不会有业务连接的处理会受到影响。

相关推荐
木头左7 小时前
【Nginx】内网服务源 IP 白名单实战:动态域名解析放行网段 + 端口接管零改造
运维·nginx·白名单·反向代理
Linux-lucky7 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默8 小时前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk81638 小时前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
爱莉希雅&&&10 小时前
GitLab 完整学习笔记
linux·运维·服务器
风笙97810 小时前
[文件系统]文件系统挂载与卸载详解
linux
GeW11 小时前
新质生产力路线图解读:数据库性能优化与Linux调优专场
linux·数据库
陈希12312 小时前
Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位
linux·服务器·网络
用户0873086548714 小时前
用 GUI 自动化写了一个群聊 AI:5 个真实事故,和 7 条让 AI 不像机器人的设计
node.js
测试界的小码农15 小时前
【Linux 命令实战(03):文件创建、复制、移动与删除,掌握 touch、mkdir、cp、mv、rm】
linux·服务器·php