Spiele Benchmark: Linux vs. Mac OS X

Wer ein MacBook Pro hat und darauf 3D Spiele spielt sollte den folgenden Beitrag definitv lesen!

Ich hatte schon seit längerem das Gefühl, dass 3D Anwendungen auf Linux mit den NVidia Treibern wesentlich besser laufen als auf Mac OS X. Das Gefühl musste jetzt mal gemessen werden und zwar mit dem Benchmark von X-Plane 8. Zuerst die Rahmenbedingungen:

  • MacBook Pro (Santa Rosa) Intel CoreDuo 2 2.2GHz, 2GB (PC5300), NVidia 8600M GT 128MB
  • Mac OS X 10.5.2 mit letzen Patches, TFT 1440×900 (24bit)
  • Linux 2.6.24, KDE 3.5.9, NVidia Treiber 169.12, TFT 1440×900 (24bit)
  • X-Plane 8.64, volle Auflösung, texture resoluton high, anti-alias level 2, alle Einstellungen synchron auf Mac OS X und Linux

gemessen wurde mit den Runstring –fps_test=123 (3 digit number bestimmt gewisse Grafikeinstellungen).
Unter Linux mit:

./X-Plane-i586 --fps_test=123

Unter Mac OS X:

/Applications/X-Plane\ 8.64/X-Plane\ 864.app/Contents/MacOS/X-Plane --fps_test=123

(Leider kann man unter Mac OS X keine Runstrings – ausser einem Dateinamen – dem open Kommando mitgeben)

Unter beiden Systeme wurde 3mal gemessen und dann gemittelt. Hier die Werte für die 3 Phasen die X-Plane ausgibt.

System Phase 1 [fps] Phase 2 [fps] Phase 3 [fps]
Mac OS X 4 9 9
Linux 8 33 34

Die Flugsimulation läuft tatsächlich mehr als 3mal schneller unter Linux! Sicherlich hängt es mit dem Treiber zusammen, welcher unter Mac OS X direkt mit dem Betriebssystem ausgeliefert wird, während unter Linux der Original NVidia Treiber installiert werden kann.
Dieser verfügt natürlich auch über eine Temperaturkontrolle die die Karte ab einem Threshold drosselt. Während des Benchmarkes fuhr NVidia’s PowerMizer sofort in den höchsten Performance Level 3 (470 MHz GPU,635 MHz VRAM).

Weiterhin fuhr ich auf diesem Rechner unter Linux noch den Benchmark von X2-The Threat:

Testlauf 1: 34.086 fps
Testlauf 2: 33.947 fps

Leider kann ich diese Werte nicht direkt vergleichen, da X2 auf Mac OS X nur auf PPC läuft. Die Werte erscheinen aber ebenso hervorragend, wenn man mal X2 auf einem PPC-Mac sieht.

kernel headers

Falls man einen selber gebackenen Kernel bootet und in dessen Umgebung arbeitet könnte man bei der Entwicklung gefahr laufen falsche header files zu inkludieren.

Zumindest in openSuSE 10.3 sind unterhalb von /usr/include folgende Unterordner nicht von glibc-devel sondern vom Paket linux-kernel-headers:

  • asm*
  • linux
  • mtd
  • rdma
  • sound
  • video

