Browser Benchmark: Chromium cheatet

Fasziniert von der Entdeckung eines Browserbenchmarks (Peacekeeper) gleich mal an meinem per ramdisk getunten Firefox 3.6.7 und der aktuellen Chromium-Version aus den Arch Repos (5.0.375.99) ausprobiert. Bittere Niederlage für Firefox:

Firefox vs. Chromium

Kurios bei der Ausführung: Chromium cheatet :)  Beim Rendering-Test Stufe 1 mit den Kugeln sollen selbige nicht nur an den “Wänden”, sondern auch gegenseitig abprallen, was Firefox korrekt umsetzt. Chromium hingegen scheint sich die Kollisionsabfrage der Kugeln untereinander zu sparen und lässt sie tunneln:

Tunneleffekt

Ich schließe mal böse Absicht aus; wer die gegebenen JavaScript-Algorithmen jetzt korrekt umsetzt und damit “Recht” hat, bleibt zu klären ;)

Update: Hier der Link zum Eintrag im Bugtracker

Temperatur > Tuning

Meinen Core i7-920 (2.67GHz Standardtakt) hatte ich bis vor kurzem noch per BCLK auf 3.6GHz übertaktet, was bei den 2009er Modellen erfreulicherweise recht zuverlässig funktioniert – ambitioniertere Tuner jagen die Dinger sogar permanent auf über 4GHz hoch. Negativer Nebeneffekt der Sache: Hitze. Der (alte) Core i7 hat mit 130W TDP auf Standardtakt schon eine recht hohe Verlustleistung; übertaktet entwickelt er sich dann endgültig zum Hitzkopf.

Trotz Wasserkühlung knackte mein Exemplar so nicht selten die 70°C – Marke, was mir im Hinblick auf den Sommer einige Sorgen bereitete. Zugegeben, mein System hat in Punkto Kühlungsdesign zwei entscheidende Defizite: 1.) Im Kreislauf hängt neben CPU auch eine GTX 280 als GraKa, die nicht unerheblich zur Hitze beiträgt. 2.) Der Rechner steht eingekeilt zwischen Schreibtisch-Seitenteil, Schrank und Tischplatte, sodass nur nach vorne Luft zu- und wegströmen kann.

Das alles veranlasste mich kürzlich zu einem konkreten Benchmark mit linpack:

Intel(R) LINPACK data
 
Current date/time: Fri May  7 19:49:37 2010
 
CPU frequency:    3.610 GHz
Number of CPUs: 8
Number of threads: 8
 
Parameters are set to:
 
Number of tests                             : 1
Number of equations to solve (problem size) : 21000
Leading dimension of array                  : 21000
Number of trials to run                     : 100  
Data alignment value (in Kbytes)            : 4    
 
Maximum memory requested that can be used = 3528424096, at the size = 21000
 
============= Timing linear equation system solver =================
 
Size   LDA    Align. Time(s)    GFlops   Residual     Residual(norm)
21000  21000  4      252.846    24.4215  3.959026e-10 3.178913e-02
21000  21000  4      252.587    24.4466  3.959026e-10 3.178913e-02
21000  21000  4      252.602    24.4451  3.959026e-10 3.178913e-02
21000  21000  4      252.614    24.4439  3.959026e-10 3.178913e-02
21000  21000  4      252.531    24.4520  3.959026e-10 3.178913e-02
21000  21000  4      252.550    24.4501  3.959026e-10 3.178913e-02
21000  21000  4      252.500    24.4549  3.959026e-10 3.178913e-02
21000  21000  4      252.466    24.4583  3.959026e-10 3.178913e-02
21000  21000  4      252.481    24.4568  3.959026e-10 3.178913e-02
21000  21000  4      252.489    24.4560  3.959026e-10 3.178913e-02
21000  21000  4      252.467    24.4582  3.959026e-10 3.178913e-02
21000  21000  4      252.475    24.4574  3.959026e-10 3.178913e-02
21000  21000  4      252.482    24.4567  3.959026e-10 3.178913e-02
21000  21000  4      252.477    24.4573  3.959026e-10 3.178913e-02
Intel(R) LINPACK data
 
