32-Bit-Pointer auf 64-Bit-Linux senken den Speicherverbrauch um 25 Prozent
Die x32-ABI ermöglicht es Anwendungen, 32-Bit-Pointer zu verwenden und dabei 64-Bit-Register beizubehalten. Dies reduziert die RAM-Nutzung erheblich, ohne Geschwindigkeitseinbußen in Kauf nehmen zu müssen.
Automatisch aus dem englischen Original übersetzt.
Der Software-Ingenieur Alex Alejandre hat kürzlich demonstriert, dass das Kompilieren der Programmiersprache Janet mit der Linux-x32-Application-Binary-Interface (ABI) den Speicherverbrauch um etwa 21 Prozent senkt. Diese Optimierung nutzt 32-Bit-Pointer auf 64-Bit-Systemen, behält vergleichbare Ausführungsgeschwindigkeiten bei und verkleinert den Speicherbedarf von Heap-Objekten. Die Ergebnisse deuten auf einen praktikablen Weg hin, um eine effizientere Ressourcennutzung bei Skripten, Dienstprogrammen und Daemons unter Linux zu erreichen.
Was passiert ist
Alejandre testete die Auswirkungen des Compiler-Flags -mx32 auf Janet, eine dynamische Programmiersprache, die für ihr leichtgewichtiges Design bekannt ist. Im Standard-64-Bit-Modus verwendet Janet „Nanboxing“, um Werte in 8 Bytes zu packen, was den Speicherverbrauch bereits optimiert. Der Wechsel zur x32-ABI führte jedoch zu weiteren Reduktionen, da Objekt-Header und Pointer verkleinert werden. Die Tests zeigten eine Speicherreduzierung zwischen 8 und 32 Prozent, mit einer durchschnittlichen Einsparung von 21 Prozent. Die Leistung blieb stabil und reichte von 13 Prozent langsamer bis 10 Prozent schneller als beim nativen 64-Bit-Build.
Im Gegensatz dazu führte die Verwendung des traditionellen 32-Bit-Kompilierungsflags (-x32) zu einem erheblichen Leistungsabfall, der die Geschwindigkeit halbierte. Dies unterstreicht den einzigartigen Vorteil der x32-ABI: Sie behält die breiteren Universalregister und den Befehlssatz von x86-64 bei, während kleinere Pointer verwendet werden. Alejandre merkte an, dass dieser Ansatz besonders effektiv für pointerlastige Heaps ist, wo die Verkleinerung der Pointergröße direkt zu weniger Speicherdruck und besserer Cache-Nutzung führt.
Das Experiment deckte auch Einschränkungen im aktuellen Speichermanagement von Janet auf. Janet-Heap-Objekte verwenden derzeit 16 Bytes zur Unterstützung des Garbage Collectors, einschließlich Flags, Padding und Verknüpfungs-Pointern. Obwohl die x32-ABI hilft, würden tiefgreifendere Optimierungen Änderungen am Allocator oder an der Garbage-Collection-Strategie erfordern. Alejandre wies darauf hin, dass malloc aus glibc Overhead hinzufügt und Allokationen auf Vielfache von 16 Bytes aufrundet, was einige potenzielle Einsparungen für bestimmte Datenstrukturen wie Structs begrenzt. Tabellen und bestimmte Tuples profitieren jedoch weiterhin von der reduzierten Pointergröße.
Wie es funktioniert
Die x32-ABI ist ein Linux-spezifisches Feature, das es Programmen ermöglicht, im 64-Bit-Modus zu laufen, aber 32-Bit-Pointer zu verwenden. Normalerweise nutzen 64-Bit-Systeme 8-Byte-Pointer, was Speicher verschwenden kann, wenn Daten adressiert werden, die 4 Gigabyte nicht überschreiten. Durch den Wechsel zu 4-Byte-Pointern reduzieren Anwendungen die Größe jeder Datenstruktur, die eine Referenz enthält. Diese Reduktion bedeutet, dass mehr Daten in den CPU-Cache passen, was die Leistung verbessern kann, trotz des kleineren Adressraums.
Um dieses Feature zu nutzen, muss der Linux-Kernel mit CONFIG_X86_X32_ABI kompiliert werden, was die erforderlichen Syscall-Eintrittspunkte bereitstellt. Compiler stellen diese Fähigkeit über das Flag -mx32 zur Verfügung. Im Gegensatz zum reinen 32-Bit-Modus behält x32 den vollständigen Satz an 64-Bit-Registern und Anweisungen bei und vermeidet so die Leistungsengpässe, die mit der Legacy-32-Bit-Ausführung verbunden sind. Dies macht es zu einer attraktiven Option für Server und Desktop-Anwendungen, die pro Prozess nicht mehr als 4 GB Speicher adressieren müssen.
Wichtige Details
- Das Flag
-mx32reduzierte Janets RAM-Nutzung im Durchschnitt um 21 Prozent, mit Ergebnissen zwischen 8 und 32 Prozent. - Die Ausführungsgeschwindigkeit blieb mit nativen 64-Bit-Builds vergleichbar und variierte von 13 Prozent langsamer bis 10 Prozent schneller.
- Traditionelle 32-Bit-Kompilierung (
-x32) verursachte einen Leistungsabfall von 50 Prozent, was sie für leistungs-sensitive Aufgaben ungeeignet macht. - Die x32-ABI erfordert Kernel-Support unter Linux via
CONFIG_X86_X32_ABIund ist bei Distributionen wie Debian und Arch Linux standardmäßig deaktiviert. - Die größten Speichereinsparungen erzielen Anwendungen mit pointerlastigen Heaps, wie solche, die viele kleine Objekte verwalten.
- Der Overhead von Glibcs
mallocund die Ausrichtungsanforderungen von 16 Bytes begrenzen einige potenzielle Einsparungen für bestimmte Datenstrukturen wie Structs.
Warum das wichtig ist
Für Entwickler, die Infrastruktur, Skripte oder langlaufende Daemons erstellen, wirkt sich die Speichereffizienz direkt auf Kosten und Skalierbarkeit aus. Eine Reduzierung des RAM-Verbrauchs um 21 Prozent ermöglicht es, mehr Instanzen auf derselben Hardware laufen zu lassen oder den Bedarf an Überdimensionierung zu senken. Dies ist besonders relevant für containerisierte Umgebungen, in denen Speicherlimits streng eingehalten werden müssen. Die x32-ABI bietet einen Weg, diese Einsparungen zu erzielen, ohne Code neu zu schreiben oder Algorithmen zu ändern, sondern einfach durch Anpassung der Kompilierungsflags.
Die Unternutzung von x32 stellt eine verpasste Chance für das Linux-Ökosystem dar. Während die meisten Software sauber für x32 kompiliert wird, bedeutet das Fehlen vorgefertigter Pakete, dass Entwickler Abhängigkeiten selbst kompilieren müssen. Diese Hürde schreckt vor der Adoption ab, obwohl die Vorteile für viele Workloads klar sind. Wenn große Distributionen die x32-Unterstützung standardmäßig aktivieren würden, könnte dies zu weitreichenden Effizienzgewinnen in der Serverlandschaft führen und den Energieverbrauch sowie die Hardware-Anforderungen senken.
Was Sie tun können
- Prüfen Sie, ob Ihr Linux-Kernel x32 unterstützt, indem Sie nach
CONFIG_X86_X32_ABIin Ihrer Kernel-Konfiguration suchen. - Experimentieren Sie mit dem Kompilieren kleiner Dienstprogramme oder Daemons unter Verwendung des Flags
-mx32, um Speicher und Leistung zu messen. - Prüfen Sie, ob Ihre Linux-Kernel x32 unterstützt, indem Sie nach
CONFIG_X86_X32_ABIin Ihrer Kernel-Konfiguration suchen. - Experimentieren Sie mit dem Kompilieren kleiner Dienstprogramme oder Daemons unter Verwendung des Flags
-mx32, um Speicher und Leistung zu messen.



