我正在查看'os'和'process'模块源代码,似乎没有办法在运行时之前/期间/之后确定node.js进程在哪个核心上运行。
我需要像这样的东西:
我需要像这样的东西:
process.env.CORE_ID //not real
我想确认不同的node.js进程正在不同的核心上运行。虽然操作系统最终选择哪个核心来执行node.js进程,但我们应该能够在操作系统启动进程后读取这些数据,这似乎是合理的。
process.env.CORE_ID //not real
我想确认不同的node.js进程正在不同的核心上运行。虽然操作系统最终选择哪个核心来执行node.js进程,但我们应该能够在操作系统启动进程后读取这些数据,这似乎是合理的。
在任何操作系统中,进程都不会与特定的核心相关联(除了一些面向实时应用场景的操作系统可能会有这种情况)。
处理器(和核心)是可以被分配给任何进程使用的资源。一个线程只能在一个核心上执行一次,但是所有进程都共享核心。操作系统负责将进程调度到可用的核心上执行。因此,当任何进程由于让同一核心内的另一个进程执行(或继续执行)而“暂停”时,没有理由期望该进程下次会在相同的核心上恢复执行。
当您在相对低CPU活动的(多核)机器上运行单个高CPU消耗的进程并执行 htop 时,可以轻微地观察到这一点。然后,您会发现始终有一个高度占用的核心,但它所在的核心会定期更改。
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
此方法适用于Windows和Linux操作系统,但不包括OSX。
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 i.e. process will be allowed to run on cpu0 and cpu1
// returns same mask id success , if failure retuen -1.
console.log(nc.setAffinity(3));