Current date/time: Mon May 10 20:33:50 2010
 
CPU frequency:    2.670 GHz
Number of CPUs: 8
Number of threads: 8
 
Parameters are set to:
 
Number of tests                             : 1
Number of equations to solve (problem size) : 21000
Leading dimension of array                  : 21000
Number of trials to run                     : 100  
Data alignment value (in Kbytes)            : 4    
 
Maximum memory requested that can be used = 3528424096, at the size = 21000
 
============= Timing linear equation system solver =================
 
Size   LDA    Align. Time(s)    GFlops   Residual     Residual(norm)
21000  21000  4      342.691    18.0188  3.959026e-10 3.178913e-02
21000  21000  4      342.756    18.0154  3.959026e-10 3.178913e-02
21000  21000  4      342.765    18.0149  3.959026e-10 3.178913e-02
21000  21000  4      342.770    18.0146  3.959026e-10 3.178913e-02

Summa summarum also ~25% Performance-Einbuße, genau der linearer Weise erwartete Wert. Nun zu den Auswirkungen auf die Temperaturen:

CPU idle CPU Last Case Wasser
OC’ed 47°C 75°C 38°C 43°C
norm. 42°C 53°C 31°C 33°C

Alle Werte außer “CPU Last” beziehen sich auf eine Uptime von ca. 4h bei normalem Office-Workload und einer Raumtemperatur von ca. 23°C.

Fazit: 25% weniger (theoretische) CPU-Performance für 30% bessere Temperaturwerte – für den Sommer ein wie ich finde fairer Tausch. Zumal bei den einzigen wirklich Rechenintensiven Anwendungen (Games!) hauptsächlich GPU und weniger CPU belastet wird.

Hier noch die relevanten Settings für beide Modi:

BCLK Multipl. DRAM Freq. VCore
OC’ed 180.0MHz 20.0 DDR3-1443MHz 1.18750V
norm. 133.0MHz 20.0 –* –*

Die *-Werte werden noch nachgeliefert. Am VCore könnte man sicher noch etwas Undervolting betreiben, hier heißt das Ziel <1.0V :)

iptables init-script für Arch

Ja, das vom Paket iptables mitgebrachte init-script leistet wunderbare Dienste. Nein, es besteht kein akuter Grund, eine Alternative zu schreiben…
Einen Nachteil hat es schon: die Konfiguration wird in einem nicht kommentierbaren Format hinterlegt, was bei mir in letzter Zeit ständig zur Frage “WTF hat doch gleich dieser Port da verloren? Was lässt die rule da nochmal durch?” geführt hat.

<bash-addicted>Yep, eindeutige Notwenigkeit für ein selbst gehämmertes, kommentierbares  Script!</bash-addicted> Wie in guten alten Debian-Zeiten übernimmt jetzt also bei mir ein einfaches, aber für den Job völlig ausreichendes init-script den Job. Wer es verwenden mag:

Download miptables.sh
#!/bin/bash
 
#
#   easy-to-edit iptables init script for Arch
#           2010 by Alexander Koch
#
 
 
# TCP services: ssh
SERVICES_TCP=( 22 )
# UDP services:
SERVICES_UDP=( )
 
. /etc/rc.conf
. /etc/rc.d/functions
 
if [ -z "$IPTABLES" ]; then
    IPTABLES="/usr/sbin/iptables"
fi
if ! [ -x "$IPTABLES" ]; then
    echo "unable to execute iptables binary: $IPTABLES"
    exit 1
fi
 
