I / O绑定和CPU绑定

喜。

我用Node.JS使用child_process来产生bash进程。 我试图了解,如果我正在做I / O绑定,CPU绑定或两者兼而有之。

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

码:

 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的subprocess吗? 所有的subprocess只在一个内核中运行? 而且,我怎样才能使我的电脑更加柔和地处理文件?

glancer的酷形象:

在这里输入图像描述


Node.JS是由于child_process的使用吗?

在这里输入图像描述

谢谢。

如果您的作业需要CPU,那么要运行的作业的最佳数量通常是内核的数量(如果CPU具有超线程,则是双倍)。 所以如果你有一台4核心的机器,你通常可以通过并行运行4个作业来看到最佳的速度。

但是,现代CPU很大程度上依赖于高速caching。 这使得难以预测并行运行的最佳作业数量。 抛出磁盘的延迟,这将使其更加困难。

我甚至在内核共享CPU高速caching的系统上看到了作业,并且在同一时间运行单个作业的速度更快 – 因为它可以使用完整的CPU高速caching。

由于这个经验,我的build议一直是:措施。

因此,如果您有10k个作业要运行,那么尝试使用不同数量的作业并行运行100个随机作业,以查看最适合您的数量。 随机select是很重要的,所以你也可以测量磁盘的I / O。 如果文件大小差别很大,请运行几次testing。

 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%。 这只是意味着你可以获得所有在电脑商店所花的钱。

如果磁盘caching变慢,你的内存只是一个问题(在你的屏幕截图中,754M不是很低,当它小于100M时就是低),因为这可能会导致你的计算机开始交换 – 这可能会减慢抓取速度。

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