2016-06-21 6 views
4

Hei.I/O gebunden und CPU gebunden

Ich verwende Node.JS mit child_process, um Bash-Prozesse zu spawnen. Ich versuche zu verstehen, ob ich I/O-gebunden, CPU-gebunden oder beides mache.

Ich benutze pdftotext, um den Text 10k + Dateien zu extrahieren. Um Übereinstimmungen zu kontrollieren, benutze ich async.

Code:

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); 
}); 

Ich überwache meine Ubuntu-Nutzung und meine CPU und Speicher sind sehr hoch, wenn ich das Programm ausführen, und auch manchmal sehe ich nur eine Datei zu einem Zeitpunkt verarbeitet wird, ist dies normal?? Was könnte das Problem sein?

Ich versuche das Konzept von child_process zu verstehen. Ist pdftotext ein Kindprozess von Node.JS? Alle untergeordneten Prozesse werden nur in einem Kern ausgeführt? Und wie kann ich die Dateien für meinen Computer weicher machen?

Kühles Bild von Glancer:

enter image description here


Ist diese Verwendung von Node.JS wegen der child_process ist ??

enter image description here

Dank.

+1

'pdftotext' scheint CPU-intensiv zu sein. Mit einer 2-Kern-Maschine können nur 2 CPU-gebundene Prozesse gleichzeitig auf Ihrem Rechner ausgeführt werden. Eine Möglichkeit, um mehr Fortschritte bei Ihrer Arbeit zu erzielen, besteht darin, nur "pdftotext" -Aufträge der CPU gleichzeitig zu erstellen. – dm03514

+1

Ich denke, ich mache das mit async.eachLimit, ich spawning nur 5 Prozesse auf einmal, oder ich falsch liegen? –

Antwort

6

Wenn Ihre Jobs CPU-hungrig sind, ist die optimale Anzahl der auszuführenden Jobs normalerweise die Anzahl der Kerne (oder das Doppelte, wenn die CPUs über Hyperthreading verfügen). Wenn Sie also eine 4-Kern-Maschine haben, sehen Sie normalerweise die optimale Geschwindigkeit, wenn Sie 4 Jobs parallel ausführen.

Moderne CPUs sind jedoch stark abhängig von Caches. Dies macht es schwierig, die optimale Anzahl von Jobs vorherzusagen, die parallel ausgeführt werden. Werfen Sie die Latenz von den Festplatten auf und es wird es noch schwieriger machen.

Ich habe sogar Aufträge auf Systemen gesehen, in denen die Kerne den CPU-Cache freigegeben haben und wo es schneller war, einen einzelnen Auftrag gleichzeitig auszuführen - einfach weil er dann den vollen CPU-Cache verwenden konnte.

Aufgrund dieser Erfahrung war mein Rat immer: Maßnahme.

Wenn also 10k Jobs ausgeführt werden sollen, versuchen Sie es mit 100 zufälligen Jobs mit verschiedenen Jobs parallel, um zu sehen, welche die optimale Anzahl für Sie ist. Es ist wichtig, nach dem Zufallsprinzip zu wählen, damit Sie auch die Festplatten-E/A messen können. Wenn sich die Dateien stark unterscheiden, führen Sie den Test einige Male aus.

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 

Mach dir keine Sorgen, dass deine CPUs zu 100% laufen. Das bedeutet nur, dass Sie für all das Geld, das Sie im Computerladen ausgegeben haben, eine Rendite bekommen.

Ihr RAM ist nur ein Problem, wenn der Festplattencache knapp wird (In Ihrem Screenshot 754M ist nicht niedrig. Wenn es < 100M ist, ist es niedrig), denn das kann dazu führen, dass Ihr Computer zu tauschen - was kann es verlangsamen ein Kriechen.

0

Ihr Node.js-Code ist I/O-gebunden. Es macht fast keine CPU-Arbeit.Sie können in Ihrem Code sehen, dass Sie nur externe Aufgaben erstellen und die Ausgabe dieser Aufgaben verschieben. Sie verwenden keine lang laufenden Schleifen oder schwere mathematische Berechnungen. Sie sehen hohe CPU-Nummern für den Node.js-Prozess, da es sich bei den pdftotext-Prozessen um untergeordnete Prozesse handelt. Daher werden die CPU-Werte aggregiert angezeigt.

Verwandte Themen