function reset_tables() {
    ERR=0
    $IPTABLES -F || ERR=1
    $IPTABLES -X || ERR=1
    $IPTABLES -P INPUT ACCEPT || ERR=1
    $IPTABLES -P OUTPUT ACCEPT || ERR=1
    if [ $IPTABLES_FORWARD -eq 1 ]; then
        $IPTABLES -P FORWARD ACCEPT || ERR=1
        echo 1 >/proc/sys/net/ipv4/ip_forward || ERR=1
    else
        $IPTABLES -P FORWARD DROP || ERR=1
        echo 0 >/proc/sys/net/ipv4/ip_forward || ERR=1
    fi
 
    return $ERR
}
 
function setup_tables() {
    ERR=0
 
    # setup prevention chain against common attacks
    $IPTABLES -N preventions || ERR=1
    $IPTABLES -A preventions -f -j DROP || ERR=1                           # frags
    $IPTABLES -A preventions -p tcp --tcp-flags ALL ALL -j DROP || ERR=1   # XMAS
    $IPTABLES -A preventions -p tcp --tcp-flags ALL NONE -j DROP || ERR=1  # null
 
    # setup services chain
    $IPTABLES -N services || ERR=1
    for PORT in ${SERVICES_TCP[@]}; do
        $IPTABLES -A services -p tcp --dport $PORT -j ACCEPT || ERR=1
    done
    for PORT in ${SERVICES_UDP[@]}; do
        $IPTABLES -A services -p udp --dport $PORT -j ACCEPT || ERR=1
    done
 
    # allow incoming ping requests
    iptables -A services -p icmp --icmp-type echo-request -j ACCEPT || ERR=1
 
    # setup main chains
    $IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT || ERR=1
    $IPTABLES -A INPUT -i lo -j ACCEPT || ERR=1
    $IPTABLES -A INPUT -j preventions || ERR=1
    $IPTABLES -A INPUT -m state --state NEW -j services || ERR=1
    $IPTABLES -A INPUT -p tcp -j REJECT --reject-with tcp-reset || ERR=1
    $IPTABLES -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable || ERR=1
    $IPTABLES -P INPUT DROP || ERR=1
 
    return $ERR
}
 
case "$1" in
    start)
        stat_busy "Loading IP Tables"
        reset_tables
        if setup_tables; then
            stat_fail
            exit 1
        else
            add_daemon miptables
            stat_done
        fi
        ;;
    stop)
        stat_busy "Flushing IP Tables"
        if reset_tables; then
            rm_daemon miptables
            stat_done
        else
            stat_fail
            exit 1
        fi
        ;;
    restart)
        if ! ck_daemon miptables; then
            rm_daemon miptables
        fi
        $0 start
        exit $?
        ;;
    *)
        echo "usage: $0 {start|stop|restart}"
        ;;
esac
 
exit 0

Gefiltert werden nur eingehende Pakete; related und established Pakete werden ebenfalls ohne weitere Beachtung durchgelassen, ebenso alles über loopback. Für neue Pakete werden zuerst ein paar Vulnerability-Checks durchgeführt. Nach Außen wird ein Verhalten wie ohne iptables emuliert (z.B. REJECTs mit tcp-reset).

Bugreports wie immer willkommen, und Benutzung auf eigene Gefahr!

Netbook Screeny

XFCE mit AWN statt xfce4-panel

Java Gridbags

Dieser animierte Blogpost beschreibt meinen Abend perfekt :)

Back on KDE

Im Zuge meines Wechsels vom Notebook auf eine Workstation als Hauptrechner bin ich wieder auf KDE umgestiegen. Dabei entbrennt natürlich auch gleich mal wieder der übliche Toolkitwechsel und damit verbundene “iiieh, GTK!”-Wahn ^^

Für Mails bin ich wieder bei KMail, als Browser und lange gesuchte, mittlerweile ernstzunehmende Firefox-Alternative teste ich Arora.

KDE 4.4 auf Thor

DeNIC Ausfall

Auch mich hat der DeNIC-Ausfall am Mittwoch ziemlich geschickt :)

Bleibt nur zu hoffen, dass die Provider ihre DNS-Caches flushen ^^

Arch rc.sysinit: LUKS parallel

