Performanceprobleme grep/pipe mit 10.3 viel langsamer als mit Suse 9.2
Hallo alle, ich hätte da mal ein Problem, mein alter, in die Jahre gekommener 9.2er Server ist viel schneller als der neue, Doppelkern-Server mit OpenSuse 10.3 drauf, ich habe da einige echt fiese Auswertungen mit grep | sort|uniq|wc undsoweiter und das ist einfach nur laaaangsam auf 10.3... Ich habe mal ein paar Ausgaben angehängt, die Zeiten ändern sich nicht wirklich mit 10.3, egal ob das Logfile vom Raid6, vom Raid1 oder auch per NFS vom alten Server gelesen wird. Kann das evtl. AppArmor oder so etwas sein? Das der Hauptspeicher (Lesen aus dem Cache) langsamer ist schiebe ich mal großzügig auf die Doppelkern-CPU... Ich hoffe, das der neue Server mit mehr als 2x1000 MHz unterwegs ist und der Wert nur beim Booten so niedrig ist? Braucht noch jemand mehr Auswertungen oder hat Vorschläge? Besten Dank, Christian Salzer Alter Server: cat /proc/version Linux version 2.6.8-24.25-default (geeko@buildhost) (gcc version 3.3.4 (pre 3.3.5 20040809)) #1 Thu Aug 24 09:57:32 UTC 2006 cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 31 model name : AMD Athlon(tm) 64 Processor 3200+ stepping : 0 cpu MHz : 2009.190 cache size : 512 KB fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 pni syscall nx mmxext lm 3dnowext 3dnow bogomips : 3981.31 TLB size : 1088 4K pages clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: ts fid vid ttp cat /proc/meminfo MemTotal: 2055780 kB MemFree: 174800 kB Buffers: 129004 kB Cached: 1459328 kB mit einem 3ware 7500-8 Port Kontroller und folgendem Durchsatz hdparm -t /dev/sda /dev/sda: Timing buffered disk reads: 162 MB in 3.03 seconds = 53.47 MB/sec hdparm -T /dev/sda /dev/sda: Timing cached reads: 3072 MB in 2.00 seconds = 1533.93 MB/sec braucht für ein folgende Befehlsgruppe nur ein Augenblick: time cat /data/mail-testlog | grep "@sonst-eine-domain.de"|grep "smtpd"|grep "Nov 18"|grep "5.1.1" -v |grep "5.7.1" -v >/dev/nul real 0m1.039s user 0m0.559s sys 0m0.028s ls -la /data/mail-testlog -rw-rw----+ 1 root root 7167507 Nov 20 17:01 /data/mail-testlog Der neue Server: cat /proc/version Linux version 2.6.22.12-0.1-default (geeko@buildhost) (gcc version 4.2.1 (SUSE Linux)) #1 SMP 2007/11/06 23:05:18 UTC cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 35 model name : Dual Core AMD Opteron(tm) Processor 180 stepping : 2 cpu MHz : 1000.000 cache size : 1024 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy bogomips : 2011.52 TLB size : 1024 4K pages clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: ts fid vid ttp (Ausgabe x2 wg. 2 Kernen) cat /proc/meminfo MemTotal: 4051560 kB MemFree: 266852 kB Buffers: 120416 kB Cached: 2757832 kB mit einem 3Ware 9650-8 und folgendem hdparm-Wert hdparm -t /dev/sdb /dev/sdb: Timing buffered disk reads: 238 MB in 3.02 seconds = 78.89 MB/sec hdparm -T /dev/sdb /dev/sdb: Timing cached reads: 1630 MB in 2.00 seconds = 815.69 MB/sec Braucht eine grosse Ewigkeit... time cat /data/mail-testlog | grep "@sonst-eine-domain.de"|grep "smtpd"|grep "Nov 18"|grep "5.1.1" -v |grep "5.7.1" -v >/dev/nul real 0m7.945s user 0m8.309s sys 0m0.044s -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Christian, Christian Salzer schrieb:
Hallo alle,
Alter Server: cat /proc/version Linux version 2.6.8-24.25-default (geeko@buildhost) (gcc version 3.3.4 (pre 3.3.5 20040809)) #1 Thu Aug 24 09:57:32 UTC 2006
cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 31 model name : AMD Athlon(tm) 64 Processor 3200+ stepping : 0 cpu MHz : 2009.190 cache size : 512 KB fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 pni syscall nx mmxext lm 3dnowext 3dnow bogomips : 3981.31 TLB size : 1088 4K pages clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: ts fid vid ttp
cat /proc/meminfo MemTotal: 2055780 kB MemFree: 174800 kB Buffers: 129004 kB Cached: 1459328 kB
mit einem 3ware 7500-8 Port Kontroller und folgendem Durchsatz
hdparm -t /dev/sda
/dev/sda: Timing buffered disk reads: 162 MB in 3.03 seconds = 53.47 MB/sec
hdparm -T /dev/sda
/dev/sda: Timing cached reads: 3072 MB in 2.00 seconds = 1533.93 MB/sec
braucht für ein folgende Befehlsgruppe nur ein Augenblick:
time cat /data/mail-testlog | grep "@sonst-eine-domain.de"|grep "smtpd"|grep "Nov 18"|grep "5.1.1" -v |grep "5.7.1" -v >/dev/nul
real 0m1.039s user 0m0.559s sys 0m0.028s
ls -la /data/mail-testlog -rw-rw----+ 1 root root 7167507 Nov 20 17:01 /data/mail-testlog
Der neue Server: cat /proc/version Linux version 2.6.22.12-0.1-default (geeko@buildhost) (gcc version 4.2.1 (SUSE Linux)) #1 SMP 2007/11/06 23:05:18 UTC ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 35 model name : Dual Core AMD Opteron(tm) Processor 180 stepping : 2 cpu MHz : 1000.000 cache size : 1024 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy bogomips : 2011.52 TLB size : 1024 4K pages clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: ts fid vid ttp (Ausgabe x2 wg. 2 Kernen)
cat /proc/meminfo MemTotal: 4051560 kB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
MemFree: 266852 kB Buffers: 120416 kB Cached: 2757832 kB
Kann das sein, dass du den verkehrten Kernel im Einsatz hast? Ich hab hier mal gelesen, dass ab 4GB Speicher der -64GB Kernel verwendet werden sollte, da ja ab 3GB der Speicher oberhalb 4GB geremappt wird (werden sollte). Mangels vergleichbarer potenter Maschinchen hab ich diesbezüglich allerdings keinerlei praktische Erfahrung. Gruß Manfred -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am 20.11.07 schrieb Manfred Kreisl <ml4km@starnberg-mail.de>:
cat /proc/meminfo MemTotal: 4051560 kB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
MemFree: 266852 kB Buffers: 120416 kB Cached: 2757832 kB
Kann das sein, dass du den verkehrten Kernel im Einsatz hast? Ich hab hier mal gelesen, dass ab 4GB Speicher der -64GB Kernel verwendet werden sollte, da ja ab 3GB der Speicher oberhalb 4GB geremappt wird (werden sollte).
Blöde Frage: Sollte das Yast bei der Installation nicht merken? Ich hatte mal den big-smp probiert, aber da hat sich irgendwie gar nichts bewegt. Und weil es eine 64bit Maschine ist, mit einem 64bit-Kernel ging/gehe ich davon aus, das es keine (Win-Like) Probleme mit mehr Speicher als 3 GB gibt, lasse mich aber gerne eines besseren belehren, werde vielleicht am Wochenende doch noch mal versuchen, bigsmp ans rennen zu bringen...
Mangels vergleichbarer potenter Maschinchen hab ich diesbezüglich allerdings keinerlei praktische Erfahrung.
Gruß Manfred --
Grüsse, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Dienstag, 20. November 2007 17:25 schrieb Christian Salzer:
Hallo alle,
ich hätte da mal ein Problem, mein alter, in die Jahre gekommener 9.2er Server ist viel schneller als der neue, Doppelkern-Server mit OpenSuse 10.3 drauf, ich habe da einige echt fiese Auswertungen mit grep | sort|uniq|wc undsoweiter und das ist einfach nur laaaangsam auf 10.3... Ich habe mal ein paar Ausgaben angehängt, die Zeiten ändern sich nicht wirklich mit 10.3, egal ob das Logfile vom Raid6, vom Raid1 oder auch per NFS vom alten Server gelesen wird. Kann das evtl. AppArmor oder so etwas sein? Glaube ich nicht
Das der Hauptspeicher (Lesen aus dem Cache) langsamer ist schiebe ich mal großzügig auf die Doppelkern-CPU... Warum? Die sollte da nicht langsamer sein. Ich bin mir auch nicht sicher, ob die "cached reads" nicht eher das Lesen aus dem Platten- oder Controller-Cache betrifft. Und gerade da dürfte eine solche Auswertung recht empfindlich sein. Ich hatte mal einen solchen Hightec-Server, bei dem die Controller-Batterie leer war - der verhielt sich auch so, weil der Controller Cache sich nicht mehr einschalten ließ.
Ich hoffe, das der neue Server mit mehr als 2x1000 MHz unterwegs ist und der Wert nur beim Booten so niedrig ist?
Braucht noch jemand mehr Auswertungen oder hat Vorschläge? Filesystem? Bis 9.3 war wohl ReiserFs Standard, jetzt ext3. Das ist nicht unbedingt schlechter als Reiser, aber könnte sich in bestimmten Situationen ganz anders verhalten. Na gut, beim Lesen vom alten Server ist das vielleicht nicht ganz so wichtig...
Gruß Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Christian, /proc/cpuinfo gibt die aktuelle Frequenz der CPU aus. Bei meinem AMD 64X2 5000+ auch 1000 MHZ. Gebe ich ihm aber Last, geht er auf 2600 MHz rauf. Schau mal nach /proc/cpuinfo, wenn Dein Pipe-Kommando läuft. Vielleicht zeigt uns das schon was. Tschö, Emil Am Dienstag 20 November 2007 17:25:21 schrieb Christian Salzer:
Hallo alle,
ich hätte da mal ein Problem, mein alter, in die Jahre gekommener 9.2er Server ist viel schneller als der neue, Doppelkern-Server mit OpenSuse 10.3 drauf, ich habe da einige echt fiese Auswertungen mit grep | sort|uniq|wc undsoweiter und das ist einfach nur laaaangsam auf 10.3... Ich habe mal ein paar Ausgaben angehängt, die Zeiten ändern sich nicht wirklich mit 10.3, egal ob das Logfile vom Raid6, vom Raid1 oder auch per NFS vom alten Server gelesen wird. Kann das evtl. AppArmor oder so etwas sein?
Das der Hauptspeicher (Lesen aus dem Cache) langsamer ist schiebe ich mal großzügig auf die Doppelkern-CPU...
Ich hoffe, das der neue Server mit mehr als 2x1000 MHz unterwegs ist und der Wert nur beim Booten so niedrig ist?
Braucht noch jemand mehr Auswertungen oder hat Vorschläge? ...
-- Registered Linux User since 19940320 -------------------------------------------------- Emil Stephan, Marktplatz 39, 53773 Hennef, Germany voice: +49-2242-84438 Accelerate Windows: 9.81 m/sec^2 would be adequate -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am 20.11.07 schrieb Emil Stephan <Emil.Stephan@t-online.de>:
Hallo Christian,
/proc/cpuinfo gibt die aktuelle Frequenz der CPU aus. Bei meinem AMD 64X2 5000+ auch 1000 MHZ. Gebe ich ihm aber Last, geht er auf 2600 MHz rauf. Schau mal nach /proc/cpuinfo, wenn Dein Pipe-Kommando läuft. Vielleicht zeigt uns das schon was.
Tschö, Emil
Danke für den Tip, nachdem ich im richtig habe rechnen lassen, ist cpuinfo auch auf die korrekten 2400 MHz hochgegangen... Wegen ein bisschen grep hat da anscheinend noch kein Scheduler mehr Takte bestellt... CPU schonmal OK! Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Die, 20 Nov 2007, Christian Salzer schrieb: [alter Rechner]
/dev/sda: Timing cached reads: 3072 MB in 2.00 seconds = 1533.93 MB/sec [.. neuer Rechner] /dev/sdb: Timing cached reads: 1630 MB in 2.00 seconds = 815.69 MB/sec
Die "cached reads" lesen aus dem Hauptspeicher, daher schein mir das mit dem flaschen Kernel für deine 4 GB Hauptspeicher zutreffend.
time cat /data/mail-testlog | grep "@sonst-eine-domain.de"|grep "smtpd"|grep "Nov 18"|grep "5.1.1" -v |grep "5.7.1" -v >/dev/nul
Ansonsten ist deine Pipe-Konstruktion natürlich auch nicht gut. Und das 'cat' ist überflüssig. time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog \ | grep -v '5\.[17]\.1' > /dev/null Die Reihenfolge der Elemente ggfs. korrigieren. Mit einigen Beispiel-Zeilen könnte man das evtl. noch weiter optimieren. -dnh --
Stimmt es, daß die Bundeswehr dumm, gleichgültig und aggressiv macht? Weis ich nicht, ist mir auch egal, und wenn Du weiter so dumme Fragen stellst gibts eine aufs Maul. -- M. Kaufmann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am 20.11.07 schrieb David Haller <lists@dhaller.de>:
Hallo,
Am Die, 20 Nov 2007, Christian Salzer schrieb: [alter Rechner]
/dev/sda: Timing cached reads: 3072 MB in 2.00 seconds = 1533.93 MB/sec [.. neuer Rechner] /dev/sdb: Timing cached reads: 1630 MB in 2.00 seconds = 815.69 MB/sec
Die "cached reads" lesen aus dem Hauptspeicher, daher schein mir das mit dem flaschen Kernel für deine 4 GB Hauptspeicher zutreffend.
time cat /data/mail-testlog | grep "@sonst-eine-domain.de"|grep "smtpd"|grep "Nov 18"|grep "5.1.1" -v |grep "5.7.1" -v >/dev/nul
Ansonsten ist deine Pipe-Konstruktion natürlich auch nicht gut. Und das 'cat' ist überflüssig.
Das rührte daher, das es ursprünglich eine von logrotate schon weggeräumte Datei war, und es eigentlich ein bzcat war, da aber auf der alten Maschine ein zcat war, habe ich es halt mit der ausgepackten Datei gemacht.
time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog \ | grep -v '5\.[17]\.1' > /dev/null
Da war wieder mein Problem mit diesen verdammten regex, die ich schon vor einiger Zeit mal unters Kopfkissen legen wollte... OK, ist schneller, muss ich zugeben, Alter 9.2er time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog | grep -v '5\.[17]\.1' > /dev/null real 0m0.010s user 0m0.005s sys 0m0.005s 10.3er time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog | grep -v '5\.[17]\.1' > /dev/null real 0m0.806s user 0m0.796s sys 0m0.016s
Die Reihenfolge der Elemente ggfs. korrigieren. Mit einigen Beispiel-Zeilen könnte man das evtl. noch weiter optimieren.
-dnh
Das war auch nur eine Beispielzeile... Eigentlich ist das eher so ein Monstrum (eine Auswertung von ca. 20): /usr/bin/grep -i "@salzer-online." /var/log/mail|/usr/bin/grep -f /etc/greps/error_50x | /usr/bin/grep -i "`printf "%s %2d" $cs_datum_monat $cs_datum_tag`" | /usr/bin/cut -f 4 -d "<"| /usr/bin/cut -f 1 -d ">"| /usr/bin/sort| /usr/bin/uniq -c | /usr/bin/sort | /usr/bin/tail -n 20 Aber, das Script lief die letzten Jahre immer fein, und nur wenn wieder eine Backscatter-Welle auf den Server hereingebrochen war mit
10000 Rejects/24h, hat es halt vielleicht länger gedauert, aber jetzt ist die Wartezeit auf ca. 20 solche greppes'-Monster einfach zu hoch, um mal schnell nach dem "rechten" zu sehen.
BTW: Gibt es einen "einfacheren" Weg, das Postfix-Log nur nach dem aktuellen Datum zu durchsuchen? Ich habe am Anfang des Scriptes folgendes stehen: #!/bin/sh cs_datum_tag=`/bin/date |/usr/bin/cut -f 3 -d " "` cs_datum_monat=`/bin/date |/usr/bin/cut -f 2 -d " "` test -z "$cs_datum_tag" && cs_datum_tag=`/bin/date |/usr/bin/cut -f 4 -d " "` Aber danke schonmal für den obigen Hinweis, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Die, 20 Nov 2007, Christian Salzer schrieb:
Am 20.11.07 schrieb David Haller <lists@dhaller.de>: [..]
Ansonsten ist deine Pipe-Konstruktion natürlich auch nicht gut. Und das 'cat' ist überflüssig.
Das rührte daher, das es ursprünglich eine von logrotate schon weggeräumte Datei war, und es eigentlich ein bzcat war, da aber auf der alten Maschine ein zcat war, habe ich es halt mit der ausgepackten Datei gemacht.
bzgrep ;) Aber das geht schon.
time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog \ | grep -v '5\.[17]\.1' > /dev/null
Da war wieder mein Problem mit diesen verdammten regex, die ich schon vor einiger Zeit mal unters Kopfkissen legen wollte...
OK, ist schneller, muss ich zugeben,
Alter 9.2er time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog | grep -v '5\.[17]\.1' > /dev/null
real 0m0.010s user 0m0.005s sys 0m0.005s
Das is ein bisserl wenig. Hast du das Ergebnis mal geprüft?
10.3er time grep 'Nov 18.*smtpd.*@sonst-eine-domain\.de' /data/mail-testlog | grep -v '5\.[17]\.1' > /dev/null
real 0m0.806s user 0m0.796s sys 0m0.016s
Hui. Das hat sich ja schon gelohnt ;)
Das war auch nur eine Beispielzeile...
Eigentlich ist das eher so ein Monstrum (eine Auswertung von ca. 20): /usr/bin/grep -i "@salzer-online." /var/log/mail|/usr/bin/grep -f /etc/greps/error_50x | /usr/bin/grep -i "`printf "%s %2d" $cs_datum_monat $cs_datum_tag`" | /usr/bin/cut -f 4 -d "<"| /usr/bin/cut -f 1 -d ">"| /usr/bin/sort| /usr/bin/uniq -c | /usr/bin/sort | /usr/bin/tail -n 20
Sowas ist ein Fall für awk oder perl. Was steht in /etc/greps/error_50x? Und ein paar (reale) Beispielzeilen wären gut.
BTW: Gibt es einen "einfacheren" Weg, das Postfix-Log nur nach dem aktuellen Datum zu durchsuchen? Ich habe am Anfang des Scriptes folgendes stehen: [..] cs_datum_tag=`/bin/date |/usr/bin/cut -f 3 -d " "` cs_datum_monat=`/bin/date |/usr/bin/cut -f 2 -d " "`
test -z "$cs_datum_tag" && cs_datum_tag=`/bin/date |/usr/bin/cut -f 4 -d " "`
RTFM hilft: man date / info date cs_datum_tag=`date '+%d'` cs_datum_monat=`date '+%m'` Oder gleich: ==== LANG=C awk ' BEGIN { FS="[<>]"; IGNORECASE=1; today = strftime("%b %d", systime()); re = today ".*smtpd.*@salzer-online\.de"; } $0 ~ re { adrs[$2]++; } END { for (a in adrs) { printf "%i %s\n", adrs[a], a; }; }' /var/log/mail | sort -n | tail -n 20 ==== Die Regex "re" beim awk muß noch verfeinert werden, v.a. um das, was bei dir in /etc/greps/error_50x steht... Das ganze Awk-Zeugs kannste auch in ein awk-script verpacken. Fragen? -dnh -- 102: Code Reuse (cat a.out_header; cat) > a.out (Enno Rehling) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
* Christian Salzer wrote on Tue, Nov 20, 2007 at 21:09 +0100:
Da war wieder mein Problem mit diesen verdammten regex, die ich schon vor einiger Zeit mal unters Kopfkissen legen wollte...
BTW, | ist immer langsam wegen fork()/exec(). So eine bash kann selbst aber schon verdammt viel: steffen@link:~> for ((i=0; i<10; i++)) ; do echo -n $i ; done ; echo 0123456789 (zählen) steffen@link:~> echo $((2*3)) 6 (rechnen) steffen@link:~> echo $[1 > 2] aber $[1 < 2] 0 aber 1 (auswerten) steffen@link:~> p="123456790" steffen@link:~> echo $p 123456790 (für die Beispiele) steffen@link:~> echo ${p:1:3} 234 steffen@link:~> echo ${p:5:2} 67 (substring kann ein cut sparen) steffen@link:~> echo ${p/2??5/abcd} 1abcd6790 (replace, kann neben ? auch * und mehr :) - recht mächtig) steffen@link:~> echo ${p/2[23][234]5*7/ $((100*5)) } 1 500 90 (replace mit rechnen usw geht natürlich auch. Wieso kommt 9 nach 7?!) steffen@link:~> echo ${#p} 9 (ups, da fehlt ja die 8) steffen@link:~> p="1234567890" steffen@link:~> echo ${#p} 10 (:-) Jetzt sinds 10 Zeichen.) steffen@link:~> echo ${p#*3} 4567890 (cut bis einschliesslich Zeichen 3) steffen@link:~> echo ${p%3*} 12 (cut ab einschliesslich Zeichen 3) Das beides sieht vielleicht komisch aus, ist aber nützlich, kann z.B. ein basename oder dirname sparen: steffen@link:~> p="/usr/bin/perl" steffen@link:~> echo ${p##*/} perl ("${path##*/}" kann man sich merken, finde ich, kann man öfter mal brauchen, ist aber leider wenig intuitiv, finde ich.) So kriegt man auch Wort-weises cutten hin (mit "* " und so): steffen@link:~> echo \"$p\" "ein paar worte als string" steffen@link:~> echo \"${p#* * }\" "worte als string" ("* * " matcht auf "ein paar " minimal und cuttet das weg) Das geht mit Arrays natürlich einfacher: steffen@link:~> declare -a arr (ein array "arr", wäre /hier/ gar nicht notwendig) steffen@link:~> arr=($p) (macht word-splitting) teffen@link:~> echo ${arr[2]} - ${arr[1]} - ${arr[0]} worte - paar - ein (bei sowas muss ich öfter mal nachgucken und probieren, hilft aber oft ganz nett) Das ist auch schreibbar: steffen@link:~> arr[0]=zwei ; arr[1]="Paar" steffen@link:~> echo ${arr[@]} zwei Paar worte als string (Array `wortweise' verwenden) steffen@link:~> unset arr[1+1-1] (kann auch Rechnen etc) steffen@link:~> echo ${arr[*]} zwei worte als string (Array als ein Wort verwenden; nicht zu verwechseln mit echo ${arr[@]}, was /hier/ gleich aussieht) Ich hab mal ein paar Beispiele aufgeschrieben, weil ich früher die bash manpage schwer verständlich fand (gut, ich find sie immer noch schwer verständlich) und das früher alles gar nicht kannte / genutzt hatte. Vielleicht hilft jemandem das eine oder andere ja mal. bash kann auch Funktionen und Blöcke pipen etc: steffen@link:~> p=$( echo hallo ) ; q=H${p:1:3}O ; echo $p - $q hallo - HallO (weiss jemand, ob das wirklich ohne fork() gemacht wird? müsste eigentlich, oder?) steffen@link:~> echo $( echo "start in $(pwd)"; ( cd /tmp && pwd ); echo "back in $(pwd)" ) start in /home/steffen /tmp back in /home/steffen na ja usw. oki, Steffen -- Dieses Schreiben wurde maschinell erstellt, es trägt daher weder Unterschrift noch Siegel. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mit, 21 Nov 2007, Steffen Dettmer schrieb: [..] Schöne Zusammenfassung soweit :) Eines solltest du dir aber noch angewöhnen: Variablen IMMER "so viel wie möglich" zu quoten. Und nicht so wenig wie möglich. Also wenn du z.B.: echo "${arr[@]}" schreiben kannst, dann verwende die "" um die Variablen. Und wenn du '' statt "" verwenden kannst, dann nimm die ''. Das macht das Leben als Shellprogrammierer einfacher. Aufpassen muß man auch mit '' und "" noch genug.
steffen@link:~> p=$( echo hallo ) ; q=H${p:1:3}O ; echo $p - $q hallo - HallO
(weiss jemand, ob das wirklich ohne fork() gemacht wird? müsste eigentlich, oder?)
Im Zweifelsfall mal 'strace -f -eprocess' drauf ansetzen:
steffen@link:~> echo $( echo "start in $(pwd)"; ( cd /tmp && pwd ); echo "back in $(pwd)" ) start in /home/steffen /tmp back in /home/steffen
strace -f -eprocess bash -c '\ echo $( echo "start in $(pwd)"; ( cd /tmp && pwd ); echo "back in $(pwd)" )' Ja, die bash forkt hier. u.a. wg. der subshell für die (). Vgl. z.B.: strace -f -eprocess bash -c '\ echo "start in $(pwd)"; { cd /tmp && pwd; }; echo "back in $(pwd)"' -- 281: Personal Firewall Warum installieren Sie sich ein Programm, mit dessen Ausgaben Sie dann nichts anzufangen wissen? (T-Online-Team) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
* David Haller wrote on Thu, Nov 22, 2007 at 04:11 +0100:
Schöne Zusammenfassung soweit :)
THX :)
Eines solltest du dir aber noch angewöhnen: Variablen IMMER "so viel wie möglich" zu quoten. Und nicht so wenig wie möglich.
Also wenn du z.B.:
echo "${arr[@]}"
schreiben kannst, dann verwende die "" um die Variablen.
Ja, super, genau, ganz wichtiger Hinweis. Als Kurzform zum Merken finde ich folgendes Klasse: echo "$@" (das sind alle Parameter "so wie sie waren") Kann man gut mit einem Script probieren, was aus /bin/echo "$@" besteht (aufruf mit "--version" " --version" und "--version " usw).
steffen@link:~> p=$( echo hallo ) ; q=H${p:1:3}O ; echo $p - $q hallo - HallO
(weiss jemand, ob das wirklich ohne fork() gemacht wird? müsste eigentlich, oder?)
Im Zweifelsfall mal 'strace -f -eprocess' drauf ansetzen:
(da wird also wirklich nicht geforkt, weil echo als build-in gefunden wird und $(command) schlau ist und für build-ins nicht fork? Hammergeil! Muss man mal drüber meditieren, wie kompliziert das ist und es funktioniert trozdem!)
steffen@link:~> echo $( echo "start in $(pwd)"; ( cd /tmp && pwd ); echo "back in $(pwd)" ) start in /home/steffen /tmp back in /home/steffen
strace -f -eprocess bash -c '\ echo $( echo "start in $(pwd)"; ( cd /tmp && pwd ); echo "back in $(pwd)" )'
Ja, die bash forkt hier. u.a. wg. der subshell für die ().
(Ja, das das forkt ist klar, das war ja genau der Grund für die (), damit das "cd" lokal bleibt. "{ pushd /tmp && ; popd }" seh ich oft, aber auch oft versagen :)) oki, Steffen -- Dieses Schreiben wurde maschinell erstellt, es trägt daher weder Unterschrift noch Siegel. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hi, 20.11.2007 17:25,, Christian Salzer wrote::
Hallo alle,
ich hätte da mal ein Problem, mein alter, in die Jahre gekommener 9.2er Server ist viel schneller als der neue, Doppelkern-Server mit OpenSuse 10.3 drauf, ich habe da einige echt fiese Auswertungen mit grep | sort|uniq|wc undsoweiter und das ist einfach nur laaaangsam auf 10.3... Ich habe mal ein paar Ausgaben angehängt, die Zeiten ändern sich nicht wirklich mit 10.3, egal ob das Logfile vom Raid6, vom Raid1 oder auch per NFS vom alten Server gelesen wird. Kann das evtl. AppArmor oder so etwas sein?
Das der Hauptspeicher (Lesen aus dem Cache) langsamer ist schiebe ich mal großzügig auf die Doppelkern-CPU...
Extrem unwahrscheinlich. Eher wohl: ...
Der neue Server: cat /proc/version Linux version 2.6.22.12-0.1-default (geeko@buildhost) (gcc version 4.2.1 (SUSE Linux)) #1 SMP 2007/11/06 23:05:18 UTC
ehm... bigsmp dürfte besser passen.
cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 35 model name : Dual Core AMD Opteron(tm) Processor 180 stepping : 2 cpu MHz : 1000.000
Das ist immer der aktuelle Wert. Im Hintergrund mut bc irgendwas auf einige zehntausend Stellen rechnen lassen, und hier dürfte mehr stehen :-)
cache size : 1024 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy bogomips : 2011.52
Interessant... ein 2216HE bringt 2001 bogomips.
TLB size : 1024 4K pages clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: ts fid vid ttp (Ausgabe x2 wg. 2 Kernen)
cat /proc/meminfo MemTotal: 4051560 kB MemFree: 266852 kB Buffers: 120416 kB Cached: 2757832 kB
mit einem 3Ware 9650-8 und folgendem hdparm-Wert
hdparm -t /dev/sdb
/dev/sdb: Timing buffered disk reads: 238 MB in 3.02 seconds = 78.89 MB/sec
Hab' keinen 3Ware-Controller, aber das ist nicht so viel wie ich erwarten würde. Was sind denn da für Platten dran? Aber ich denke das ist nichts was in deiner Testpipe stören dürfte.
hdparm -T /dev/sdb
/dev/sdb: Timing cached reads: 1630 MB in 2.00 seconds = 815.69 MB/sec
Na ja, aus dem Cache... ca. 800 MB/s ist da zu erwarten.
Braucht eine grosse Ewigkeit...
time cat /data/mail-testlog | grep "@sonst-eine-domain.de"|grep "smtpd"|grep "Nov 18"|grep "5.1.1" -v |grep "5.7.1" -v >/dev/nul
David wird das bestimmt korrigieren :-)
real 0m7.945s user 0m8.309s sys 0m0.044s
Was vergelichbares braucht hier bei mir auf einem ähnlichen System ca. 2,5 Sekunden bei 5 MB Daten: real 0m2.545s user 0m2.544s sys 0m0.016s Ich vermute hier wird allerdings, spätestens nach dem ersten Lauf, nur noch aus dem Speicher gelesen. Plattengeschwindigkeit dürfte absolut irrelevant sein bei solchen kleinen Datensätzen. Also probier mal eine bigsmp-kernel. Arno -- Arno Lehmann IT-Service Lehmann www.its-lehmann.de -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (7)
-
Arno Lehmann
-
Christian Salzer
-
David Haller
-
Emil Stephan
-
Manfred Kreisl
-
Martin Hofius
-
Steffen Dettmer