title: Concurrency Control for High-Performance Storage Engines
Creators: name: Alhomssi, Adnan
Publisher: name: Friedrich-Alexander-Universität Erlangen-Nürnberg (FAU)
Year: 2024

description: Historically, storage engines were constrained by limited DRAM capacity and the slow hard disk drives, which led to the development of disk-based system architectures. The emergence of many-core CPUs, along with the increased affordability and performance of PCIe-attached NVMe SSDs, has led to the development of high-performance storage engines. These engines demonstrate that with a redesigned buffer manager, systems can achieve in-memory performance levels when the working set fits within the buffer pool, while gracefully degrading with larger data sets. However, to fully exploit modern hardware, a complete redesign of all components of traditional storage engines is necessary. In this thesis, we rethink concurrency control for this new emerging class of high-performance storage engines. At a high level, we focus on Multi-Version Concurrency Control (MVCC), specifically snapshot isolation commit protocol, dependency tracking, version storage, and garbage collection. On a lower level, we address the scalability and space utilization of B-Tree indexes in storage engines. For scalable MVCC, we propose OSIC, a commit protocol for snapshot isolation that efficiently scales to more concurrent transactions than the number of CPU cores by minimizing cross-worker communication. This allows us to harness the increasing number of IOPS that modern flash drives offer. Additionally, we suggest a commit dependency tracking mechanism that combines distributed logging with Early Lock Release to reduce abort rate and latency. For robust performance in mixed workloads, we propose a storage layer that automatically adjusts to user workloads at the tuple level without requiring manual user intervention. This includes removing tombstones from the OLTP hot path and an adaptive version storage and garbage collection scheme. We also address B-Tree node unnecessary write contention through node splitting and improve space utilization by merging underfull sibling nodes at eviction.
description: Historisch gesehen waren Speichersysteme (Storage Engines) durch begrenzte DRAM-Kapazität und die langsame Festplattenlaufwerke eingeschränkt, was zur Entwicklung von diskbasierten Systemarchitekturen führte. Das Aufkommen von Many-Core-CPUs sowie die gestiegene Erschwinglichkeit und Leistung von PCIe-gebundenen NVMe-SSDs führten zur Entwicklung von Hochleistungsspeichersystemen. Diese Engines zeigen, dass Systeme mit einem neu gestalteten Puffermanager nahezu in-Memory-Performance erreichen können, wenn der Arbeitsdatensatz in den Puffer passt, und sich bei größeren Datensätzen mäßig verlangsamen. Um jedoch die moderne Hardware voll auszuschöpfen, ist eine vollständige Neugestaltung aller Komponenten herkömmlicher Speichersysteme erforderlich. In dieser Arbeit gestalten wir die Nebenläufigkeitskontrolle für diese aufstrebende Klasse von Speichersystemen neu. Auf einer hohen Ebene konzentrieren wir uns auf die Multi-Version Concurrency Control (MVCC), insbesondere auf das Snapshot Isolation Commit Protokoll, die Speicherung von Versionen, die Abhängigkeitsverfolgung und Garbage Collection. Auf einer niedrigeren Ebene adressieren wir die Skalierbarkeit und den Speicherplatzverbrauch von B-Baum Indexstrukturen in Speichersystemen. Für skalierbare MVCC schlagen wir OSIC vor, ein Commit-Protokoll für Snapshot Isolation, das effizient skaliert und mehr nebenläufige Transaktionen als die Anzahl der CPU-Kerne ermöglicht, indem es die Kommunikation zwischen Workers minimiert. Dies ermöglicht es uns, die steigende Zahl von IOPS zu nutzen, die moderne Flash-Laufwerke bieten. Darüber hinaus schlagen wir einen Mechanismus zur Verfolgung von Commit-Abhängigkeiten vor, der verteiltes Logging mit Early Lock Release integriert, um die Abbruchrate und die Latenz der Transkationen zu reduzieren. Für robuste Leistung in gemischten HTAP Workloads schlagen wir eine Storage Layer vor, die sich automatisch auf Benutzer-Workloads auf Tupel-Ebene anpasst, ohne manuelles Eingreifen des Benutzers zu erfordern. Dies umfasst das Entfernen von Tombstones aus dem OLTP-Hot Path und ein adaptives Versions Storage und Garbage Collection Schema. Wir adressieren auch unnötigen Schreibkonflikt auf B-Baum Knoten durch Knotenaufteilung und verbessern die Speichernutzung, indem wir unterausgelastete Geschwisterknoten beim Auslagern zusammenführen.