Im Arch Bootscript /etc/rc.sysinit werden u.A. die per /etc/crypttab definierten verschlüsselten Volumes geöffnet und gemountet – sequentiell. Da ein luksOpen-Aufruf generell schon recht lange dauert, kommen bei mehreren solcher Volumes schnell einige Sekunden zusammen.

Auf einer Kiste mit fünf LUKS-Volumes kam mir die Idee, die entsprechende Funktion mal per “&” zu forken und das Ganze so ein wenig zu parallelisieren.

In wie fern das jetzt tatsächlich im messbaren Bereich liegt, sei mal dahingestellt. Ich bilde mir jedenfalls erfolgreich einen Geschwindigkeits-zuwachs ein, und da der Patch meines Erachtens recht unkritisch ist, bleibe ich dabei :)

Wer es ausprobieren mag:

--- /etc/rc.sysinit.backup      2010-01-24 15:35:12.000000000 +0100
+++ /etc/rc.sysinit             2010-05-04 18:57:53.380890577 +0200
@@ -149,7 +149,7 @@
                        cpass="$3"
                        shift 3
                        copts="$*"
-                       stat_append "${cname}.."
+                       #stat_append "${cname}.."
                        # For some fun reason, the parameter ordering varies for
                        # LUKS and non-LUKS devices.  Joy.
                        if [ "${cpass}" = "SWAP" ]; then
@@ -188,15 +188,16 @@
                        fi
                        if [ $? -ne 0 ]; then
                                csfailed=1
-                               stat_append "failed "
+                               stat_append "${cname} failed "
                        else
-                               stat_append "ok "
+                               stat_append "${cname} ok "
                        fi
                fi
        }
        while read line; do
-               eval do_crypt "$line"
+               eval do_crypt "$line" &
        done </etc/crypttab
+       wait
        if [ $csfailed -eq 0 ]; then
                stat_done
        else

Arch ramdisk-script 1.4

In meinem Arch Ramdisk-Script <1.4 hatte sich ein dämlicher Bug eingeschlichen: bei sämtlichen rsync-Aufrufen fehlte das --delete.

Das bewirkt z.B. bei Verwendung mit Firefox, dass der Cache nie geleert wird und (streng) monoton wächst – unschön.

Hier die gefixte Version :)

Download ramdisks
#!/bin/sh
 
#
# Manages outsourcing of specified directories into memory on bootup and
# takes care of synchronization/backup on system shutdown.
#
# Version 1.4, 2010-04-26, by Alexander Koch
#
 
# includes
 
. /etc/rc.conf
. /etc/rc.d/functions
 
 
# configuration (syntax is: [persist. storage]:[mountpoint]:[mount options])
 
DISKS=('/home/alex/.ramdisks/_mozilla:/home/alex/.mozilla:size=100M,uid=1000,gid=100' \
	   'empty:/home/alex/.adobe:size=10M,uid=1000,gid=100' \
	   'empty:/home/alex/.macromedia:size=10M,uid=1000,gid=100')
 
 
# helper functions
 
