I / O绑定和CPU绑定

时间:2016-06-21 13:18:03

标签: node.js bash io cpu

平。

我正在使用Node.JSchild_process来生成bash进程。我试图理解我是在做I / O绑定,CPU绑定还是两者兼而有之。

我正在使用pdftotext来提取 10k + 文件的文本。为了控制并发,我正在使用async

代码:

let spawn = require('child_process').spawn;
let async = require('async');
let files = [
  {
    path: 'path_for_file'
    ...
  },
  ...
];
let maxNumber = 5;

async.mapLimit(files, maxNumber, (file, callback) => {
  let process = child_process.spawn('pdftotext', [
    "-layout",
    "-enc",
    "UTF-8",
    file.path,
    "-"
  ]);
  let result = '';
  let error = '';

  process.stdout.on('data', function(chunk) {
    result += chunk.toString();
  });

  process.stderr.on('error', function(chunk) {
    error += chunk.toString();
  });

  process.on('close', function(data) {
    if (error) {
      return callback(error, null);
    }
    callback(null, result);
  });


}, function(error, files) {
  if (error) {
    throw new Error(error);
  }

  console.log(files);
});

我正在监视我的Ubuntu用法,当我运行程序时,我的CPU和内存非常高,有时我看到一次只处理一个文件,这是正常的吗?可能是什么问题??

我正在尝试理解child_process的概念。 pdftotextNode.JS的子进程吗?所有子进程只在一个核心中运行?而且,我怎样才能让我的计算机更加软化处理文件?

扫视者的冷酷形象:

enter image description here

由于child_process的问题,这是Node.JS的用法吗?

enter image description here

感谢。

2 个答案:

答案 0 :(得分:7)

如果您的作业处于CPU耗尽状态,那么要运行的最佳作业数通常是核心数(如果CPU具有超线程,则为两倍)。因此,如果你有一台4核机器,你通常可以通过并行运行4个作业来看到最佳速度。

但是,现代CPU严重依赖于缓存。这使得难以预测并行运行的最佳作业数。从磁盘中减少延迟,这将使其变得更加困难。

我甚至在核心共享CPU缓存的系统上看到了作业,并且在一次运行单个作业的速度更快 - 只是因为它可以使用完整的CPU缓存。

由于这种经验,我的建议一直是:测量。

因此,如果要运行10k个作业,请尝试并行运行具有不同作业数的100个随机作业,以查看最佳数量。随机选择很重要,因此您还可以测量磁盘I / O.如果文件大小差异很大,请运行几次测试。

find pdfdir -type f > files
mytest() {
  shuf files | head -n 100 |
    parallel -j $1 pdftotext -layout -enc UTF-8 {} - > out;
}
export -f mytest
# Test with 1..10 parallel jobs. Sort by JobRuntime.
seq 10 | parallel -j1 --joblog - mytest | sort -nk 4

不要担心您的CPU以100%运行。这只意味着你得到了你在电脑商店花的所有钱的回报。

如果磁盘缓存不足,您的RAM只会出现问题(在屏幕截图中754M不低。当它达到< 100M时它很低),因为这可能会导致您的计算机开始交换 - 这可能会导致计算机速度降低爬行。

答案 1 :(得分:0)

您的Node.js代码是I / O绑定的。几乎没有任何CPU工作。您可以在代码中看到您只创建外部任务并移动这些任务的输出。您没有使用长时间运行的循环或繁重的数学计算。您看到Node.js进程的CPU数量很高,因为pdftotext进程是其子进程,因此您看到其CPU值已聚合。