klausph
Goto Top

Gleichzeitiges Ausführen vieler Batche (Diskussion)

Guten Tag allerseits
vielleicht interessiert das den einen oder anderen face-wink
auch ist das thema vielleicht schon mal angerissen worden, aus einem alten thema habe ich schon mal eine wichtige antwort heute bekommen.
so trivial sie ist, auch die erkentnnis, es war mir einiges nicht ganz klar.
also los!


ich habe ca 35 prozesse, die ablaufen müssen!

was macht der kleine klaus? ein skript schreiben:

1. _start.bat inhalt:
call 1.bat
call 2.bat
naja. bis zur 35.bat
das dauert....

im forum hier und in meinem koppe: da war doch was:
also die _start.bat NEU geschrieben:
start "204" /MAX a-204....bat
ca 35 stück!
die letzten beiden mit
start "201" /MIN a-201...bat
start "202" /MIN a-202...bat
[die letzten beiden sind klopper!: 600MB und 1 GB datendateien]


da die hardware kräftig ist, ...
ich will sie mal kurz beschreiben: face-wink
workstation von lenovo: 12x3,4GHZ kerne (XEON); derzeit (!nur! 48GB ram)
schweineteures ram! es ist workstationram (ddr3).
eine SSD NUR für %temp% und %tmp%.
SAS-platten (auf RAID habe ich bewusst verzichtet)

ein virtuelles laufwerk(v:\) nimmt sich 30GB von den 48GB Ram.... ;_)
die ramdisk wird mit WinRam Tech RAMDisk Enterprise (x64) gemacht. sehr gute lösung!, kost aber ca $30-50!

so.
wir haben also SEHR GUTE bedingungen, viele batche GLEICHzeitig ablaufen zulassen.
nö. nicht wirklich!


2. ALSO
_start.bat so geschrieben:
start "204" /MAX a-204....bat
start "203" /MAX a-203...bat
... usw usw usw: ALLES mit /MAX !
die letzten beiden mit /MIN
start "202" /MIN a-202...bat

=NICHT gut!
es tut sich nichts! alle fenster sind schwarz! (übrigens durch /MAX SEHR schön groß!!!!)
gefühlte 50-15 min warten, bis ein fenster losgeht. und sogleich rattern die anderen los!
naja.
irgendwann bei der sichtkontrolle, bemerke, es gibt "lesefehler"!
irgendwelche dateien haben sich nicht gefunden! häch?
geht doch nicht. das MUSS meine supermaschine schaffen!
NEIN, schafft sie nicht! (ram war ausreichend!)


3. DAS ist meine lösung!:

start "204" /MAX a-204-....bat  
timeout /T 5
start "205" /MAX a-205-.....bat  
timeout /T 5
start "207" /MAX a-207-....bat  
timeout /T 5
start "209" /MAX a-209-....bat  
timeout /T 5
start "213" /MAX a-213-...bat  
timeout /T 60
start "214" /MAX a-214-....bat  
timeout /T 5
start "216" /MAX a-216-....bat  
timeout /T 5
start "217" /MAX a-217-....bat  
timeout /T 5
start "219" /MAX a-219-...bat  
timeout /T 5
start "221" /MAX a-221-....bat  
usw usw.

warum so?
erstens wird in jeder bat eine 100mb bis 1GB datei hinundherkopiert. DAS braucht zeit. in max 5 sec ist es erledigt.
d.h. JEDE batchdatei startet mit einem jeweiligen "vorsprunck" von 5sec. es gibt IMMER nur ein fenster, was "gleichzeitig" aufgeht. das klappt. es gbt keine wartezeiten!
nach 5 batchen wird 60 sek. GEWARTET! face-wink das reicht in den meisten fällen, und die angestossenen 5 batchen sind fertsch!
dann können die nächsten kommen! und immer so weiter. face-wink
zum schluss kommen meine klopper! die beiden 600/1GB dateien. die werden genauso wie die anderen mit /MAX gestartet, BZW.: NICHT mit /MIN! d.h. sie dürfen sich mit der normalen rechenpower austoben! und zum schluss sind NUR die beiden prozesse am laufen!


BEI diesem verfahren habe ich NICHT beobachtet:

a. fehler wie: plötzlich keine dateien vorhanden...
b. warten, bis überhaupt 1 fenster den mut hat, zu starten

und wichtig: KEINE pausen, die man wegdrücken muss.

wat sacht Ihr?
mich interessiert: warum das warten bei 2.?
warum arbeiten die skripte NICHT sauber (dateien "verschwinden")
[NEIN: die arbeiten untereinander NICHT mit den selben dateien!]
ist die kraft der workstation doch nicht ausreichend?
[bitte nicht auf LINUX verweisen, habe ich alles da. genug server am laufen.... face-wink ]
????


gruß klaus


