<?xml-model href='http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng' schematypens='http://relaxng.org/ns/structure/1.0'?><TEI xmlns="http://www.tei-c.org/ns/1.0">
	<teiHeader>
		<fileDesc>
			<titleStmt><title level='a'>RackBlox: A Software-Defined Rack-Scale Storage System with Network-Storage Co-Design</title></titleStmt>
			<publicationStmt>
				<publisher>ACM</publisher>
				<date>10/23/2023</date>
			</publicationStmt>
			<sourceDesc>
				<bibl> 
					<idno type="par_id">10525145</idno>
					<idno type="doi">10.1145/3600006.3613170</idno>
					
					<author>Benjamin Reidys</author><author>Yuqi Xue</author><author>Daixuan Li</author><author>Bharat Sukhwani</author><author>Wen-Mei Hwu</author><author>Deming Chen</author><author>Sameh Asaad</author><author>Jian Huang</author>
				</bibl>
			</sourceDesc>
		</fileDesc>
		<profileDesc>
			<abstract><ab><![CDATA[Software-defined networking (SDN) and software-defined flash (SDF) have been serving as the backbone of modern data centers. They are managed separately to handle I/O requests. At first glance, this is a reasonable design by following the rack-scale hierarchical design principles. However, it suffers from suboptimal end-to-end performance, due to the lack of coordination between SDN and SDF.In this paper, we co-design the SDN and SDF stack by redefining the functions of their control plane and data plane, and splitting up them within a new architecture named Rack-Blox. RackBlox decouples the storage management functions of flash-based solid-state drives (SSDs), and allow the SDN to track and manage the states of SSDs in a rack. Therefore, we can enable the state sharing between SDN and SDF, and facilitate global storage resource management. RackBlox has three major components: (1) coordinated I/O scheduling, in which it dynamically adjusts the I/O scheduling in the storage stack with the measured and predicted network latency, such that it can coordinate the effort of I/O scheduling across the network and storage stack for achieving predictable endto-end performance; (2) coordinated garbage collection (GC), in which it will coordinate the GC activities across the SSDs in a rack to minimize their impact on incoming I/O requests;(3) rack-scale wear leveling, in which it enables global wear leveling among SSDs in a rack by periodically swapping data, for achieving improved device lifetime for the entire rack. We implement RackBlox using programmable SSDs and switch. Our experiments demonstrate that RackBlox can]]></ab></abstract>
		</profileDesc>
	</teiHeader>
	<text><body xmlns="http://www.tei-c.org/ns/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink">
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>The software-defined infrastructure has become the new standard for managing data centers, as it provides flexibility and agility for platform operators to customize hardware resources for applications <ref type="bibr">[15,</ref><ref type="bibr">35,</ref><ref type="bibr">65]</ref>. As the backbone technology, software-defined networking (SDN) allows network operators to configure and manage network resources through programmable switches <ref type="bibr">[14,</ref><ref type="bibr">33,</ref><ref type="bibr">34,</ref><ref type="bibr">48]</ref>. Since SDN has demonstrated its benefits, software-defined storage (SDS) <ref type="bibr">[65,</ref><ref type="bibr">79,</ref><ref type="bibr">90]</ref> has also been developed. A typical example is software-defined flash (SDF) <ref type="bibr">[28,</ref><ref type="bibr">53,</ref><ref type="bibr">65,</ref><ref type="bibr">71]</ref>.</p><p>Similar to SDN, SDF enables upper-level software to manage the low-level flash chips for improved performance and resource utilization <ref type="bibr">[28,</ref><ref type="bibr">44,</ref><ref type="bibr">65]</ref>. Since the cost of flash chips has dramatically decreased while offering orders of magnitude better performance than conventional hard disk drives (HDDs), they are becoming the mainstream choice in largescale data centers <ref type="bibr">[25,</ref><ref type="bibr">38,</ref><ref type="bibr">43]</ref>.</p><p>Both SDN and SDF have their own control plane and data plane, and provide programmability for developers to define and implement their policies for resource management and arXiv:2309.06513v1 [cs.OS] 12 Sep 2023 scheduling. However, SDN and SDF are managed separately in modern data centers. At first glance, this is reasonable by following the rack-scale hierarchical design principles. However, it suffers from suboptimal end-to-end performance, due to the lack of coordination between SDN and SDF.</p><p>Although both SDN and SDF can make the best effort to achieve their quality of service, they do not share their states and lack global information for storage management and scheduling, making it challenging for applications to achieve predictable end-to-end performance. Prior studies <ref type="bibr">[6,</ref><ref type="bibr">79]</ref> have proposed various software techniques such as token bucket and virtual cost for enforcing performance isolation across the rack-scale storage stack. However, they treat the underlying SSDs as black boxes, and cannot capture their hardware events, such as garbage collection (GC) and I/O scheduling in the storage stack. Thus, it is still hard to achieve predictable performance across the entire rack.</p><p>In this paper, we propose a new software-defined architecture, named RackBlox, to exploit the capabilities of SDN and SDF in a coordinated fashion. As both SDN and SDF share a similar architecture&#347;the control plane is responsible for managing the programmable devices, and the data plane is responsible for processing I/O requests&#347;we can integrate and co-design both SDN and SDF, and redefine their functions to improve the efficiency of the entire rack-scale storage system. RackBlox does not require new hardware changes, as both SDN and SDF today have offered the flexibility to redefine the functions of their data planes.</p><p>To develop RackBlox, we first decouple the functions of the storage management (i.e., flash translation layer) of SDF, and integrate appropriate functions such as garbage collection and wear leveling into the control plane of top-of-rack (ToR) switches in the SDN. Such a new software-defined architecture enables state sharing between SDN and SDF, and facilitates the global storage resource management in a rack. This is compatible with storage virtualization by enabling the state tracking of virtualized SSD instances in SDN. Therefore, we can coordinate the efforts of I/O scheduling across the entire rack. RackBlox tracks the elapsed time in the programmable switches with In-band Network Telemetry (INT) <ref type="bibr">[1]</ref>, adapts the I/O scheduling in the data plane of SDF, and predicts the response time from the storage devices back to the client. Therefore, RackBlox can manage the end-to-end latency and offer predictable performance.</p><p>RackBlox further enables coordinated GC among the rack of SSDs to minimize the impact of GC on application performance. RackBlox has the global information of the storage states, which provides the convenience to coordinate GC events among all the SSDs in a rack. Upon GC events, Rack-Blox takes advantage of the data replicas in the same rack, and enables the ToR switch to redirect I/O requests to the other data replicas. Therefore, the expensive GC activities can be alleviated from the critical path. RackBlox employs different GC policies for different performance isolation guarantees of virtualized SSD instances.</p><p>RackBlox also enables rack-scale wear leveling to ensure a uniform lifetime of SSDs in a rack. As the write traffic to each SSD can be different, it will cause wear imbalance between SSDs. In addition, platform operators have to replace unhealthy or failed SSDs with new SSDs, making the wear imbalance even harder to manage. RackBlox develops a twolevel wear leveling mechanism. It balances wear within each individual SSD in a storage server as well as across SSDs in the rack. Instead of swapping SSDs frequently, RackBlox periodically swaps the SSD that has incurred the maximum wear with the SSD that has the minimum rate of wear.</p><p>We implement RackBlox with a programmable Tofino switch and programmable SSDs (i.e., open-channel SSDs). We evaluate RackBlox with network traces collected from various data centers and a variety of data-intensive applications. Our experiments show that RackBlox reduces the tail latency of end-to-end I/O requests by up to 5.8&#215;, and can achieve a uniform lifetime for a rack of SSDs without introducing much additional performance overhead. In summary, we make the following contributions in this paper.</p><p>&#8226; We propose a new software-defined rack-scale storage system by decoupling the storage management functions of SDF, and co-designing them with SDN. &#8226; We enable state sharing between SDN and SDF, and coordinate the efforts of I/O request scheduling across the full rack for achieving predictable end-to-end performance. &#8226; We present a coordinated GC mechanism for a rack of SSDs, it enables SDN to redirect I/O requests to data replicas to minimize the GC impact on storage performance. &#8226; We develop a rack-scale wear leveling mechanism for ensuring the uniform lifetime of a rack of SSDs. &#8226; We show the benefits of RackBlox by developing a real system prototype with programmable switch and SSDs.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Background and Motivation</head><p>We first introduce the background of SDN and SDS, then the motivation for software-defined network/storage co-design.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.1">Software-Defined Networking</head><p>Modern data centers have seen a trend that software-defined networking (SDN) has become the new standard for network management, in which the programmable switch is the backbone technology that allows platform operators to define their own packet formats and functions for processing network traffic without affecting the line-rate throughput <ref type="bibr">[34,</ref><ref type="bibr">36]</ref>. SDN has been deployed in real data centers such as Alibaba cloud <ref type="bibr">[47,</ref><ref type="bibr">66]</ref> and Google data centers <ref type="bibr">[5]</ref>. SDN has a control plane and data plane. The control plane is in charge of network management and protocol definition, while the data plane is responsible for data transfer and runtime statistics collection. The programmable switch usually has reconfigurable hardware such as a programmable ASIC that supports domain-specific languages like P4 <ref type="bibr">[14]</ref>. It supports various network flow scheduling policies for flexible traffic management and performance isolation <ref type="bibr">[4,</ref><ref type="bibr">27,</ref><ref type="bibr">89]</ref>. As shown in Figure <ref type="figure">1</ref>, all the servers in the same rack are connected by a Top-of-Rack (ToR) switch. These ToR switches are connected with aggregation switches and core switches in a hierarchical manner. In this paper, we focus on the ToR switch, and co-design network and storage stack in a rack.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.2">Software-Defined Storage</head><p>Recent studies have shown that making software aware of the underlying storage devices can significantly improve the storage performance and resource efficiency <ref type="bibr">[28,</ref><ref type="bibr">65,</ref><ref type="bibr">84]</ref>. This is known as software-defined storage (SDS), which enables data centers to unlock the potential of storage devices by enabling the software to directly interact with storage devices and control their internal operations. Software-defined flash (SDF), which is built on SSDs, is a typical example of SDS, and has seen deployment in industry data centers <ref type="bibr">[18,</ref><ref type="bibr">49]</ref>.</p><p>In this paper, we focus on SDF, because flash-based SSDs are becoming indispensable parts of modern computer systems. An SSD has three major components: a set of flash memory packages, an SSD controller having an embedded processor with device memory, and flash controllers. As shown in Figure <ref type="figure">2</ref>, each SSD has multiple channels and each channel can receive and process I/O commands independently. Each channel is shared by multiple flash memory packages. Each package is made of multiple chips. Each chip has multiple flash blocks. With SDF, an SSD can be virtualized into multiple virtual SSD instances (vSSDs), and each can be mapped to a set of SSDs, flash channels, or flash chips.</p><p>Due to the nature of flash memory, when a free page is written, that page is no longer available for future writes until that page is erased. However, erase operations can be performed only at block granularity, which are time-consuming. Thus, writes are issued to free pages erased in advance (i.e., out-of-place write) rather than waiting for the expensive erase operation for every write. And garbage collection (GC) will be performed later to erase the stale data on SSDs. Since an SSD channel cannot issue new I/O requests during GC, minimizing the negative impact of GC events is critical to storage performance. In addition, as each flash block has limited endurance, it is important for the blocks to age uniformly (i.e., wear leveling).</p><p>Data Plane vSSD1 vSSD2 vSSD3 vSSD4 Control Plane Storage Management (Flash Translation Layer) Flash Flash Flash Controller Channel 0 Flash Flash Flash Controller Channel 1 Flash Flash Flash Controller Channel 2 Flash Flash Flash Controller Channel 3 SSDs have the Flash Translation Layer (FTL) to manage flash blocks and maintain the logical-to-physical address mappings. Unlike conventional SSDs that implement the FTL in the device firmware, SDF exposes the FTL to the upper-level software, and enables the software to manage the flash chips (see Figure <ref type="figure">2</ref>).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.3">Why Network-Storage Co-Design</head><p>In modern data centers, the SDN and SDF are managed separately to handle I/O requests across the network and storage stack, respectively. Such an architecture suffers from suboptimal performance and misses the opportunities offered by the software-defined rack for three major reasons.</p><p>First, as SDN and SDF are deployed as independent components, achieving predictable end-to-end performance is challenging, due to the lack of coordination between the two components. SDN and SDF have redundant control plane policies, such as I/O scheduling, which may contradict between the network and storage stack and break service-level objectives (SLOs). And optimizing such policies without coordination is suboptimal due to incomplete knowledge and redundant effort. Ideally, as we forward I/O requests in SDN, with the knowledge of the storage status (e.g., busy, idle, or predicted performance), it can make smarter decisions (e.g., early redirection to data replicas). Similarly, as SDF schedules the received I/O requests, the measured network latency of these I/O requests can help the SDF to adjust the I/O scheduling to meet the SLO for end users.</p><p>Second, although prior studies such as IOFlow <ref type="bibr">[79]</ref> and VDC <ref type="bibr">[6]</ref> proposed software-based methods like token bucket rate limiting to enforce the performance isolation between I/O flows, they cannot capture the underlying hardware events such as GC and I/O scheduling in SSDs, due to the lack of state sharing between SDN and SDF. And software-based coordination incurs extra network round-trip delay and host software overhead (see our evaluation in &#167;4).</p><p>Third, it is feasible to co-design and coordinate the network and storage stack today, as both programmable switches and programmable SSDs have enabled developers to program and configure the network and storage stack respectively.</p><p>In this work, we integrate the storage management of SDF into SDN as shown in Figure <ref type="figure">3</ref>, while preserving the programmability and simplicity for the new infrastructure.</p><p>Switch Data Plane L2/L3 Routing Data Cache Network Statistics Network Control Plane &#8230; ToR Switch SDF Storage Server Storage Server Storage Server Coordinated I/O Scheduling Coordinated GC Rack-Scale Wear Leveling Global SSD-Level Mapping Table SSD SSD SSD SSD SSD SSD Local Wear Leveling Device-Level Mapping SSD Virtualization </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">RackBlox Design and Implementation</head><p>RackBlox provides a holistic approach that can achieve predictable end-to-end performance and improve storage management at scale. As we develop RackBlox based on modern SDN and SDF, we have to overcome the following challenges.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1">Design Challenges of RackBlox</head><p>&#8226; It is unclear how the functions of storage management should be decoupled and placed across SDN and SDF. The control plane of SDF has many functions, including wear leveling, GC, block allocation, and block management. Placing all the storage functions into SDN will inevitably increase the burden of SDN. Thus, we have to carefully decide the partitioning and placement of SDF functions. &#8226; The hardware resources of programmable devices are limited. Specifically, the on-chip memory (tens of MBs) and compute resource are limited in programmable switches and SSD controllers, due to the hardware cost and power budget. Thus, we have to carefully define the data structures for the network/storage co-design. &#8226; As we enable the coordinated storage management between SDN and SDF, we must preserve their programmability, ease-of-use, and original advantages. Thus, RackBlox should be compatible with hardware upgrades.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2">RackBlox Overview</head><p>We rethink the software-defined network and storage hierarchy (see Figure <ref type="figure">3</ref>), and propose a new software-defined architecture, RackBlox. We first decouple the functions of the storage management (i.e., flash translation layer) of SSDs, and integrate the appropriate functions such as GC and wearleveling into the SDN ( &#167;3.</p><p>3). Such a new architecture enables state sharing between SDN and SDF. It utilizes the capability of SDN to enable global storage resource management in a rack. Thus, we can coordinate the efforts of I/O scheduling across the entire rack. Henceforth, the SDN and SDF can manage the end-to-end request delay, and provide precise feedback to the I/O scheduler on the storage servers ( &#167;3.4). The coordinated I/O scheduling mechanism improves the end-to-end I/O performance and enables intelligent decisionmaking in advance. To alleviate the performance interference (a) Virtualized SSDs ... CH CH CH CH CH vSSD-1 vSSD-2 vSSD-3 Applications Virtual SSD (vSSD) Address Mapping (LBA PBA) Local Wear Leveling (b) vSSD Organization Flash Chips caused by the GC, RackBlox enables coordinated GC by exploiting the data replicas in a rack ( &#167;3.5). As the ToR switch has the global states of the SSDs in a rack, it can redirect I/O requests to the corresponding replica upon GC. Similarly, RackBlox enables rack-scale wear leveling, as it has the knowledge of the wear of SSDs in a rack ( &#167;3.6). It has a two-level wear leveling mechanism: a local wear balancer for ensuring the wear balance in each storage server, and a global wear balancer that reduces the wear variance across the entire rack. These wear balancers work at different levels and cooperate to ensure rack-scale wear leveling.</p><p>RackBlox manages SSDs at rack-scale for three major reasons. First, storage systems are commonly deployed at rack scale, making this a natural granularity for storage management <ref type="bibr">[7,</ref><ref type="bibr">23]</ref>. Second, rack-scale management is facilitated by the programmable ToR-switch with the capability to observe the rack's network and I/O traffic. Third, existing rack-aware replica placement schemes make it a natural choice for coordinating the GC of SSDs across the rack. We now discuss each proposed technique in RackBlox as follows.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.3">Decoupling the Storage Management</head><p>When decoupling storage management, we need to consider two factors: (1) whether integrating an SDF function into SDN will benefit from the coordination or not; and (2) if yes, the integration should consume minimum precious hardware resources in the switch. We now discuss how RackBlox decouples storage management between SDF and SDN to maximize the benefits of co-design while retaining the original flexibility and modularity of SDN and SDF. Storage management in SDF. As the ToR switch has limited hardware resources, we keep the essential functions for the vSSD management locally on storage servers (see Figure <ref type="figure">3</ref>). They include SSD virtualization, device-level mapping, and local wear leveling for SSDs in a server.</p><p>With SSD virtualization, a programmable SSD can be virtualized into two types of vSSDs: hardware-isolated vSSDs, and software-isolated vSSDs. A hardware-isolated vSSD instance is mapped to a set of flash channels, as the channellevel parallelism in SSDs provides the strongest performance isolation (vSSD-1 in Figure <ref type="figure">4</ref>). A software-isolated vSSD is mapped to a set of flash chips, and it will share the flash channels with other software-isolated vSSDs, such as vSSD-2 and vSSD-3 shown in Figure <ref type="figure">4</ref>. It relies on the software-isolation</p><p>vSSD_ID GC Status Replica vSSD_ID vSSD1 1 vSSD12 ... ... ... vSSD_ID GC Status Server IP vSSD1 1 10.0.0.16 ... ... ... vSSD12 0 10.0.0.20 (a) Replica Table (b) Destination Table techniques such as token bucket rate limiting to offer relatively weaker performance isolation. RackBlox supports both hardware-isolated and software-isolated vSSD instances to support different cloud storage services.</p><p>For each vSSD, it has its own address mapping table (devicelevel mapping) and local wear leveling (i.e., the default wear leveling) for flash block management, as shown in Figure <ref type="figure">4b</ref>. We keep these functions in the SDF stack, as they are more convenient when handled by storage servers. As for other FTL functions, such as bad block management and error correction code (ECC) of an SSD, we leave them to the SSD firmware, as the hardware engine in SSD controllers is more efficient in managing them.</p><p>RackBlox enables data replication at vSSD granularity. This is a natural design choice, as the vSSD abstraction has been shown to simplify the storage management of flash blocks, offer flexibility for mapping vSSD instances to underlying flash chips, and incur limited metadata overhead <ref type="bibr">[28]</ref>. Storage management in ToR switch. To make the ToR switch aware of the states of SSDs in a rack, we maintain a vSSD-level mapping table in its data plane, as shown in Figure <ref type="figure">5</ref>. The states tracked in the vSSD-level mapping tables provide the essential knowledge for the coordinated I/O scheduling and coordinated GC.</p><p>Specifically, RackBlox maintains two tables in the ToR switch as shown in Figure <ref type="figure">5</ref>: 1) replica table, which tracks the GC status (1 byte) of each vSSD and its replica vSSD ID (4 bytes); 2) destination table, which mainly tracks the corresponding server IP (4 bytes) of each vSSD, and the GC status (1 byte) of the vSSD. As this mapping table is managed at vSSD granularity, its storage cost is small, which can be stored in the on-chip memory of the programmable switch. Given that a rack usually has 64 servers or less, each server has 16 SSDs, and each SSD can be virtualized into 128 vSSDs, we will have up to 64K vSSDs in a rack 1 . The maximum size of each table is 1.3MB. The total size of these tables for RackBlox is much less than the available SRAM capacity (tens of MBs) in modern programmable switches. 1 A typical server in data centers today has 16 PCIe slots, it can host 16 SSDs. Assume each SSD has 4TB, the minimum size of a vSSD is 32GB, therefore, each SSD can host up to 128 vSSDs. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>State communication between SDN and SDF.</head><p>To facilitate the state communication between the ToR switch and storage servers in the same rack, RackBlox leverages the programmability of SDN, and has its own network packet format based on regular network protocols, as shown in Figure <ref type="figure">6</ref>. The packet has one 1-byte OP field to indicate different operations as shown in Table <ref type="table">1</ref>, one 4-byte field to indicate the target vSSD ID, and one 4-byte field (LAT ) for storing the measured network latency for the packets transferred through the data center network. The payload will be filled with different values, according to the operation specified in RackBlox header. We will discuss the purpose of each operation throughout the paper.</p><p>The RackBlox header is part of the L4 payload. RackBlox uses existing L2/L3 routing protocols to route packets. As such, switches can forward RackBlox packets normally, and RackBlox is compatible with flow/congestion control and other network functionalities in the transport layer. We differentiate RackBlox packets in the ToR switch through a reserved TCP/UDP port.</p><p>To initialize RackBlox tables in the ToR switch, the storage servers send a packet that contains the create_vssd operation to the switch upon creating a new vSSD. The vSSD_ID field will store the ID of the newly created vSSD, the payload will include the 4-byte server IP, its replica vSSD ID, and the server IP of the replica vSSD. The replica vSSD ID and IP are allocated with the vSSD&#347;following the rack-aware replica placement scheme in rack-scale storage systems. The ToR switch will insert a new entry in the replica table and destination table, with GC states initialized as 0 (idle). Upon vSSD deletion, the storage server sends the del_vssd packet to the ToR switch to remove the corresponding entries in the RackBlox tables. As we serve I/O requests at runtime, RackBlox tables will be updated depending on the events.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.4">Coordinated I/O Scheduling</head><p>Although both SDN and SDF can make the best effort to achieve their quality of service (QoS), the lack of state sharing and coordination will cause suboptimal end-to-end performance and wasted effort on I/O scheduling. For instance, as SDN and SDF are independent, they do not share states of I/O requests, therefore, SDN may forward I/O requests to busy storage servers, although it is apparent that their end-to-end service-level objective is likely to be violated. This will exacerbate network congestion and increase the pressure of processing I/O requests on storage servers.</p><p>RackBlox enables the state sharing of I/O requests across SDN and SDF, and develops a coordinated I/O scheduling mechanism to improve end-to-end performance. It tracks the elapsed time in the programmable switches, adapts the I/O scheduling in the data plane of SDF to control the end-to-end delay for the request, and predicts the time it would take to transmit the response from the storage server to the client.</p><p>RackBlox tracks I/O requests across the entire stack: (1) &#119873; &#119890;&#119905; &#119905;&#119894;&#119898;&#119890; : the elapsed time in the network stack since the I/O request is issued until it reaches the storage server; (2) &#119878;&#119905;&#119900;&#119903;&#119886;&#119892;&#119890; &#119905;&#119894;&#119898;&#119890; : the delayed time in the I/O queue of the storage stack; (3) &#119875;&#119903;&#119890;&#119889;&#119894;&#119888;&#119905; &#119905;&#119894;&#119898;&#119890; : the time it takes to transfer the response back to the client over the network. To manage I/O scheduling in SDF, RackBlox uses &#119875;&#119903;&#119894;&#119900; &#119904;&#119888;&#8462;&#119890;&#119889; = (&#119873; &#119890;&#119905; &#119905;&#119894;&#119898;&#119890; + &#119878;&#119905;&#119900;&#119903;&#119886;&#119892;&#119890; &#119905;&#119894;&#119898;&#119890; + &#119875;&#119903;&#119890;&#119889;&#119894;&#119888;&#119905; &#119905;&#119894;&#119898;&#119890; ) as the scheduling priority. As RackBlox issues I/O requests from the queue in the storage stack, it selects the request with the maximum &#119875;&#119903;&#119894;&#119900; &#119904;&#119888;&#8462;&#119890;&#119889; value. RackBlox differs from state-of-the-art storage I/O scheduling schemes by considering the network latency to make the best effort to reduce the end-to-end latency <ref type="bibr">[17,</ref><ref type="bibr">19]</ref>.</p><p>In order to track &#119873; &#119890;&#119905; &#119905;&#119894;&#119898;&#119890; with low overhead, we use the Inband Network Telemetry (INT) available in programmable switches <ref type="bibr">[1]</ref>. It enables the network state collection in the data plane without intervention from the control plane. Rack-Blox uses INT to compute the sum of per-hop latency in the switches, since the routing and queuing latencies dominate the network latency <ref type="bibr">[24,</ref><ref type="bibr">29]</ref>. It embeds the measured network latency in the network packet being transferred to the storage server, following the network format in Figure <ref type="figure">6</ref>. As for &#119878;&#119905;&#119900;&#119903;&#119886;&#119892;&#119890; &#119905;&#119894;&#119898;&#119890; , RackBlox tracks the queuing delay for each I/O request in the queue of the storage stack.</p><p>To predict the time it will take to return the response to the client (&#119875;&#119903;&#119890;&#119889;&#119894;&#119888;&#119905; &#119905;&#119894;&#119898;&#119890; ), we develop a predictor using a simple yet effective sliding window algorithm. We track one sliding window for each vSSD with the average network latency of the 100 most recent incoming packets. We choose 100 packets because it is small enough to quickly detect changes in the network (e.g., network congestion), but large enough to smoothen outlier requests. We use incoming packets because they can better capture the factors causing network delays. We maintain separate windows for reads and writes as their outgoing packet sizes are different <ref type="bibr">[58,</ref><ref type="bibr">69,</ref><ref type="bibr">92]</ref>.</p><p>Our experiments with a variety of network traces in data centers <ref type="bibr">[32,</ref><ref type="bibr">59,</ref><ref type="bibr">67]</ref> (see &#167;3.7 for details) show that this approach effectively predicts the return latency. The predicted latency is within 25&#120583;s of the correct value 95% of the time (across all distributions) and 86.6% of the time in the worst case. The predictions are within 10% of the true latency in the worst case. Mispredictions primarily occur at the begin/end of congestion or with highly variables network patterns. We show the benefit of the coordinated I/O scheduling in &#167;4. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.5">Coordinated Garbage Collection</head><p>The GC overhead of SSDs is significant, as it blocks incoming I/O requests and seriously harms end-to-end latency <ref type="bibr">[50,</ref><ref type="bibr">64]</ref>.</p><p>For instance, a 4KB read request in SSDs can be completed in under 100 &#120583;s, but it may wait for a few milliseconds due to the GC. This is critical in data centers, where many applications have strict performance requirements <ref type="bibr">[13]</ref>.</p><p>The fundamental issue is that the upper-level system software fails to consider the underlying SSD behavior. Without coordination at rack scale, it is hard to optimize GC across replicas or redirect requests away from replicas executing GC, even though SDF exposes the underlying storage behavior. Since the ToR switch will forward each storage request entering the rack, it has the states of the SSDs in the rack, it is natural to coordinate GC across the SSDs with the switch.</p><p>Prior work has explored various techniques for coordinating GC between SSDs within servers [39&#347;41, <ref type="bibr">45,</ref><ref type="bibr">75,</ref><ref type="bibr">78,</ref><ref type="bibr">88]</ref>. These studies managed SSDs either spatially by reserving spare SSDs to serve requests or temporally by scheduling GC to ensure predictable latency for read requests. However, they did not enable GC coordination across servers at rack scale. Industry has been developing rack-scale storage solutions <ref type="bibr">[16,</ref><ref type="bibr">26,</ref><ref type="bibr">68,</ref><ref type="bibr">76]</ref>, however, to the best of our knowledge, they also lack GC coordination across data replicas.</p><p>As different levels of vSSD isolation (software vs. hardware) have different challenges, we will begin with coordinating GC for hardware-isolated vSSD instances and then extend it to software-isolated vSSDs.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.5.1">Coordinated GC for Hardware-Isolated vSSDs.</head><p>RackBlox coordinates GC between the replicas of each vSSD, as shown in Figure <ref type="figure">7</ref>. Since each hardware-isolated vSSD is mapped to one or more flash channels that run GC independently, GC in other vSSDs does not affect its performance. Thus, by coordinating GC per vSSD, we can achieve predictable performance. Coordinating GC at vSSD granularity also aligns with the granularity of data replication. If we keep at least one vSSD replica idle, we can ensure that one data replica can be accessed with predictable performance.</p><p>For each vSSD, we achieve predictable performance for storage requests by enabling request redirection (Figure <ref type="figure">7a</ref>). While requests are directed to idle replicas, other replicas of the vSSD may still run GC. Thus, the switch delays GC for one replica until another is ready to serve requests (Figure <ref type="figure">7b</ref>). Also, RackBlox enables background GC to utilize the idle cycles of SSDs (Figure <ref type="figure">7c</ref>).</p><p>We outline the packet processing workflow of SDN and SDF in Algorithm 1 and Algorithm 2. We examine RackBlox with two replicas in a single rack and one replica in another following the common rack-scale storage systems [7&#347;9, <ref type="bibr">23,</ref><ref type="bibr">56]</ref>. RackBlox can be extended to any number of replicas. Request Redirection. Upon receiving a packet, RackBlox queries the Replica Table (see &#167;3.3) to get the gc_status and replica for vssd_id. Writes are not redirected (Line 2-3 in Algorithm 1), but issued to all replicas for reliability and consistency <ref type="bibr">[7,</ref><ref type="bibr">22,</ref><ref type="bibr">23,</ref><ref type="bibr">56]</ref>. RackBlox supports different consistency models, and our implementation uses Hermes <ref type="bibr">[37]</ref> to ensure strong consistency between replicas and correctness when redirecting requests. We avoid long tail latencies for writes by utilizing existing DRAM caches in data center servers to absorb writes during GC <ref type="bibr">[22,</ref><ref type="bibr">45]</ref>. This follows the durability semantics of existing systems that primarily rely on replicas to ensure data durability <ref type="bibr">[46,</ref><ref type="bibr">63]</ref>. Writes are considered complete when all replicas have a DRAM copy and are flushed in the background (Line 2-4 in Algorithm 2).</p><p>For read requests, if the gc_status is set for the vssd_id, we query the Destination Table to get the gc_status for the replica vSSD (T1 in Figure <ref type="figure">7a</ref>). If the vSSD is not executing GC or if both the vSSD and its replica are executing GC, we forward the packet as is. Otherwise, we redirect the request to the replica using its destination IP in the Destination Table (T2 in Figure <ref type="figure">7a</ref>, Line 4-9 in Algorithm 1). I/O requests are scheduled locally with coordinated I/O scheduling (Line 5-6 in Algorithm 2). By redirecting requests, requests are served by replicas without suffering from the GC overhead.</p><p>While RackBlox maximizes the chance that at least one replica is available, it is possible that both replicas are executing GC. The techniques that submit requests to another rack in parallel can be applied to ensure high performance <ref type="bibr">[20]</ref>. In this paper, we focus on the intra-rack I/O scheduling. Delaying GC. Since all replicas receive the same writes, replicas may execute GC at the same time <ref type="bibr">[45]</ref>. Therefore, naive request redirection cannot alleviate the GC overhead. To overcome this issue, we leverage the shared states in the switch and empower the switch to delay the GC of a replica.</p><p>While delaying GC can ensure that two replicas do not execute their GC simultaneously, we cannot delay indefinitely. GC is typically executed when the available free blocks fall</p><p>Algorithm 1: RackBlox workflow in SDN Input: &#119901;&#119896;&#119905; &#8592; RackBlox packet &#119892;&#119888;_&#119904;&#119905;&#119886;&#119905;&#119906;&#119904; &#8592; GC status &#119889;&#119904;&#119905; &#8592; table mapping vssd_id to its destination IP &#119903;&#119890;&#119901;&#119897;&#119894;&#119888;&#119886; &#8592; replica for this vssd_id 1 Function &#119901;&#119903;&#119900;&#119888;&#119890;&#119904;&#119904;_&#119901;&#119886;&#119888;&#119896;&#119890;&#119905;(&#119901;&#119896;&#119905;, &#119892;&#119888;_&#119904;&#119905;&#119886;&#119905;&#119906;&#119904;, &#119903;&#119890;&#119901;&#119897;&#119894;&#119888;&#119886;): below a fixed gc_threshold (e.g., 25%). This is a hard threshold to free flash blocks for future use. To make room for delaying GC, we configure a relaxed soft_threshold (35% by default). Instead of having the SDF notify the switch when it must do GC, it requests GC once its free block ratio falls below the soft_threshold. The switch can use its shared GC state to delay GC until the replica finishes GC.</p><p>Storage servers will periodically (every 30 seconds by default) check the free block ratio for each vSSD (Line 9-19 in Algorithm 2). If any GC condition triggers, the SDF will send a gc_op packet (T1 in Figure <ref type="figure">7b</ref>). If the free block ratio falls below the gc_threshold, the gc field in the payload is set to regular (value of 1) to indicate that the replica must execute GC. GC requests with regular will not be denied as the GC has been delayed as much as possible. If regular GC requests are not acknowledged due to link or switch failure, the vSSD will execute GC after retrying (3 retries by default). If the free block ratio only falls below the soft_threshold, the gc field in the payload is set to soft (value of 0).</p><p>The logic for accepting or delaying GC requests in the switch is shown in Line 10-25 of Algorithm 1. The switch begins with updating the GC status in the Replica</p><p>Table to Algorithm 2: RackBlox workflow in SDF Input: &#119901;&#119896;&#119905; &#8592; RackBlox packet 1 Function &#119901;&#119903;&#119900;&#119888;&#119890;&#119904;&#119904;_&#119901;&#119886;&#119888;&#119896;&#119890;&#119905;(&#119901;&#119896;&#119905;): 2 if &#119901;&#119896;&#119905; .&#119900;&#119901; = &#119908;&#119903;&#119894;&#119905;&#119890; then 3 if &#119888;&#119886;&#119888;&#8462;&#119890; is full then 4 flush DRAM cache with write data 5 if &#119901;&#119896;&#119905; .&#119900;&#119901; = &#119903;&#119890;&#119886;&#119889; then 6 schedule local read with coordinated I/O 7 if &#119901;&#119896;&#119905; .&#119900;&#119901; = &#119892;&#119888;_&#119900;&#119901; and &#119901;&#119896;&#119905; .&#119892;&#119888; = &#119886;&#119888;&#119888;&#119890;&#119901;&#119905; then 8 begin GC // Periodic GC Monitoring Input: &#119907;&#119904;&#119904;&#119889; &#8592; vSSD being checked for GC &#119904;&#119900; &#119891; &#119905;_&#119905;&#8462;&#119903;&#119890;&#119904;&#8462;&#119900;&#119897;&#119889; &#8592; soft GC threshold &#119892;&#119888;_&#119905;&#8462;&#119903;&#119890;&#119904;&#8462;&#119900;&#119897;&#119889; &#8592; regular GC threshold &#119887;&#119892;_&#119901;&#119903;&#119890;&#119889; &#8592; idle prediction for background GC 9 Function &#119905;&#119903;&#119894;&#119892;&#119892;&#119890;&#119903; _&#119892;&#119888;(&#119907;&#119904;&#119904;&#119889;, &#119887;&#119892;_&#119901;&#119903;&#119890;&#119889;): 10 &#119892;&#119888;_&#119905;&#119910;&#119901;&#119890; &#8592; &#119899;&#119900;&#119899;&#119890; 11 if &#119907;&#119904;&#119904;&#119889;.&#119891; &#119903;&#119890;&#119890;_&#119887;&#119897;&#119900;&#119888;&#119896;&#119904; &lt; &#119892;&#119888;_&#119905;&#8462;&#119903;&#119890;&#119904;&#8462;&#119900;&#119897;&#119889; then 12 &#119892;&#119888;_&#119905;&#119910;&#119901;&#119890; &#8592; &#119903;&#119890;&#119892;&#119906;&#119897;&#119886;&#119903; 13 else if &#119907;&#119904;&#119904;&#119889;.&#119891; &#119903;&#119890;&#119890;_&#119887;&#119897;&#119900;&#119888;&#119896;&#119904; &lt; &#119904;&#119900; &#119891; &#119905;_&#119905;&#8462;&#119903;&#119890;&#119904;&#8462;&#119900;&#119897;&#119889; then 14 &#119892;&#119888;_&#119905;&#119910;&#119901;&#119890; &#8592; &#119904;&#119900; &#119891; &#119905; 15 else if &#119887;&#119892;_&#119901;&#119903;&#119890;&#119889; = &#119879;&#119903;&#119906;&#119890; then 16 &#119892;&#119888;_&#119905;&#119910;&#119901;&#119890; &#8592; &#119887;&#119892; 17 if &#119892;&#119888;_&#119905;&#119910;&#119901;&#119890; &#8800; &#119899;&#119900;&#119899;&#119890; then 18 &#119901;&#119896;&#119905; &#8592; new &#119901;&#119896;&#119905; 19 &#119901;&#119896;&#119905; .&#119889;&#119904;&#119905;, &#119901;&#119896;&#119905; .&#119900;&#119901;, &#119901;&#119896;&#119905; .&#119892;&#119888; &#8592; &#119904;&#119908;&#119894;&#119905;&#119888;&#8462;, &#119892;&#119888;_&#119900;&#119901;, &#119892;&#119888;_&#119905;&#119910;&#119901;&#119890;</p><p>1. If the request is regular, the switch also updates the GC status in the Destination Table to 1, sets the gc field in the payload to accept (value of 3), and sends the reply back to the server. For soft requests, the switch will check the GC status of the replica (T2 in Figure <ref type="figure">7b</ref>). If the replica is executing GC, the switch will delay (value of 4) the request (T3 in Figure <ref type="figure">7b</ref>). Otherwise, the switch will accept it. Both the Replica and Destination Tables have a GC status that must be consistent. The soft requests that must check the replica's GC status in the Destination Table cannot also update the GC status of the vSSD due to the memory limitations of programmable switches. Therefore, we recirculate the packet once to ensure consistency. The SDF sends a final gc_op packet when the vSSD has finished GC with the gc field set to finish (value of 5) in the payload. The switch uses this to clear the GC status in both tables (Line 19-20 in Algorithm 1). Background GC. Delaying GC enables the switch to reduce overlapping GC. RackBlox also opportunistically utilizes idle cycles to free blocks. Background GC requests are labeled as bg (value of 2) in the gc field of the payload. Since background GC is performed during idle cycles, the SDF executes it without approval from the ToR switch. To facilitate background GC, RackBlox predicts the next idle time for a given vSSD based on the last interval between I/O requests <ref type="bibr">[12,</ref><ref type="bibr">55,</ref><ref type="bibr">70,</ref><ref type="bibr">85]</ref>, as shown in T1 in Figure <ref type="figure">7c</ref>:</p><p>, where &#119879; &#119901;&#119903;&#119890;&#119889;&#119894;&#119888;&#119905; &#119894; -1 is the idle time of the last prediction, and &#120572; is the exponential smoothing parameter (&#120572; = 0.5 by default). Once &#119879; &#119901;&#119903;&#119890;&#119889;&#119894;&#119888;&#119905; &#119894; is larger than a defined threshold (30 milliseconds by default), the storage server will execute GC and update the GC status in the switch (T2 and T3 in Figure <ref type="figure">7c</ref>).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.5.2">Coordinated GC for Software-Isolated vSSDs.</head><p>Unlike hardware-isolated vSSDs, software-isolated vSSDs can share channels with other software-isolated vSSDs. As they rely on software techniques to offer performance isolation, software-isolated vSSDs provide relaxed isolation guarantees. Thus, request redirection may not guarantee predictable storage performance for those vSSDs. Even if one replica is not executing GC, a collocated vSSD may execute GC, resulting in significant interference.</p><p>RackBlox enables simple management of software-isolated vSSDs by grouping them into channel groups in the SDF. Each channel group is a set of software-isolated vSSDs that span the same set of channels and all vSSDs of the channel group will perform GC simultaneously. Intuitively, if one vSSD must perform GC and each vSSD will be affected anyway, then all vSSDs should perform GC to reduce GC frequency. This simplifies coordination and reduces overhead.</p><p>The channel group is managed exclusively by the SDF and is not exposed to the switch. Multiple software-isolated vSSDs sharing the same channels may have diverse GC behavior. To ensure all vSSDs of the channel group can execute GC together, we allow a vSSD that has exhausted its free blocks to transparently borrow free blocks from collocated vSSDs. Blocks are borrowed in groups (1GB by default) and transferred between the free block lists of vSSDs. Thus, we can delay GC until the channel group's free block ratio falls below the gc_threshold. The borrowed blocks will be erased (for security) and returned to the original vSSD after the GC. The coordinated GC will not worsen the write amplification, as it makes the best effort to avoid unnecessary GC operations. When sending gc_op packets to the switch, the storage server generates a separate packet for each vSSD in the channel group. Note that a delay response (i.e., the corresponding replica vSSD is executing GC) from any vSSD will delay the GC of the channel group.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.6">Rack-Scale Wear Leveling</head><p>The limitation of the SSD lifetime has created complexity for their use and management in practice <ref type="bibr">[51,</ref><ref type="bibr">52]</ref>. This is especially true in large-scale data centers. First, as different applications have different workload patterns, the write traffic to each SSD can be different, causing wear imbalance between SSDs in a rack. Second, platform operators have to replace unhealthy or failed SSDs with new SSDs frequently, making the wear management of SSDs across the entire rack even harder. Third, modern cloud infrastructures mostly consider the load balance rather than the wear balance across SSDs. Therefore, the wear-leveling management of SSDs has become a fundamental challenge in data centers today.</p><p>Global (inter-server) wear balancer Local (intra-server) wear balancer Local (intra-server) wear balancer Local (intra-server) wear balancer ... ... ... ... Premature death or removal of an SSD not only increases the operation cost, but causes an opportunity loss of other hardware components, given that others like CPU, network, and memory do not prematurely lose capability. Thus, it is desirable to ensure SSDs in a rack are aging at the same rate.</p><p>To extend the lifetime of a rack of SSDs, we propose a twolevel wear leveling mechanism (see Figure <ref type="figure">8</ref>). It consists of two parts: a local (intra-server) wear balancer processes the local wear balance between SSDs in a storage server, and a global (inter-server) wear balancer reduces the wear variance for SSDs in a rack. The wear balancers work at different level and cooperate to ensure rack-scale wear leveling.</p><p>As for the local wear balancer, to obtain the uniform lifetime among SSDs in a storage server, we track the average erase count for an SSD<ref type="foot">foot_0</ref> , and ensure the wear balance for all the SSDs in a storage server. Let &#120593; &#119894; denote the wear (average erase count of all the blocks to date) of the &#119894; &#119905;&#8462; SSD. &#120582; = &#120593; &#119898;&#119886;&#119909; /&#120593; &#119886;&#119907;&#119892; denotes the wear imbalance across SSDs, which must not exceed 1 + &#120574;, where &#120593; &#119898;&#119886;&#119909; = &#119872;&#119886;&#119909; (&#120593; 1 , ..., &#120593; &#119873; ), &#120593; &#119886;&#119907;&#119892; = &#119860;&#119907;&#119892;(&#120593; 1 , ..., &#120593; &#119873; ), &#119873; is the total number of SSDs, and &#120574; represents the maximum permitted imbalance. Instead of swapping SSDs frequently, RackBlox periodically swaps the SSD that has incurred the maximum wear with the SSD that has the minimum rate of wear, following the relaxed wear leveling approach developed in <ref type="bibr">[28]</ref>. Given &#120574; = 0.1, each server can have 16 SSDs, and each SSD can last five years, RackBlox can achieve uniform lifetime for SSDs in a storage server by swapping once per 12 days for the worst case <ref type="bibr">[28]</ref>. Assume each flash block can endure 30K writes, this swapping consumes only 0.5% of its lifetime.</p><p>SSDs are swapped atomically by pausing operations for the chosen blocks, reading them into memory, writing them to their new locations, updating the mapping tables, and serving the paused requests. As the swapping occurs infrequently, it does not affect the tail latency. To further minimize its impact on application performance, RackBlox assigns higher priority to regular I/O requests during swapping.</p><p>Similarly, we can quantify the wear imbalance between storage servers in a rack by using the wear (average erase count of all the SSDs to date) of a server. However, different from the swapping of SSDs in a single server, the swapping cost between storage servers is more expensive, due to the networking overhead. Therefore, we relax the swapping frequency (8 weeks by default). This is less of a concern, as modern storage infrastructures have employed the load balance (e.g., round-robin vSSD allocation) across servers. Since RackBlox does not swap SSDs across servers frequently, we do not implement the rack-scale wear leveling in the switch to keep our design simple. Our experiments (see &#167;4.6) show that the relaxed wear leveling will ensure near-ideal wear balance for datacenter workloads.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.7">Implementation Details</head><p>Testbed. Our experiments are conducted on a testbed of five servers connected to a 6.5Tbps Tofino switch <ref type="bibr">[60]</ref>. Each server is equipped with a 24-core Intel Xeon E5-2687W processor running at 3.00GHz, 108GB DRAM, and 1TB programmable SSD. Each server has a Mellanox ConnectX-4 50Gb NIC connected to the programmable switch. Network implementation. To implement the custom packets described in Figure <ref type="figure">6</ref>, we use DPDK (v22.11.1) <ref type="bibr">[30]</ref>. If the packet type is gc_op, the payload contains a gc field (1 byte) storing the necessary type of GC request. When the packet is a create_vssd packet, we include the server IP, vSSD_ID, and server IP of the replica in the payload.</p><p>We develop the switch data plane in P4 <ref type="bibr">[14]</ref> and run it on an Intel Tofino ASIC <ref type="bibr">[31]</ref>. The control plane is implemented in Python and interacts with the switch data plane through Thrift APIs [10] using Intel's P4 SDE 9.10.0. We implement the tables as described in &#167;3.3 using 1.3MB SRAM in the switch. The GC states of the replica and destination table use registers, such that they can be updated in the data plane, consuming a total of 128KB of stateful memory.</p><p>Since we do not have access to a real data center, we emulate datacenter network traffic in our cluster using traces and released network traffic distributions <ref type="bibr">[32,</ref><ref type="bibr">59,</ref><ref type="bibr">67]</ref>. The traces include delays between VMs in cloud data centers. To simulate the variations of network latency, we scale the trace in <ref type="bibr">[67]</ref> following the latency patterns and distributions in <ref type="bibr">[32,</ref><ref type="bibr">59]</ref>. The latency is associated with each request and stored in the LAT field when the packet is generated (see Figure <ref type="figure">6</ref>). When the request traverses the switch, we add the per-hop latency as described in &#167;3.4. The end-to-end latency is computed by adding the time spent at the storage server and the final LAT value in the return packet. Storage implementation. We build the SDF (SSD virtualization) stack on top of programmable SSDs. By default we implement a greedy, threshold-based GC. We specify the GC thresholds used in each experiment in &#167;4. In our testbed, we use one server as clients, and others to host vSSDs. Emulation. Since we only have one type of programmable SSD, we build an SSD emulator using Python to test RackBlox against different SSD device performance (see &#167;4.5.3). We validate the emulator with our programmable SSD. For these experiments, we use the same implementation, but issue requests to the emulated SSDs. Cloud data serving queries. 0-100% TPC-H <ref type="bibr">[82]</ref> Business-oriented ad-hoc queries. 2.27% Seats <ref type="bibr">[57]</ref> Airline ticketing system queries. 10.34% AuctionMark <ref type="bibr">[83]</ref> Activity queries in an auction site. 53.76% TPC-C <ref type="bibr">[81]</ref> Online transaction queries. 59.95% Twitter <ref type="bibr">[54]</ref> Micro-blogging website queries. 97.86%</p><p>Others. Similar to modern storage systems <ref type="bibr">[7,</ref><ref type="bibr">23]</ref>, RackBlox leverages heartbeats to detect failures. On link failure, it redirects requests to replicas in the rack. On server failure, RackBlox replicates the replicas to other servers and updates their switches. Upon data recovery, it updates stale data from replica vSSDs before serving requests <ref type="bibr">[37]</ref>. On switch failure, RackBlox relies on replicas in another rack to serve requests. The ToR switch is repopulated on switch recovery. RackBlox focuses on storage management of a rack. As future work, we wish to extend it to multiple racks by modifying Algorithm 1 to keep GC states consistent among switches.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Evaluation</head><p>Our evaluation shows that: (1) RackBlox reduces the tail latency of I/O requests by up to 5.8&#215; for data-center applications with network-storage coordination (&#287;4.2 and &#287;4.3); (2) RackBlox works with various storage and network scheduling policies (&#287;4.5.1 and &#287;4.5.2); (3) RackBlox benefits various SSD devices and network latency distributions (&#287;4.5.3); and (4) RackBlox extends the lifetime of a rack of SSDs (&#287;4.6).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1">Experimental Setup</head><p>To examine RackBlox's performance under different workload patterns, we use YCSB with different read/write ratios [87] and various workloads from BenchBase <ref type="bibr">[21]</ref>. These represent common data center applications sensitive to network and storage performance (Table <ref type="table">2</ref>). All workloads run on hardware-isolated vSSDs. The datasets range in 50-100GB, so we allocate vSSD capacity accordingly (64-128GB). We set soft_threshold to 35%, and set gc_threshold to 25%. Before each experiment, we run a subset of the workloads to trigger GC and consume 50% of the free blocks. RackBlox uses Linux's Kyber scheduler <ref type="bibr">[42]</ref> by default, as it performs the best across various settings (see &#287;4.5.1). Kyber uses 750&#120583;s for reads and 3 millisecs for writes as target 95-th percentile (P95) latencies. When enabling coordinated I/O, we use 1.75 millisecs and 4 millisecs to account for P95 network delay. We use the default priority-based isolation in the switch.</p><p>To show the performance benefits of network-storage codesign, we compare RackBlox with state-of-the-art softwaredefined storage architecture designs at datacenter scale.</p><p>VDC: Virtual datacenter (VDC) <ref type="bibr">[6]</ref> enables end-to-end isolation between multiple tenants sharing the same physical network and storage. It implements a logically centralized controller that allocates resources to each tenant's VDC as well as each tenant's I/O flows <ref type="bibr">[79]</ref>. We run the controller</p><p>100/0 95/5 80/20 50/50 20/80 5/95 Read/Write Mix (%) 0 0.2 0.4 0.6 0.8 1 Norm. P99.9 Latency VDC RackBlox (Software) RackBlox (a) P99.9 read latency (excluding write-only). 95/5 80/20 50/50 20/80 5/95 0/100 Read/Write Mix (%) 0 0.2 0.4 0.6 0.8 1 Norm. P99.9 Latency VDC RackBlox (Software) RackBlox</p><p>(b) P99.9 write latency (excluding read-only).</p><p>Figure <ref type="figure">9</ref>. RackBlox's benefits for P99.9 end-to-end latency.</p><p>on a separate server updating flow demand and allocations. VDC enforces end-to-end isolation for each flow with multiresource token bucket rate limiting. RackBlox (Software): Although RackBlox is developed with a programmable switch and SSDs, its core ideas can be implemented in the software stack. To evaluate this, we extend VDC by adding software-based coordinated I/O scheduling and GC. We make the VDC controller GC-aware by tracking the GC state of vSSDs, and implementing the coordinated GC ( &#167;3.5) in software. When the controller grants the vSSD's request to perform GC, it also returns the location of a replica not performing GC. Therefore, storage servers can redirect requests when the vSSD is performing GC.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2">End-to-End Performance Benefits</head><p>To evaluate the end-to-end performance of RackBlox, we run YCSB benchmarks with the zipfian request distribution, and vary the write ratio from 0% (read-only) to 100% (writeonly). With network-storage co-design, RackBlox improves the 99.9-th percentile (P99.9) read latency by up to 4.4&#215; (12.4 millisecs vs. 2.8 millisecs), the P99.9 write latency by up to 1.4&#215; (4.3 millisecs vs. 3.0 millisecs), as shown in Figure <ref type="figure">9</ref>. We show the detailed results in Figure <ref type="figure">16</ref>.</p><p>Although VDC ensures flow isolation across network and storage stack in software, it performs worse than RackBlox (Figure <ref type="figure">9a</ref>), due to the lack of the coordination between the network and storage stack. RackBlox (Software) enables GC redirection in software, and reduces the overhead when requests are blocked by GC. For read-heavy workloads, the performance of RackBlox (Software) is similar to that of RackBlox, as they both conduct the coordinated I/O scheduling. However, for write-heavy workloads, which cause more intensive GC, RackBlox (Software) can improve VDC's performance by to 2.4&#215; (12.4 millisecs vs. 5.2 millisecs). However, since RackBlox (Software) incurs additional network overhead, it remains suboptimal. RackBlox outperforms VDC and RackBlox (Software) by enabling coordinated I/O scheduling and coordinated GC in the network by 4.4&#215; and 1.84&#215; (5.2 millisecs vs. 2.8 millisecs) respectively.  100/0 95/5 80/20 50/50 20/80 5/95 Read/Write Mix (%) 0 0.5 1 1.5 2 Avg. Latency (ms) VDC RackBlox (Software) RackBlox (a) Average read latency (excluding write-only). 95/5 80/20 50/50 20/80 5/95 0/100 Read/Write Mix (%) 0 0.5 1 1.5 2 2.5 Avg. Latency (ms) VDC RackBlox (Software) RackBlox (b) Average write latency (excluding read-only). Writes are hardly affected by GC because of the write cache in storage servers, as shown in Figure <ref type="figure">9b</ref>. Thus, Rack-Blox and RackBlox (Software) have similar performance, as the coordinated I/O scheduling improves the 99.9th percentile write tail latency by up to 1.4&#215;. We show RackBlox's benefit for the 99th percentile (P99) latency in Figure <ref type="figure">10</ref>. The read latency is improved by up to 2.1&#215; (5.3 millisecs vs. 2.6 millisecs) and the write latency is improved by up to 1.3&#215; (3.7 millisecs vs. 2.8 millisecs). This demonstrates that RackBlox can achieve benefit at lower tails as well.</p><p>RackBlox does not negatively affect the average latency, as shown in Figure <ref type="figure">11</ref>. As we increase the write ratio in the workloads, the average latency of reads/writes is gradually increased, due to the read/write interference, and the write latency is longer than read latency in the storage stack.</p><p>We show the average throughput of YCSB benchmarks in Figure <ref type="figure">12</ref>. RackBlox does not negatively affect throughput, as RackBlox targets improved tail latency. Similar to the average latency, higher write rates lead to lower IOPS since writes have higher device latency.</p><p>100/0 95/5 80/20 50/50 20/80 5/95 0/100 Read/Write Mix (%) 0 40 80 120 160 200 Throughput (KIOPS) VDC RackBlox (Software) RackBlox Figure 12. RackBlox's impact on throughput. TPC-H Seats AuctionMark TPC-C Twitter 0 0.2 0.4 0.6 0.8 1 Norm. P99.9 Latency VDC RackBlox (Software) RackBlox (a) P99.9 read latency (excluding write-only). TPC-H Seats AuctionMark TPC-C Twitter 0 0.2 0.4 0.6 0.8 1 Norm. P99.9 Latency VDC RackBlox (Software) RackBlox</p><p>(b) P99.9 write latency (excluding read-only).</p><p>Figure <ref type="figure">13</ref>. Comparing RackBlox's P99.9 end-to-end latency against VDC and RackBlox (Software) for various workloads. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.3">End-to-End Performance of Various Workloads</head><p>We further evaluate RackBlox on various workloads (see Table <ref type="table">2</ref>), following the setup described in &#287;4.1. Figure <ref type="figure">13a</ref> shows that RackBlox improves the P99.9 read latency of various workloads by up to 7.9&#215; <ref type="bibr">(23.8</ref> millisecs vs. 3.0 millisecs), in comparison with VDC. For P99 read tail latency, RackBlox achieves up to 2.9&#215; improvement (8.1 millisecs vs. 2.8 millisecs). Compared to the YCSB experiments, we observe similar correlation between write ratio and read tail latency improvement in various workloads. For read-intensive workloads like TPC-H, RackBlox and RackBlox (Software) improve mainly via coordinated I/O scheduling. For writeintensive ones like Twitter, RackBlox improves performance mainly by alleviating GC interference. AuctionMark has less benefit than YCSB with 50% writes, although it has slightly higher write ratio. This is because AuctionMark has a different I/O request pattern (e.g., a long sequence of writes followed by a sequence of reads, rather than mixed reads and writes in YCSB), it has fewer I/O requests affected by the GC. RackBlox (Software) performs worse than RackBlox due to the additional networking overhead for coordinated GC. The end-to-end write tail latency, shown in Figure 13b, demonstrates a similar trend and improvement to YCSB. For throughput (see Figure 14) and average read/write latency, we observe the similar trend as YCSB benchmarks (see &#167;4.2). 100/0 95/5 80/20 50/50 20/80 5/95 Read/Write Mix (%) 0 0.2 0.4 0.6 0.8 1 Norm. P99.9 Latency (a) P99.9 read latency (excluding write-only). Max P75 P50 P25 Min VDC-Total VDC-Stor RB-Coord I/O-Total RB-Coord I/O-Stor RB (Software)-Total RB (Software)-Stor RB-Total RB-Stor 95/5 80/20 50/50 20/80 5/95 0/100 Read/Write Mix (%) 0 0.2 0.4 0.6 0.8 1 Norm. P99.9 Latency (b) P99.9 write latency (excluding read-only). Figure 15. P99.9 latency breakdown. RB is RackBlox. Stor is the storage latency and Total is the end-to-end latency. 98.5 99 99.5 99.9 1 2 3 4 5 Latency (ms) 100% Reads 98.5 99 99.5 99.9 1 2 3 4 5 95% Reads 98.5 99 99.5 99.9 1 2 3 4 5 80% Reads 98.5 99 99.5 99.9 2 3 4 5 6 7 Latency (ms) 50% Reads 98.5 99 99.5 99.9 Percentage of Requests (%) 2 3 4 6 9 12 15 20% Reads 98.5 99 99.5 99.9 2 3 4 6 9 12 15 5% Reads VDC RackBlox (Software) RackBlox-Coord I/O RackBlox </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.4">Performance Benefit Breakdown in RackBlox</head><p>To break down the performance improvements in RackBlox, we evaluate RackBlox-Coord I/O, in which we enable coordinated I/O scheduling between the network and storage stack, but disable coordinated GC in RackBlox.</p><p>We show the comparison in Figure <ref type="figure">15</ref> with latency breakdowns. By coordinating I/O between network and storage, RackBlox-Coord I/O reduces the P99.9 read latency by up to 1.1-1.23&#215; (3.9 millisecs vs. 3.1 millisecs) and write latency by 1.1-1.4&#215; compared to VDC. With increased write ratios, RackBlox-Coord I/O brings more benefits for the tail latency, because the potential delay of a request in the storage queues increases, as writes have higher device latency than reads. Thus, prioritizing requests in the storage queue leads to more obvious effects on the end-to-end latency and coordinated I/O scheduling provides greater speedup.</p><p>However, for write-dominant workloads (e.g., more than 50%), the read tail latency improvement of coordinated I/O scheduling diminishes no matter how we schedule as shown in Figure <ref type="figure">15a</ref>, because intensive writes incur high GC overhead. With high write ratios, the coordinated I/O scheduling brings more benefits to the tail latency of writes than that of reads, since the write cache helps alleviate the GC overhead. As we further increase the write ratio (i.e., above 50%),   the tail latency of both VDC and RackBlox-Coord I/O is increased, due to the increased storage queue delay (see the storage latency distribution in Figure <ref type="figure">15b</ref>). Compared to VDC, the normalized tail latency reduction of coordinated I/O scheduling is almost the same as shown in Figure <ref type="figure">15b</ref>.</p><p>The coordinated GC mechanism in RackBlox will further improve the read tail latency (by up to 4.3&#215;), as shown in Figure <ref type="figure">15a</ref> and Figure <ref type="figure">16</ref>. Both RackBlox and RackBlox (Software) implement coordinated GC, but RackBlox provides more speedup with the programmable switch, as it alleviates the unnecessary networking round-trip delays. The coordinated GC does not benefit writes, as we need to issue writes to all replicas for data consistency (as discussed in &#167;3.5.1).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.5">Sensitivity Analysis</head><p>We demonstrate that RackBlox retains the flexibility and modularity of the original SDN/SDF design by evaluating different scheduling policies and system configurations. 4.5.1 Varying storage I/O scheduling policies. We now examine the benefit of the coordinated I/O scheduling under different storage I/O scheduling policies. In particular, we implement Linux's storage schedulers for SDF: no-op (FIFO), Deadline, and Kyber <ref type="bibr">[42]</ref>. No-op is the default on NVMe devices, while both Kyber and Deadline target predictable latency. Deadline splits requests into read and write queues, and prioritizes requests when they reach their respective deadlines. Kyber also splits requests into read and write queues, and throttles each queue to meet the latency targets. To enable coordinated I/O scheduling, RackBlox reorders requests in each queue using network latencies. We use 0.5 millisecs and 1.75 millisecs as deadlines for reads and writes in Deadline and 1.5 millisecs and 2.75 millisecs in RackBlox (Deadline). We use 0.75 millisecs and 3 millisecs for reads and writes in Kyber and 1.75 millisecs and 4 millisecs for RackBlox <ref type="bibr">(Kyber)</ref>. RackBlox (Deadline) and RackBlox <ref type="bibr">(Kyber)</ref> use increased parameter values, as RackBlox incorporates the network latency in its coordinated I/O scheduling, based on the distribution of network latencies in data centers <ref type="bibr">[67]</ref>.</p><p>100/0 95/5 80/20 50/50 20/80 5/95 Read/Write Mix (%) 0 0.2 0.4 0.6 0.8 1 Norm. P99.9 Latency FQ RackBlox (FQ) Priority RackBlox (Priority) TB RackBlox (TB) Figure 18. Comparing P99.9 read latency for RackBlox with different network scheduling policies. 98.5 99 99.5 99.9 1 2 Optane + Fast 98.5 99 99.5 99.9 1 2 3 4 5 Optane + Medium 98.5 99 99.5 99.9 1 2 3 4 Optane + Slow 98.5 99 99.5 99.9 1 2 3 Latency (ms) Intel DC + Fast 98.5 99 99.5 99.9 1 2 3 Intel DC + Medium 98.5 99 99.5 99.9 2 3 4 Intel DC + Slow 98.5 99 99.5 99.9 2 3 4 P-SSD + Fast 98.5 99 99.5 99.9</p><p>Percentage of Requests (%) We show the results in Figure <ref type="figure">17</ref>. As expected, coordinated I/O scheduling always outperforms its baseline scheduler. RackBlox (FIFO) achieves the greatest speedup over its baseline scheduler (1.5&#215;). RackBlox <ref type="bibr">(Kyber)</ref> and Rack-Blox (Deadline) have fewer opportunities to reorder requests when splitting reads and writes into separate queues, but still benefit from coordination (1.24&#215; and 1.36&#215; respectively). 4.5.2 Varying network scheduling policies. We now evaluate the performance of RackBlox under different network scheduling policies in the switch. Besides the Token Bucket rate limiting (TB) policy that ensures isolation between flows (similar to VDC), we examine the fair queuing (FQ) and priority based network scheduling (Priority) policies. For FQ, we have four client servers competing for one storage server with each receiving a fair share of the network bandwidth. In Priority, we periodically create higher priority traffic using <ref type="bibr">[72]</ref>, which delays lower-priority requests.</p><p>We show the results in Figure <ref type="figure">18</ref>. Coordinated I/O scheduling can benefit all the underlying network schedulers. FQ and Priority result in higher latency as requests are delayed in the network. This provides increased opportunities for reordering, which allows RackBlox to achieve up to 1.21&#215; and 1.15&#215; performance improvement on average, respectively.  latency with lower storage latency, or vice versa. Therefore, if the network latency overwhelms storage latency or vice versa, RackBlox helps less to improve the end-to-end latency.</p><p>We analyze the sensitivity of RackBlox by evaluating the YCSB benchmarks with emulated devices of different latencies (see &#167;3.7). We evaluate three SSDs from fastest to slowest: Optane [3], Intel DC <ref type="bibr">[2]</ref>, and P-SSD (programmable SSD) <ref type="bibr">[53]</ref>. We evaluate networks with Fast <ref type="bibr">[67]</ref>, Medium <ref type="bibr">[59]</ref>, and Slow <ref type="bibr">[32]</ref> latencies (see &#167;3.7). The resulting end-to-end latencies of YCSB-A (50% reads) are shown in Figure <ref type="figure">19</ref>.</p><p>Varying the SSD performance. For RackBlox, the marginal benefit on end-to-end tail latency by upgrading SSD is low when the SSD already outperforms the network. For example, upgrading the SSD from Intel DC to Optane under Slow network brings little benefit to the P99.9 latency. Thus, the performance improvement of RackBlox over VDC is also low. In contrast, the benefits of upgrading SSD are more obvious when the network outperforms SSDs, which brings overall performance benefit for RackBlox. Varying the networking performance. Similar conclusions are drawn as we vary network latencies. For example, upgrading the network from Slow to Fast with the slowest P-SSD hardly improves read tail latency in RackBlox, because SSD latency dominates the end-to-end latency. In contrast, by upgrading the network with the fastest Optane SSD, we significantly improve the read tail latency in RackBlox.</p><p>Our findings are consistent across various YCSB benchmarks, as shown in Figure <ref type="figure">20</ref>. The fastest Optane SSD matches best (i.e., RackBlox achieves the most benefit) with Fast network, the slower Intel DC SSD matches with Medium network, and the slowest P-SSD matches with Slow network. The reduced benefit for RackBlox under unmatched latencies is a potential limitation, but this is less of a concern, as modern data centers usually upgrade network and storage hardware together for best resource efficiency (e.g., using slow storage with fast RDMA network is impractical in the real world). Therefore, pairing the storage stack with the network stack fully unleashes the potential of RackBlox.</p><p>No Swap RackBlox After 1 Year No Swap RackBlox After 2 Years 0 0.5 1 1.5 Wear Imbalance (max/avg) Figure 22. Benefits of RackBlox on each server's wear balance (different colors represent different SSDs in one server). 0 16 32 48 64 80 Time (weeks) 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Wear Imbalance (max/avg) No Swap RB-Swap per 4 Weeks RB-Swap per 8 Weeks RB-Swap per 12 Weeks  To examine RackBlox for software-isolated vSSDs, we run two software-isolated vSSDs on the same flash channels (SW-Isolated). These vSSDs are isolated using token bucket rate limiting and both run YCSB with 50% writes. We compare SW-Isolated with a hardware-isolated vSSD (HW-Isolated) that has the full ownership of the flash channels. RackBlox reduces the P99.9 latency by 1.47&#215; in comparison with VDC for SW-Isolated vSSDs and by 1.51&#215; for HW-Isolated vSSDs, as shown in Figure <ref type="figure">21</ref>. With hardwareisolated vSSDs, RackBlox brings marginally more benefit, since the hardware-isolated vSSD minimizes the interference from colocated workloads. Thus, RackBlox can improve the performance for both software-isolated and hardwareisolated vSSDs with the coordinated I/O scheduling and GC.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.6">Benefits of Rack-Scale Wear Leveling</head><p>To evaluate the rack-scale wear leveling of RackBlox, we simulate the effects of running real workloads. We configure a rack with 32 servers, each server has 16 SSDs, and each SSD hosts 4 vSSDs. Each vSSD runs one workload (see Table <ref type="table">2</ref>), which may cause wear imbalance across different SSDs, since the workloads have diverse erase frequency. Each SSD is well balanced at the device level as it has its own devicelevel wear leveling. Following the load balancing of modern storage infrastructures, we assign the vSSDs across servers using round robin <ref type="bibr">[61]</ref>. We evaluate RackBlox's hierarchical wear leveling against modern storage infrastructure which does not swap across SSDs and servers (No Swap) <ref type="bibr">[51,</ref><ref type="bibr">52]</ref>. Local wear balancer. Figure <ref type="figure">22</ref> demonstrates that Rack-Blox's local wear balancer effectively maintains wear balance across different SSDs. While No Swap has significant wear imbalance, RackBlox can ensure near-optimal wear balance across the SSDs in each server with periodic swapping. Global wear balancer. Local wear balancing suffers wearimbalance at rack scale. Figure <ref type="figure">23</ref> shows that RackBlox's global wear balancer effectively maintains rack-scale wear balance, despite reduced swapping frequency (e.g., 8 weeks).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Related Work</head><p>Software-defined networking. Recent studies investigated SDN systems, including networking abstraction, packet processing and scheduling, QoS, SDN programming, performance, and fault tolerance <ref type="bibr">[11,</ref><ref type="bibr">14,</ref><ref type="bibr">73,</ref><ref type="bibr">74,</ref><ref type="bibr">77]</ref>. Programmable schedulers and frameworks have been proposed to allow developers to develop a variety of scheduling algorithms <ref type="bibr">[77,</ref><ref type="bibr">86]</ref>. With these efforts, the community has produced a set of open-sourced frameworks such as OpenFlow <ref type="bibr">[62]</ref>, and the programming language P4 <ref type="bibr">[14]</ref>, as well as the hardware devices like Intel Tofino <ref type="bibr">[80]</ref>. Recent work <ref type="bibr">[33,</ref><ref type="bibr">34,</ref><ref type="bibr">48</ref>] also demonstrates that SDN can benefit distributed storage systems. However, none studied the codesign of SDN and SDS. RackBlox makes an initial effort in this, and shows the benefits of the new software-defined rack-scale storage system. Software-defined storage. Researchers proposed techniques like SDF <ref type="bibr">[44,</ref><ref type="bibr">65,</ref><ref type="bibr">84]</ref> and open-channel SSDs <ref type="bibr">[53]</ref>, so upperlevel system software can exploit the intrinsic properties of flash memory. As the cost of flash-based SSDs approaches that of HDDs and their performance has improved, SDF is a compelling solution for storage management in data centers <ref type="bibr">[28,</ref><ref type="bibr">65]</ref>. However, no previous study focused on the integration of SDN and SDF. Network/storage co-scheduling. To improve the end-toend performance for data center applications, IOFlow <ref type="bibr">[79]</ref> and VDC <ref type="bibr">[6]</ref> enforced policies for I/O requests in centralized servers or hypervisors. However, they treated the SDN and SDF as black boxes without considering the underlying hardware opportunities. Recently, researchers leveraged programmable switches to fulfill system functions like data caching <ref type="bibr">[34]</ref>, consistency protocols <ref type="bibr">[33]</ref>, and task scheduling <ref type="bibr">[91]</ref>, showing that it is feasible to integrate system functions into programmable switches. We integrate storage functions into SDN and show the benefits of this design.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6">Conclusion</head><p>We present RackBlox, a new rack-scale storage system by codesigning the software-defined networking and storage stack. RackBlox integrates essential storage functions into the programmable switch, and enables the state sharing between the network and storage stack. With coordinated I/O scheduling, GC, and rack-scale wear leveling, RackBlox achieves improved end-to-end storage performance, while ensuring near-ideal lifetime for SSDs in a rack.</p></div><note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_0"><p>For the programmable SSDs, we can track the erase count of each flash block. Therefore, we can obtain the average erase count of a flash channel as well as an SSD.</p></note>
		</body>
		</text>
</TEI>
