确定哪个核心在运行时正在运行Node.js进程

我正在查看“os”和“process”模块源代码,似乎没有一种方法可以确定在运行之前/期间/之后运行node.js进程的核心。

我正在寻找像这样的东西:

process.env.CORE_ID //not real 

我只想确认不同的node.js进程正在不同的核心上运行。 尽pipe操作系统最终select了一个node.js进程在哪个核心上执行,但是我们应该能够在OS启动进程后读取这些数据。

在任何操作系统中,进程都没有附加到特定的内核(除了可能在某些实时操作系统中)。

处理器(和内核)是可以随时分配给任何进程的资源。 一个线程一次只能在一个内核中执行,而内核则由所有进程共享。 操作系统负责调度可用内核上的进程。 所以,当任何进程由于在同一内核中执行(或继续执行)另一个进程而“暂停”时,没有理由期待下一次在同一个内核中恢复进程。

当你通过简单的执行htop,在具有相对较低的cpu活动的(多核)机器中进行单个进程的高CPU占用率时,这是很难察觉的。 那么你可以看到,总是有一个高度被占领的核心,但是它的核心将会经常地改变。

在试图思考为什么你想知道这种信息时,我想我理解你的困惑的核心。 请注意,一个进程可能每毫秒多次切换内核。 操作系统在调度这方面做得非常好,我无法想象性能是一个很大的问题,因此您需要改进(因为在这种情况下,您将编写自己的操作系统层,而不是节点)。 在核心上运行的进程和必须在该核心上启动的进程之间绝对没有可观察的延迟,除了可能在具有自定义OS的embedded式硬件上。

请注意,现代系统甚至可以打开和closures内核。 所以想象一个具有2个核心和2个节点进程的Web服务器为请求服务。 在晚上没有太多工作的情况下,操作系统closures核心2,这两个进程都在核心1上运行愉快,服务于偶尔的请求。 然后当它变得繁忙时,操作系统启动第二个内核,大多数时候两个节点进程将同时运行,每个进程都在自己的内核上运行。 但是请注意,操作系统也有很多其他进程(例如更新实时时钟)。 所以很可能在某一时刻,节点进程A运行在核心1上,节点进程B运行在核心2上。然后核心1被用来更新时钟,而核心2仍然在运行B.然而,通过更新时钟的一半处理B停止在核心2上,处理A在那里开始。 当时钟更新完成后,进程B再次在内核1上启动。所有这些都在不到一微秒的时间内完成。

所以在现代架构中,上下文切换每秒发生数百万次,不用担心。 即使你发现在某个点上2个节点的进程运行在不同的内核上,也不能保证在1微秒之后仍然是这样。 而且,再次,操作系统可能会比你更好地优化这个工作。

现在你可能会感兴趣的事情是知道,如果不是由于某种原因,这两个进程总是在同一个核心上运行(例如,因为秘密,它们不是两个进程,而是一个进程,比如对同一个节点服务器的不同请求) 。 这是你只需要检查一次。 只需加载两个节点实例,并检查顶部/进程资源pipe理器/等,如果他们的综合CPU使用率超过100%。 如果是这样,你可以假设他们至less能够在不同的内核上运行,并且进一步假设操作系统会安排他们到不同的内核,如果他们从中受益的话。

可能的linux方式:

 function getPSR( pid, callback ) { var exec = require('child_process').execSync; var command = 'ps -A -o pid,psr -p ' + pid + ' | grep ' + pid + ' | grep -v grep |head -n 1 | awk \'{print $2}\''; var result = exec( command ); return result.toString("utf-8").trim(); } function getTIDs( pid ) { var exec = require('child_process').execSync; var command = 'ps -mo tid,psr -p ' + pid + ' | grep -v grep | awk \'/[0-9]/ {print("{\\042id\\042 : ", $1, ",\\042psr\\042:", $2, " }," )}\''; var tids = '[ ' + exec(command) + '{"id": false} ]'; return JSON.parse(tids); } function setPSR( pid, psr ) { var exec = require('child_process').execSync; var command = 'taskset -pc ' + psr + ' ' + pid + '; kill -STOP ' + pid + '; kill -CONT ' + pid; var result = exec(command); return result.toString("utf-8").trim(); } function setTIDsPSR( pid, psr ) { var tids = getTIDs(pid); console.log(tids); for (var i in tids) { if (tids[i].id) { console.log( setPSR( tids[i].id, psr ) ); } } } 

试试这个https://www.npmjs.com/package/nodeaffinity

这适用于除OSX以外的基于Windows和Linux的操作系统。

 var nc = require('nodeaffinity'); //Returns the cpus/cores (affinity mask) on which current node process is allowed to run //Failure returns -1 console.log(nc.getAffinity()); //Sets process CPU affinity, here 3 means 011 ie process will be allowed to run on cpu0 and cpu1 // returns same mask id success , if failure retuen -1. console.log(nc.setAffinity(3));