function activate_rd() {
	[ -d "$1" ] || [ "$1" = "empty" ] || return 1
	[ -d "$2" ] || return 1
	mount | grep "$2" &>/dev/null && return 1
	MNT="mount -t tmpfs"
	[ -z "$3" ] || MNT="$MNT -o $3"
	$MNT none "$2"
	[ $? -gt 0 ] && return 1
	if [ "$1" != "empty" ]; then
		for D in $1/.* $1/*; do
			[ "$(basename "$D")" == "." ] && continue
			[ "$(basename "$D")" == ".." ] && continue
			rsync -axq "$D" "$2" &>/dev/null
			if [ $? -gt 0 ]; then
				umount "$2"
				return 1
			fi
		done
	fi
	return 0
}
 
function backup_rd() {
	mount | grep "$1" &>/dev/null || return 0
	if [ "$2" != "empty" ]; then
		for D in $1/.* $1/*; do
			[ "$(basename "$D")" == "." ] && continue
			[ "$(basename "$D")" == ".." ] && continue
			rsync -axq --delete "$D" "$2" &>/dev/null
			if [ $? -gt 0 ]; then
				tar -cf "/root/$(basename "$2")-failed.tar" "$1"
				return 1
			fi
		done
	fi
	umount "$1" || return 1
	return 0
}
 
 
# main logic
 
case $1 in
	start)
		stat_busy "Mounting ramdisks"
		error=0
		for M in ${DISKS[@]}; do
			FROM="$(echo "$M" | cut -d ':' -f 1)"
			TO="$(echo "$M" | cut -d ':' -f 2)"
			OPTS="$(echo "$M" | cut -d ':' -f 3)"
			activate_rd "$FROM" "$TO" "$OPTS" || error=1
		done
		if [ $error -eq 0 ]; then
			add_daemon ramdisks
			stat_done
		else
			stat_fail
			exit 1
		fi
		;;
	stop)
		stat_busy "Saving ramdisks"
		error=0
		for M in ${DISKS[@]}; do
			FROM="$(echo "$M" | cut -d ':' -f 2)"
			TO="$(echo "$M" | cut -d ':' -f 1)"
			backup_rd "$FROM" "$TO" || error=1
		done
		if [ $error -eq 0 ]; then
			rm_daemon ramdisks
			stat_done
		else
			stat_fail
			echo -n "WARNING: failed to save ramdisk(s), tried to make "
			echo "backup(s) under /root."
			echo "Hit enter to proceed shutdown."
			read DUMMY
			exit 1
		fi
		;;
	restart)
		if ! ck_daemon ramdisks; then
			"$0" stop && sleep 3
		fi
		"$0" start
		;;
	*)
		echo "usage: $0 {start|stop|restart}"
		;;
esac
 
exit 0

Coffein-Entzug: Tagebuch

Tag 1

Interessanter Zustand: man wartet ständig auf den morgendlichen Kaffee, der die verbliebenen Dunstwolken vom Schlaf wegreißt, und einen im Wachzustand ankommen lässt. Erschreckender Weise kommt stattdessen leichtes Kopfweh auf – eine von vielen “Aussteigern” berichtete Entzugserscheinung.
Garnicht so einfach, sich vollständig von Coffein fernzuhalten: neben Kaffee verkneife ich mir nun auch: Eistee, Multivitamin-Drinks (gibts in der Mensa auch mit Coffein und Guarana), mein Lieblingskaugummi, [Biermischgetränk mit dem X] und Cappuccino-Müsli. *schnief*

Tag 2

<jammer>War ja irgendwie klar, dass ausgerechnet diese Woche auf dem Campus andauernd gratis Energy-Drinks verteilt werden… Ach und könnte bitte jemand das anhaltende Kopfweh abstellen? </jammer>

Tag 8 – Ergebnisse

Tja, nun sind die sieben Tage rum – ich habe sogar noch heute drangehängt. Die Ergebnisse weichen stark von meinen ursprünglichen Erwartungen ab: weder am Schlafverhalten noch am körperlichen Wohlbefinden hat sich eine signifikante Veränderung gezeigt, und ruhiger bin ich auch nicht gewesen. Aus der anderen Seite hatte ich (abgesehen von Kopfschmerzen am ersten Tag) keine der erwarteten Nebenwirkungen, die Kaffee-Junkies auf Entzug sonst beschreiben.
Ich nenne es ursprüngliche Erwartungen, weil ich mittlerweile erfahren habe, dass eine Woche bei Weitem nicht ausreicht, um eine völlige Umstellung in der Physis zu erzielen – es läuft also alles viel langsamer mit der Umstellung, als ich mir vorgestellt hatte.

Fazit: Die Woche war weder blanker Horror, noch ultimativ meditativ; ich werde in Zukunft, wenn mir mal wieder danach sein sollte, gern wieder eine solche Pause einlegen. Jetzt freue ich mich aber erst mal tierisch auf meinen Cappuccino morgen früh :)

based on theme by WordPress Themes