info:
es sind ca 8GB an "ascii"-dateien mit höllischen binären zeichen mittendrin.
hier wird kräftig search and replace gemacht (mit einem werkzeug, welches erheblich schneller als PERL oder SED ist. naja. face-wink

Content-ID: 282705

Url: https://administrator.de/contentid/282705

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

122990
122990 13.09.2015 aktualisiert um 19:04:08 Uhr
Goto Top
Hallo Klaus,
die werden genauso wie die anderen mit /MAX gestartet, BZW.: NICHT mit /MIN! d.h. sie dürfen sich mit der normalen rechenpower austoben! und zum schluss sind NUR die beiden prozesse am laufen!
ich glaube du hast da was missverstanden. Die Parameter /MIN und /MAX haben garnichts mit der Prozesspriorität zu tun sondern nur ob das Fenster minimiert oder maximiert ist.
Für die CPU Scheduler-Priorität gibt es die Parameter:
   /LOW         Use IDLE priority class.
   /NORMAL      Use NORMAL priority class.
   /ABOVENORMAL Use ABOVENORMAL priority class.
   /BELOWNORMAL Use BELOWNORMAL priority class.
   /HIGH        Use HIGH priority class.
   /REALTIME    Use Realtime Priorität class
http://ss64.com/nt/start.html

Zusätzlich könntest du hier die Batches mit /Affinity mal auf die logischen Prozessoren verteilen.

Es könnte natürlich auch sein das die Batches(oder das uns unbekannte Tool) mit dem extrem schnellen Aufruf hintereinander, je nachdem was du darin machst erst mal Pufferspeicher allozieren muss was dann erst mal den Effekt hat als würden die Batches hängen.

Wenn dir in den Scripten fehlende Dateien bemängelt werden hast du dort vermutlich keine Checks eingebaut die die Existenz der Dateien prüft ? Oder bestimmte Dateien sind durch vorhergehende Prozesse gesperrt. Wir können hier ja leider nur wilde Vermutungen anstellen was du in deinen Skripten im Detail machst, aber der Grund wird vermutlich irgend ein Befehl/Tool sein was du darin nutzt.

Bau in deine Skripte ein detailliertes Logging ein damit du siehst an welcher Stelle es hakt.
Ein parallel laufendes ProcDump sollte zur Problemfindung ebenfalls beitragen. Zusätzlich auch ProcessExplorer mit seinen detaillierten Performance-Countern.

Ich würde sowas in der heutigen Zeit mit dafür vorgesehenen Tools wie Powershell machen die für parallele Verarbeitung mit Threads und Background-Jobs wesentlich besser geeignet ist und mit der sich die Threads auch überwachen und bei Bedarf neu starten lassen.

Das mit dem Timeout zwischen jeder Batch käme mir persönlich nicht in die Tüte wenn es ein regelmäßiger Job ist.

Gruß grexit
klausph
klausph 13.09.2015 aktualisiert um 20:02:36 Uhr
Goto Top
nur kurz.
es geht nicht darum , daß ich jetzt die skripte hier zeige. sie laufen. es geht um die diskussion, ob man eben 10-30 prozesse zum starten bringen kann/soll. oder ob "meine" lösung brauchbar ist. so. das zur hauptsache.

1. cpu-scheduler-prio: ja, ich hatte /LOW zuerst drin.
max und min sind was anderes.

2.ein script alleine durchläuft. es fehlt ihm nix. wenn sie alle im pulk losrennen, verhaspeln sie sich. ich schrieb (sinngemäß): kein scrip nimmt dem anderen was weg! definitiv. die frage bleibt (ungeklärt bis ich dann zum letzten punkt komme face-wink ) : "warum können unabhängige skripte nicht parallel in großer(?) masse durchlaufen. warum muss ich es auf z.b. 5 stück reduzieren?

3. "Pufferspeicher allozieren". danke GUTER hinweis. das erklärt es! DANKE!

4. tja, wer einen nortoncommander oder nachfolger benutzt, sieht sehr viel hinter den kulissen. das logging erspare ich mir. WENN, dann wende ich das an: _algruck.bat %1 1>%1_output.txt 2>&1

5. für die wichtigsten vorzukommenden dateien sind checks drin, ebenso für die wichtigsten dateien, die DABEI erzeugt werden.


-> was bitte ist /AFFINITY .
die erklärung auf ss65 bringt ,mir leider nix.

hm. die online-hilfe: bei w7 verstehe ich es etwas besser:
/affinity <HexAffinity>
Applies the specified processor affinity mask (expressed as a hexadecimal number) to the new application.

hm. dumme(?) frage(n)
a. ist das betr.system zu dämlich, es alleine zu verteilen?
b. wie adressiert man prozessoren oder besser die "kerne"ß

ok, als hex. steht da!
also 1. kern = \x30
bis 12. kern = \x3b
schreibt man also:
batch..... /affinity 30
...
batch..... /affinity 3b

? (muss ich wohl ausprobieren! face-wink

HIER ist eine schreibhilfe:
http://blogs.msdn.com/b/santhoshonline/archive/2011/11/24/how-to-launch ...

danke und gruß.
klaus