Unerwartet langsam: Ein einfacher Socket-Benchmark zeigt Linux im Rückstand gegenüber OpenBSD

2025-08-16

Ein einfaches C-Programm, das Threads erstellt und 256 Sockets öffnet, zeigt einen überraschenden Leistungsunterschied zwischen Linux und OpenBSD. Unter Linux schwanken die Ausführungszeiten zwischen 17 und 26 Millisekunden; unter OpenBSD liegen sie nur bei 2 bis 6 Millisekunden. Noch interessanter ist, dass OpenBSD zunächst einen Fehler "Zu viele geöffnete Dateien" ausgab, was auf Unterschiede im Ressourcenmanagement hindeutet. Der Autor merkt an, dass die Diskrepanz nicht mit dem Netzwerkcode zusammenhängt und fordert die Leser heraus, ein Linux-System zu finden, das OpenBSD in diesem Benchmark übertrifft.

Mehr lesen

Die 500-Meilen-E-Mail-Grenze: Ein kurioses Experiment

2025-07-09

Eine amüsante Geschichte über einen Universitätspräsidenten, der keine E-Mails über 500 Meilen senden konnte, löste ein Experiment zur Netzwerkverbindung und E-Mail-Übertragungsentfernung aus. Durch das Schreiben eines einfachen Netzwerkverbindungscodes und das Testen von Servern an verschiedenen Universitäten stellte der Autor fest, dass die tatsächliche Verbindungsdistanz durch den Serverstandort und die Netzwerkinfrastruktur begrenzt ist, nicht durch die physische Entfernung. Das Experiment zeigte letztendlich den Einfluss von Cloud Computing und der geografischen Verteilung von E-Mail-Servern auf die E-Mail-Übertragung, wodurch die 500-Meilen-Grenze eher ein Zufall als ein physikalisches Gesetz ist.

Mehr lesen
Entwicklung

X11 DPI-Skalierung: Entlarvung des Mythos

2025-06-25

Der Autor widerlegt den weit verbreiteten Glauben, dass X11 keine DPI-Skalierung unterstützt, indem er erfolgreich einen zwei Zoll großen Kreis auf mehreren Bildschirmen mit unterschiedlichen Größen und Auflösungen zeichnet. Mit OpenGL und X-Server-Konfigurationsereignissen passt der Autor den Radius des Kreises dynamisch an, basierend auf den physischen Bildschirmdimensionen, die vom X-Server abgerufen werden. Trotz kleiner Ungenauigkeiten, wie einer Diskrepanz in der angegebenen Größe des Fernsehers, beweist das Experiment, dass DPI-Skalierung in X11 möglich ist. Der Prozess unterstreicht die Bedeutung, selbst auferlegte Grenzen zu ignorieren und scheinbar unmögliche Aufgaben zu verfolgen.

Mehr lesen
Entwicklung DPI-Skalierung

Pipelining-Fallstricke: Lehren aus SMTP

2025-06-20

Dieser Artikel untersucht die Tücken des Pipelining in Netzwerkprotokollen. Bei textbasierten Protokollen wie SMTP können Clients mehrere Anfragen senden, ohne auf Antworten zu warten. Eine fehlerhafte Serverimplementierung kann jedoch zu Problemen führen. Ein Server könnte sich auf eine implizite Zustandsmaschine verlassen, was zu Verwirrung bei der Bearbeitung mehrerer gleichzeitiger Anfragen führt und zur falschen Annahme oder Ablehnung von E-Mails führt. Der Artikel analysiert die Ursache dieses potenziellen Problems und verweist auf die Diskussion über Deadlocks beim Pipelining in RFC 2920. Entwickler werden daran erinnert, Pipelining sorgfältig zu handhaben, um Fehler aufgrund unzureichender Zustandsverwaltung oder Pufferprobleme zu vermeiden.

Mehr lesen
Entwicklung

Go's io.Reader-Effizienz: Ein Kampf mit Indirektion und Typ-Assertions

2025-05-19

Viele Go-Funktionen verwenden io.Reader als Eingabe, wodurch Streaming ermöglicht und das Laden aller Daten in den Speicher vermieden wird. Wenn man die Bytes jedoch bereits hat, ist deren direkte Verwendung effizienter. Dieser Artikel beschreibt die Erfahrung des Autors beim Dekodieren von Bildern mit libavif und libheif. Aus Gründen der Einfachheit wurden die einfachen Speicherinterfaces verwendet, aber die Go-Funktion image.Decode prüft, ob eine Peek-Funktion in io.Reader vorhanden ist, und packt sie mit bufio.Reader ein, wenn dies nicht der Fall ist, wodurch die direkte Verwendung von bytes.Reader verhindert wird. Der Autor verwendet Typ-Assertions und unsafe.Pointer, um bufio.Reader und bytes.Reader zu umgehen und eine Null-Kopie zu erreichen. Der Artikel hebt jedoch Probleme bei der Typüberprüfung und dem Interface-Design von Go hervor, einschließlich der daraus resultierenden "Shadow APIs".

Mehr lesen
Entwicklung

Entwicklung eines ASUS ACPI WMI-Treibers für die Lüftersteuerung unter OpenBSD

2025-05-11

Der Autor beschreibt seine Erfahrung beim Schreiben eines ASUS ACPI WMI-Treibers für OpenBSD, um die Lüftergeschwindigkeit seines Laptops zu steuern. Der Prozess beinhaltete die Bewältigung von Herausforderungen mit der Byte-Reihenfolge von ACPI und WMI, die Verwendung von acpidump und iasl zur Analyse des ACPI-Codes des Systems und schließlich die erfolgreiche Steuerung der Lüftergeschwindigkeit. Der Autor vergleicht die Ansätze zur Treiberentwicklung unter Linux und FreeBSD und hebt die praktische Codeorganisation von OpenBSD hervor.

Mehr lesen
Entwicklung Treiberentwicklung

Tieftauchen: Verfolgung des Systemaufrufs `write()` in OpenBSD

2025-03-29

Dieser Artikel taucht tief in die Low-Level-Implementierung des Systemaufrufs `write()` in OpenBSD ein. Ausgehend vom `write()`-Aufruf im Benutzerraum verfolgt er den Weg der Daten durch den Kernel und beschreibt detailliert den vollständigen Pfad vom Systemaufruf bis zum Schreiben der Daten auf eine NVMe-Festplatte. Der Artikel enthüllt eine Kette von Kernel-Funktionsaufrufen, darunter `mi_syscall`, `sys_write`, `dofilewritev`, `vn_write`, `ffs_write`, `uiomove`, `bdwrite`, `syncer`, `bwrite`, `ufs_strategy`, `spec_strategy`, `sdstrategy` und schließlich den NVMe-Treiber. Er veranschaulicht die Transformation und Übertragung von Daten über verschiedene Abstraktionsebenen und hebt wichtige technische Details wie Caching-Mechanismen und DMA-Übertragungen hervor.

Mehr lesen
Entwicklung Systemaufruf