I/O绑定和CPU绑定

4 io bash cpu node.js

喜.

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

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

码:

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);
});
Run Code Online (Sandbox Code Playgroud)

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

我试图理解child_process的概念.是pdftotext孩子的过程Node.JS吗?所有子进程只在一个核心中运行?而且,我怎样才能让我的计算机处理文件变得更加柔和?

扫视器的酷图像:

在此输入图像描述


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

在此输入图像描述

谢谢.

Ole*_*nge 8

如果您的作业处于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
Run Code Online (Sandbox Code Playgroud)

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

如果磁盘缓存不足,你的RAM只是一个问题(在你的屏幕截图中754M不低.当它<100M时它很低),因为这可能会导致你的计算机开始交换 - 这可能会使它慢慢爬行.