我在查看'os‘和' process’模块源代码,似乎没有一种方法可以确定运行之前/期间/之后运行的node.js进程在哪个核心上运行。
我在找这样的东西:
process.env.CORE_ID //not real我只想确认不同的node.js进程在不同的核心上运行。虽然操作系统最终选择在哪个核心上执行node.js进程,但我们应该能够在操作系统启动进程后读取该数据,这似乎是合理的。
发布于 2015-06-08 06:49:38
在任何操作系统中,进程都不附属于特定的核心(除了某些面向实时的内核)。
处理器(和核心)是可以在任何需要时分配给任何进程的资源。一个线程只能同时在单个内核中执行,但是内核由所有进程共享。操作系统负责在可用内核上调度进程。因此,当任何进程由于允许在同一核心中执行(或继续执行)另一个进程而“暂停”时,没有理由期望该进程在下一次在同一个核心中被恢复。
当您在一个(多核)机器中具有较高cpu占用量的单个进程时,通过简单地执行htop,就可以稍微观察到这一点。然后你可以看到,总是有一个高度占据的核心,但哪个核心是它将定期变化。
发布于 2015-06-13 16:38:26
当你想知道为什么你想知道这类信息的时候,我想我理解你困惑的核心所在。请注意,一个进程可以每毫秒多次切换内核。操作系统对此进行了很好的调度,我无法想象性能是一个需要改进的问题(因为在这种情况下,您将编写自己的OS层,而不是节点)。在运行在内核上的进程和必须在该内核上启动的进程之间绝对不会有明显的延迟,除非可能是在带有自定义操作系统的嵌入式硬件上。
请注意,现代系统甚至可以打开和关闭核心。因此,假设一个具有两个核心和两个节点进程的and服务器为请求提供服务。晚上,当没有太多的工作时,OS关闭了核心2,两个进程都在内核1上愉快地运行,为偶尔的请求服务。然后,当它变得更加繁忙时,操作系统就会启动第二个核心,并且大多数时候,两个节点进程将同时运行,每个节点进程都在自己的核心上运行。但是,请注意,操作系统还有很多其他进程(例如,更新实时时钟)。因此,很有可能是在某个点节点进程A运行在核心1上,节点进程B运行在核心2上。然后核心1用于更新时钟,而核心2仍在运行B。在更新时钟的中途,进程B在核心2上停止,进程A在那里启动。当时钟更新完成后,进程B将在核心1上再次启动,所有这些都发生在不到1微秒的时间内。
因此,在现代架构上,上下文切换每秒发生数百万次,不要担心它们。即使您发现在某个时候,两个节点进程运行在不同的核上,但不能保证这一点在微秒后仍然是正确的。而且,再一次,操作系统可能比你做得更好优化这一点。
现在您可能感兴趣的一件事是,如果不是因为某种原因,这两个进程总是运行在同一个核心上(例如,因为秘密地它们不是两个进程,而是一个进程,例如对同一个节点服务器的不同请求)。这是你只需要检查一次的东西。只需完全加载两个节点实例,并签入top/process /etc,如果它们的CPU组合使用率超过100%。如果是这样的话,您可以假设它们至少能够在不同的内核上运行,并进一步假设操作系统会将它们调度到不同的内核,如果它们从中受益的话。
发布于 2015-06-13 06:25:04
可能的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://stackoverflow.com/questions/30496989
复制相似问题