..und ev. weitere. Es bleibt einem nichts anderes übrig, als diesese Packet mit –nodeps (benötigt glibc-devel ab!) zu entfernen und alles von /usr/src/`uname -r`/include/* recursiv nach /usr/include zu kopieren

praxis tipps: iostat

Glücklicherweise gibt es auch eine Kommandotool um den I/O Durchsatz zu verfolgen, welches auf allen Plattformen verfügbar ist (unter SuSE Linux das Paket sysstat installieren).

iostat verfügt über einen statischen Output, sowie über ein Trackingmodus. Unter Linux wird dazu einfach als erster Parameter das Sekundenintervall angegeben, unter Sun Solaris dagegen nach dem Parameter -x, unter Mac OS X nach -w

Das Ergebniss wird tabellarisch angezeigt. Wichtig sind dabei die Felder tps (transfers per second) sowie die Durchsatzraten (entweder in kiloByte oder MegaByte angebbar).

Zudem wird immer auch die CPU Belastung (user,system,idle) protokolliert.

WPA2 und Apple AirportExpress

Nachdem ich mein WLAN Netzwerk von WEP auf WPA umstellte und zumindest anfänglich alles klappte, stellte mein AirportExpress nach einer gewissen Zeit den Dienst ein.
Dieses Spiel ging zweimal so – kurioserweise trat der Fehler immer erst nach ein paar Tagen ein. Zufällig staß ich auf folgenden Artikel, bei dem ebenfalls eine Inkompatibilität zwischen Apple Airport Produkten und einem Speedtouch Modem beschrieben wurde.

http://www.qdsl-support.de/archive/index.php?t-13262.html

Die Lösung, die bei mir ebenso zum Erfolg führte war ein Downgrade der Airport Express Firmware auf Version 6.1.1

http://www.apple.com/support/downloads/airportexpressfirmware611formacosx.html

Auf der Downloadseite der aktuellen Firmware (6.3) steht, dass WPA2 einen Macintosh Computer mit Aiport Extreme benötigt. Da sich in meiner Konfiguration der AirportExpress Client in einem bestehenden Netz einklinkt ist nicht die Kompatibilität zum Apple Rechner sondern in erster Linie zum primären AccessPoint (funkwerk bintec R232bw) wichtig. Dort ist zur Absicherung aber folgendes eingestellt.

WPA Einstellungen

Während die AiportExtreme Karte des Macintosh kein Problem hat, scheint diese Einstellung das AiportExpress Gerät aus dem Konzept zu bringen.

Im Fehlerfalle meldete das Syslog des AccessPoint immer wiederkehrende disconnectsfailed authentifications – und wieder connects. Ein „reboot“ (Aus- und Einstecken des AirportExpress) brachte nix – nach einem hartem Reset ging’s wieder ein paar Tage gut, bis diesem Problem erneut auftrat.

Eine dauerhafte Lösung ist bisher nur das Downgrade der Firmware – vielleicht kommt ja noch ne bessere Lösung…

GTK-Qt Theme

Nach einem Gnome-Update auf 2.12 an einem SuSE Linux 10.1 Rechner mit primären KDE Desktop ging der Look der GTK Programme wieder baden (Firefox,Thunderbird,Adobe Reader usw..)

Auf der Konsole wurde das Problem schnell lokalisiert:

 Gtk-WARNING **: Unable to locate theme engine in module_path: "qtengine"

Das Problem kam offenkundig von der qtk-qt Theme Engine. Mit Hilfe dieses Programms kann das KDE Kontrollcenter das aktuelle Theme/Style des KDE Desktops für GTK mit Hilfe der dynamisch erzeugten Datei:

~/.gtk_qt_engine_rc

erzeugen. Leider ist diese Paket auf den SuSE Repositories nicht mehr auf dem aktuellen Stand. Das Projekt selber ist auf diese Seite umgezogen. Dort schreiben die Maintainer, das die aktuellen Versionen (>0.6) nur noch im SourceCode erhältlich sind. Also hab ich das SuSE rpm Paket (qtk-qt….) deinstalliert, das tarball (Version 0.8) gezogen und mit der auf der Webseite stehenden Anleitung installiert (cmake muss installiert sein). Nach einem SuSEconfig erscheint der Menüpunkt „GTK-Stile und Schriftarten“ wieder im Bereich „Erscheinungsbild“ im KDE Kontrollcenter – dort nochmals den Punkt „Use my KDE Style in GTK Applications“ angewählt und schon wieder sehen alle GTK Anwendungen bestens aus.

CalDAV

eMail gehört schon seit langem zu den selbstverständlichsten Dingen auf jedem Computer. Daneben wird aber ein zentraler Kalender immer mehr ebenso zu einer Selbstverständlichkeit, welche in der Implementierung im Netzwerk aber wesentlich problematischer ist.

Denn im Gegensatz zu den eMail Standards wie POP3/IMAP4 gab es bei der Kalenderverwaltung lange Zeit keinen (Industrie)Standard. Dies nutzte in erster Linie dem Platzhirschen Microsoft mit seiner Groupwarelösung Exchange Server / Outlook Client.

Tatsächlich ist das Produkt aber für viele Netzwerke ein Overkill, kostet doch etwas Geld und ist Clientseitig nur gut auf Windows nutzbar – äusserst dumm für ein UNIX zentriertes Netzwerk.

Seit März 2007 scheint gibt es aber für diesen Fall einen absoluten Exchange Killer

CalDAV / RFC 4791

Um was geht es dort:

  • CalDAV operiert aussschliesslich mit Daten im iCalendar Format (ics)
  • Im Gegensatz zum simplen ics over HTTP, kann CalDAV den Zugriff auf die Kalenderresourcen limitieren und greift molekular auf alle einzelnen Einträge in einem iCalendar zu
  • Diese Technik wird als Erweiterung von WebDAV implementiert.

Somit steht CalDAV in bester UNIX Tradition – keep it simple. Endlich lassen sich auf UNIX (aber auch Windows) Plattformen Kalenderinformationen beliebig austauschen und verwalten. Was folgt ist noch eine Auflistung der möglichen Clients und Server:

CalDAV Clients:
  • Mozilla Sunbird / Lightning (Thunderbird plugin)
  • iCal (ab Mac OS X 10.5)
  • Novell Evolution
  • KDE Kontact (wahrscheinlich ab KDE 4.1 )
CalDav Servers:

Qt Programme als Universal Binaries erstellen

Natürlich ist es kein Problem auch Qt Programme als UB’s (Universal Binaries) zu erstellen. Allerdings ist es unter Qt 4.x wesentlich einfacher als unter Qt 3.x, weswegen ich die Vorgehensweise kurz getrennt darstelle

UB’s mit Qt 3.3

Rein theoretisch kann man auch hier beide Zielplattformen (ppc und i386) auf einer Maschine erstellen, was aber zusätzlichen Aufwand erfordert. Einfacher ist es binaries für die beiden Plattformen auf einer passenden Maschine zu erstellen und später zusammenzufügen. die 64bit Targets (ppc64 bzw. x86_64) spielen hier übrigens keine Rolle, da Mac OS X 10.4 sowieso keine 64bit GUI Programme unterstützt.

Das Hauptproblem bei Qt 3.3 ist, dass die Qt Library selber nicht als UB vorliegt oder out-of-the-box erstellt wreden kann. Daher muss man auf jeder Zielplattform diese Library erstellen.

Danach erstellt man sein Programm und/oder seine Libraries/Frameworks auf jeder Maschine. Am Schluss legt man auf jeder Maschine ein Build-Verzeichnis i386 und ppc an, kopiert die Binaries rein und führt Sie mit dem lipo Befehl zusammen, bspw:

lipo -create  build/i386/test build/ppc/test -output test.app/Contents/MacOS/test

mit dem file Kommando sieht man, dass das neue test Binary nun 2 Plattformen unterstützt:

file  test.app/Contents/MacOS/test

test.app/Contents/MacOS/test: Mach-O universal binary with 2 architectures

test.app/Contents/MacOS/test (for architecture i386): Mach-O executable i386
test.app/Contents/MacOS/test (for architecture ppc): Mach-O executable ppc

UB’s mit Qt 4.x

Hier ist das Sache wesentlich einfacher. Wenn man das Toolkit mit dem -universal Flag übersetzt hat man ein UB fähiges Qt Framework. In seinem .pro File muss man dann nur noch

QMAKE_MAC_SDK=/path/to/MacOSX10.4u.sdk
CONFIG+=x86 ppc

angeben um ein fertiges Binary zu erzeugen. Im Hintergrund schleusst Qt einfach die -arch Flags an den g++ Compiler weiter.

weitere Hinweise:

gfortran unterstützt in der eigentlichen Fassung diese -arch Flags noch nicht. Hier gibt es allerdings einen weiteren experimentellen Fork der das schon kann:

http://r.research.att.com/tools/

Um die Qt Bibliothek mit dem eigenen Programm auszuliefern muss der install_name (Linux: soname) geändert werden, dies ist hier am Bsp. von Qt 3.3 dargestellt:

..für die Qt Library selber

 install_name_tool id @executable_path/../Frameworks/libqt.3.dylib 
demo.app/Contents/Frameworks/libqt.3.dylib

und für das Programm:

install_name_tool -change libqt.3.dylib 
@executable_path/../Frameworks/libqt.3.dylib 
test.app/Contents/MacOS/test

Multiuser Umgebung und subversion

Multisuser Umgebungen sind nun in der UNIX Welt Sachen aus einer Zeit in der ich geboren wurde – dennoch ist bis zum heutigen Tag die Sache nicht ganz unproblematisch.

Subversion (svn) – Multiuseraccess auf Repository und Working Directory

Das Repository kann auf 4 Arten angesprochen werden:

  1. svn client auf regulärem (lokalen) Filesystem
  2. ssh-spawned svnserve Prozess
  3. svnserve Prozess
  4. Apache HTTP Prozess

Methode 1+2 laufen mit normeln Benutzerkennungen auf den Maschinen. Daher macht es Sinn für jedes Repository eine Gruppe zu definieren, welche Schreibberechtigung hat.
Wenn man eine normale POSIX Rechtestruktur zugrundelegt (keine ACL’s), dann müssen folgende Schritte ausgeführt werden.

1. Dem angelegten Repository Verzeichnis – meist auf dem svn Server unter /var/svn – müssen rekursiv alle Gruppenrechte (-bits) gegeben werden.

chmod -R g+rw /var/svn/<REPOSITORY>

2. Das sgid bit muss für dieses Respository etabliert werden, da die Benutzer unterschiedliche primäre Gruppen haben können.

chmod -R g+s /var/svn/<REPOSITORY>

3. Die umask muss auf dem subversion Server so eingestellt sein, dass die Gruppe immer Schreibrecht hat, bspw:

umask 0002

Damit funktionieren die beiden ersten Zugriffsmethoden. Die dritte und vierte Methode (HTTP) führt die Operationen immer mit der Benutzerkennung des Dämonenprozesses durch. Der Benutzer muss sich an diesem Prozess authentifizieren – seine Kennung wird innerhalb der svn Files mitdurchgeschleust (svn blame zeigt damit immer den richtigen Author an).

Somit erfordern diese Zugriffsarten nochmals Anpassungen

4. Die Ownership des Repositories wird auf den Owner der HTTP/svnserver Dämonen angepasst. Dieser Benutzer muss allerdings auch Mitglied der Gruppe sein, die Schreibzugriff auf das Repository hat.

5. Bei HTTP muss man ev. die Benutzerkennung des Prozesses anpassen (siehe 4.). Falls mehrere HTTP Dienste laufen, weicht man auf einen virtuellen Host aus, der auf einem gesonderten Port läuft.

6. Die Dämonen müssen ebenfalls die unter 3. genannte umask respektieren – oder Sie muss angepasst werden durch ändern der AP_SUEXEC_UMASK Variable

Das war’s auf Repository Seite – ich bin der Meinung, die Einschränkungen pro Repository sollten reichen, falls aber eine noch filigranere Abstufung der Rechte (händisches ACL) gewünscht ist, muss man die Path-Based Authorizations in svnserve.conf benutzen.

Diese greifen beim Zugriff mit den Methoden 1-3 automatisch wenn auch kostspielig was die Performance betrifft.

Für den HTTP Zugriff muss serverseitig das Modul mod_authz_svn geladen und in der Konfiguration AuthzSVNAccessFile eingetragen werden.

Beim Zugriff auf das Working Directory wird’s undefinierter

Eigentlicht ist das working directory eher pro user gedacht auch wenn dies nie explizit erwähnt wird.

In einem Working Directory auf einem POSIX (UNIX) Rechner macht der svn client folgendes:

  • Die Struktur im .svn Unterverzeichnis (zeigt den Zustand des working directories an) wird unabhängig von der umask angelegt, d.h. zentrale Dateien habe immer nur ein Leseflag.
  • Wenn die Rechtestruktur im working directory ebenfalls so angelegt ist, dass Mitglieder einer Gruppe immer Schreiben können, sollte es zum Konflikt kommen wenn Dateien im .svn Verzeichnis geändert werden….
  • … denn bei einem svn commit wechselt die Ownership einiger Dateien im .svn Verzeichnis auf denjeniegen der diese Operation durchgefüht hat. Der svn UNIX client macht folgendes:
  1. betreffende Datei kopieren (..tmp)
  2. diese Datei dann beschreiben.
  3. die zu ersetzende Datei löschen
  4. die temporäre Datei wieder zurückzukopieren (mv Operation)

All diese Punkte erfordern nur die Schreibberechtigung auf dem .svn Verzeichnis

Schwieriger wird’s bei einem Windows svn client (Tortoise oder Kommandotool)

die oben genannten 4 Punkte greifen nicht, denn unter Windows haben wir statt dem einfachen POSIX Rechtemodell die Windows ACL’s.

Daher muss gewährleistet sein, dass alle Benutzer der zugreifenden Gruppe die ACL’s

  1. Take Ownership
  2. Change Permissions

gesetzt haben – Schreibberechtigung sowieso vorrausgesetzt.

Dann geht es auch hier – dieses Verfahren hat aber seine Grenzen wenn das working directory auf einem SAMBA Server liegt, der nur einfache POSIX Rechte auf Windows ACL’s mappt und somit diese beiden ACL Flags nicht setzen kann.

Hier könnte höchstens noch ein Samba Server mit aktivierten ACL’s helfen. Allerdings wäre die Kompatibilität zwischen Windows – POSIX und NFS4 ACL’s zu testen. Eventuell werden die neuen NFS4 ACL’s der neue POSIX Standard, was wegen der besseren Kompatibilität zu den Windows ACL’s zu begrüßen wäre.

Java 1.6 Desktop-Performance

Tatsächlich wollte ein typisches Desktop Programm unter Linux das neueste Java 1.6 haben. Hab von SUN das JRE rpm package gezogen und installiert.

Zum ersten mal was das Feeling eines fetten Desktop Programmes analog zu einer nativen Anwendung. Alle Aktionen auf das User-Interface reagierten prompt ohne Verzögerung. Wäre schön wenn Java sich in diesen Performanceregionen etablieren könnte.

Die Schriften sehen jetzt auch einwandfrei aus – ein GTK Feeling kann ich allerdings noch nicht erkennen

(externe) iSight Kamera unter Linux (SuSE 10.1)

Bereits nach dem Einstecken in den FireWire Port ist die Kamera rudimentär erkannt. Im Linux Treiberbereich wurde ein zeichenorientiertes Device angelegt:
/dev/video1394-0
der Ordner
/dev/video1394
enthält einen Link auf die erste Datei, hat aber die Rechtemaske 0600 statt 0700, so dass hier ein Zugriffsfehler (kein Eintritt in das Directory) vorliegt. Diesen Mißstand (wahrscheinlich nur SuSE 10.1 spezifisch) muss man händisch beseitigen.

Wie komme ich zum Videobild? Das erste Problem ist schon das einschalten der Kamera. Unter Mac OS X wird Sie automatisch beim Zugriff eingeschaltet. Unter Linux brauche ich ein Programm, bspw coriander (package der Distribution)

Dieses (GUI-) Programm kann nicht nur die Kamera ein- und ausschalten, mittels

Services -> ISO Control: START
In diesem Bereich stllt man am Besten gleich die Auflösung 320×240 ein, die von den ganzen Kommunkationsprogrammen benötigt wird.

sondern auch die Auflösung einstellen und alle Anzeigewerte kalibrieren.
Messenger und VoIP Programme wie kopete und skype erwarten aber ein v4l device unter /dev/videoX (X als Ganzzahl)

Um das Video ieee1394 Device umzuleiten braucht man das Kernelmodul vloopback. Da dieses zumindest unter SuSE 10.1 nicht dabei ist, muss man die Quellen herunterladen und selberkompilieren (make;make install)

Danach muß man das Modul vloopback und videodev einladen – dauerhaft als Eintrag in MODULE_LOADED_ON_BOOT im Bereich sysconfig.

Danach geht man wieder ins das GUI Programm Coriander und drückt im Services Bereich den Knopf „Receive“ und „V4L“ um das Video Signal mittels vloopback in /dev/video0 einzuspeissen. Dieses Signal kann dann unter /dev/video1 von den Anwedungsprogrammen ausgelesen werden.