UC Santa Cruz UC Santa Cruz Previously Published Works - eScholarship.org
←
→
Page content transcription
If your browser does not render page correctly, please read the page content below
UC Santa Cruz UC Santa Cruz Previously Published Works Title Steal but No Force: Efficient Hardware Undo plus Redo Logging for Persistent Memory Systems Permalink https://escholarship.org/uc/item/8k54n6h2 Authors Ogleari, MA Miller, EL Zhao, J et al. Publication Date 2018 DOI 10.1109/HPCA.2018.00037 Peer reviewed eScholarship.org Powered by the California Digital Library University of California
2018 IEEE International Symposium on High Performance Computer Architecture Steal but No Force: Efficient Hardware Undo+Redo Logging for Persistent Memory Systems Matheus Almeida Ogleari∗ , Ethan L. Miller∗,† , Jishen Zhao∗,‡ ∗ University of California, Santa Cruz † Pure Storage ‡ University of California, San Diego ∗ {mogleari,elm,jishen.zhao}@ucsc.edu ‡ jzhao@ucsd.edu Abstract—Persistent memory is a new tier of memory that tions. Reaping its full potential is challenging. Previous per- functions as a hybrid of traditional storage systems and main sistent memory designs introduce large performance and en- memory. It combines the benefits of both: the data persistence ergy overheads compared to native memory systems, without of storage with the fast load/store interface of memory. Most previous persistent memory designs place careful control over enforcing consistency [11], [12], [13]. A key reason is the the order of writes arriving at persistent memory. This can write-order control used to enforce data persistence. Typical prevent caches and memory controllers from optimizing system processors delay, combine, and reorder writes in caches and performance through write coalescing and reordering. We memory controllers to optimize system performance [14], identify that such write-order control can be relaxed by [15], [16], [13]. However, most previous persistent memory employing undo+redo logging for data in persistent memory systems. However, traditional software logging mechanisms are designs employ memory barriers and forced cache write- expensive to adopt in persistent memory due to performance backs (or cache flushes) to enforce the order of persistent and energy overheads. Previously proposed hardware logging data arriving at NVRAM. This write-order control is sub- schemes are inefficient and do not fully address the issues in optimal for performance and do not consider natural caching software. and memory scheduling mechanisms. To address these challenges, we propose a hardware undo+redo logging scheme which maintains data persistence Several recent studies strive to relax write-order control by leveraging the write-back, write-allocate policies used in in persistent memory systems [15], [16], [13]. However, commodity caches. Furthermore, we develop a cache force- these studies either impose substantial hardware overhead by write-back mechanism in hardware to significantly reduce adding NVRAM caches in the processor [13] or fall back to the performance and energy overheads from forcing data low-performance modes once certain bookkeeping resources into persistent memory. Our evaluation across persistent memory microbenchmarks and real workloads demonstrates in the processor are saturated [15]. that our design significantly improves system throughput and Our goal in this paper is to design a high-performance reduces both dynamic energy and memory traffic. It also persistent memory system without (i) an NVRAM cache or provides strong consistency guarantees compared to software buffer in the processor, (ii) falling back to a low-performance approaches. mode, or (iii) interfering with the write reordering by caches and memory controllers. Our key idea is to maintain data I. I NTRODUCTION persistence with a combined undo+redo logging scheme in Persistent memory presents a new tier of data storage hardware. components for future computer systems. By attaching Non- Undo+redo logging stores both old (undo) and new (redo) Volatile Random-Access Memories (NVRAMs) [1], [2], [3], values in the log during a persistent data update. It offers a [4] to the memory bus, persistent memory unifies memory key benefit: relaxing the write-order constraints on caching and storage systems. NVRAM offers the fast load/store persistent data in the processor. In our paper, we show access of memory with the data recoverability of storage in a that undo+redo logging can ensure data persistence without single device. Consequently, hardware and software vendors needing strict write-order control. As a result, the caches and recently began adopting persistent memory techniques in memory controllers can reorder the writes like in traditional their next-generation designs. Examples include Intel’s ISA non-persistent memory systems (discussed in Section II-B). and programming library support for persistent memory [5], Previous persistent memory systems typically implement ARM’s new cache write-back instruction [6], Microsoft’s either undo or redo logging in software. However, high- storage class memory support in Windows OS and in- performance software undo+redo logging in persistent mem- memory databases [7], [8], Red Hat’s persistent memory ory is unfeasible due to inefficiencies. First, software logging support in the Linux kernel [9], and Mellanox’s persistent generates extra instructions in software, competing for lim- memory support over fabric [10]. ited hardware resources in the pipeline with other critical Though promising, persistent memory fundamentally workload operations. Undo+redo logging can double the changes current memory and storage system design assump- number of extra instructions over undo or redo logging 2378-203X/18/$31.00 ©2018 IEEE 336 DOI 10.1109/HPCA.2018.00037
alone. Second, logging introduces extra memory traffic in write-back frequency. addition to working data access [13]. Undo+redo logging • We implement our design through lightweight software would impose more than double extra memory traffic in support and processor modifications. software. Third, the hardware states of caches are invisible to software. As a result, software undo+redo logging, an idea II. BACKGROUND AND M OTIVATION borrowed from database mechanisms designed to coordinate Persistent memory is fundamentally different from tradi- with software-managed caches, can only conservatively co- tional DRAM main memory or their NVRAM replacement, ordinate with hardware caches. Finally, with multithreaded due to its persistence (i.e., crash consistency) property workloads, context switches by the operating system (OS) inherited from storage systems. Persistent memory needs can interrupt the logging and persistent data updates. This to ensure the integrity of in-memory data despite system can risk the data consistency guarantee in multithreaded crashes and power loss [18], [19], [20], [21], [16], [22], environment (Section II-C discusses this further). [23], [24], [25], [26], [27]. The persistence property is not Several prior works investigated hardware undo or redo guaranteed by memory consistency in traditional memory logging separately [17], [15] (Section VII). These designs systems. Memory consistency ensures a consistent global have similar challenges such as hardware and energy over- view of processor caches and main memory, while persistent heads [17], and slowdown due to saturated hardware book- memory needs to ensure that the data in the NVRAM main keeping resources in the processor [15]. Supporting both memory is standalone consistent [16], [19], [22]. undo and redo logging can further exacerbate the issues. Additionally, hardware logging mechanisms can eliminate A. Persistent Memory Write-order Control the logging instructions in the pipeline, but the extra memory traffic generated from the log still exists. To maintain data persistence, most persistent memory de- To address these challenges, we propose a combined signs employ transactions to update persistent data and care- undo+redo logging scheme in hardware that allows persis- fully control the order of writes arriving in NVRAM [16], tent memory systems to relax the write-order control by [19], [28]. A transaction (e.g., the code example in Fig- leveraging existing caching policies. Our design consists of ure 1) consists of a group of persistent memory updates two mechanisms. First, a Hardware Logging (HWL) mech- performed in the manner of “all or nothing” in the face of anism performs undo+redo logging by leveraging write- system failures. Persistent memory systems also force cache back write-allocate caching policies [14] commonly used in write-backs (e.g., clflush, clwb, and dccvap) and use processors. Our HWL design causes a persistent data update memory barrier instructions (e.g., mfence and sfence) to automatically trigger logging for that data. Whether a throughout transactions to enforce write-order control [28], store generates an L1 cache hit or miss, its address, old [15], [13], [19], [29]. value, and new value are all available in the cache hierarchy. Recent works strived to improve persistent memory per- As such, our design utilizes the cache block writes to update formance towards a native non-persistent system [15], [16], the log with word-size values. Second, we propose a cache [13]. In general, whether employing logging in persistent Force Write-Back (FWB) mechanism to force write-backs memory or not, most face similar problems. (i) They in- of cached persistent working data in a much lower, yet more troduce nontrivial hardware overhead (e.g., by integrating efficient frequency than in software models. This frequency NVRAM cache/buffers or substantial extra bookkeeping depends only on the allocated log size and NVRAM write components in the processor) [13], [30]. (ii) They fall back to bandwidth, thus decoupling cache force write-backs from low-performance modes once the bookkeeping components transaction execution. We summarize the contributions of or the NVRAM cache/buffer are saturated [13], [15]. (iii) this paper as following: They inhibit caches from coalescing and reordering persis- • This is the first paper to exploit the combination of tent data writes [13] (details discussed in Section VII). undo+redo logging to relax ordering constraints on caches Forced cache write-backs ensure that cached data up- and memory controllers in persistent memory systems. dates made by completed (i.e., committed) transactions Our design relaxes the ordering constraints in a way are written to NVRAM. This ensures NVRAM is in a that undo logging, redo logging, or copy-on-write alone persistent state with the latest data updates. Memory barriers cannot. stall subsequent data updates until the previous updates by • We enable efficient undo+redo logging for persistent the transaction complete. However, this write-order control memory systems in hardware, which imposes substan- prevents caches from optimizing system performance via tially more challenges than implementing either undo- or coalescing and reordering writes. The forced cache write- redo- logging alone. backs and memory barriers can also block or interfere with • We develop a hardware-controlled cache force write-back subsequent read and write requests that share the memory mechanism, which significantly reduces the performance bus. This happens regardless of whether these requests are overhead of force write-backs by efficiently tuning the independent from the persistent data access or not [26], [31]. 337
Tx_begin Undo logging only Tx begin Tx commit Undo logging of store A1 Uncacheable Cacheable do some reads (a) do some computation Logging Ulog_A1 Ulog_A2 … Ulog_AN Uncacheable_Ulog( addr(A), old_val(A) ) … write new_val(A) //new_val(A) = A’ Write A store A’1 store A’1 store A’N clwb A’1..A’N Time clwb //force writeback Tx_commit “Write A” consists of N store instructions Tx_begin Redo logging only Tx commit do some reads Redo logging of the transaction do some computation (b) Uncacheable_Rlog( addr(A), new_val(A) ) Logging … memory_barrier Rlog_A’1 Rlog_A’2 Rlog_A’N Write A store A’1 store A’1 … store A’N write new_val(A) //new_val(A) = A’ Tx_commit Time Tx_begin Undo+redo logging do some reads … Tx commit Rlog_A’1 Rlog_A’2 Rlog_A’N do some computation Logging … Uncacheable_log( addr(A), new_val(A), old_val(A) ) Ulog_A1 Ulog_A2 Ulog_AN (c) write new_val(A) //new_val(A) = A’ … clwb // can be delayed Write A store A’1 store A’1 store A’N Time Tx_commit Figure 1. Comparison of executing a transaction in persistent memory with (a) undo logging, (b) redo logging, and (c) both undo and redo logging. B. Why Undo+Redo Logging line sized entry write-combining buffer in x86 processors). While prior persistent memory designs only employ either However, it still requires much less time to get out of the undo or redo logging to maintain data persistence, we processor than cached stores. This naturally maintains the observe that using both can substantially relax the afore- write ordering without explicit memory barrier instructions mentioned write-order control placed on caches. between the log and the persistent data writes. That is, Logging in persistent memory. Logging is widely used in logging and working data writes are performed in a pipeline- persistent memory designs [19], [29], [22], [15]. In addition like manner (like in the timeline in Figure 1(a)). is similar to to working data updates, persistent memory systems can the “steal” attribute in DBMS [32], i.e, cached working data maintain copies of the changes in the log. Previous designs updates can steal the way into persistent storage before trans- typically employ either undo or redo logging. Figure 1(a) action commits. However, a downside is that undo logging shows that an undo log records old versions of data before requires a forced cache write-back before the transaction the transaction changes the value. If the system fails during commits. This is necessary if we want to recover the latest an active transaction, the system can roll back to the state transaction state after system failures. Otherwise, the data before the transaction by replaying the undo log. Figure 1(b) changes made by the transaction will not be committed to illustrates an example of a persistent transaction that uses memory. redo logging. The redo log records new versions of data. After system failures, replaying the redo log recovers the Instead, redo logging allows transactions to commit with- persistent data with the latest changes tracked by the redo out explicit cache write-backs because the redo log, once log. In persistent memory systems, logs are typically un- updates complete, already has the latest version of the cacheable because they are meant to be accessed only during transactions (Figure 1(b)). This is similar to the “no-force” the recovery. Thus, they are not reused during application attribute in DBMS [32], i.e., no need to force the working execution. They must also arrive in NVRAM in order, which data updates out of the caches at the end of transactions. is guaranteed through bypassing the caches. However, we must use memory barriers to complete the redo Benefits of undo+redo logging. Combining undo and redo log of A before any stores of A reach NVRAM. We illustrate logging (undo+redo) is widely used in disk-based database this ordering constraint by the dashed blue line in the management systems (DBMSs) [32]. Yet, we find that we timeline. Otherwise, a system crash when the redo logging can leverage this concept in persistent memory design to is incomplete, while working data A is partially overwritten relax the write-order constraints on the caches. in NVRAM (by store Ak ), causes data corruption. Figure 1(a) shows that uncacheable, store-granular undo logging can eliminate the memory barrier between the log Figure 1(c) shows that undo+redo logging combines the and working data writes. As long as the log entry (U log A1 ) benefits of both “steal” and “no-force”. As a result, we is written into NVRAM before its corresponding store to can eliminate the memory barrier between the log and the working data (store A1 ), we can undo the partially persistent writes. A forced cache write-back (e.g., clwb) is completed store after a system failure. Furthermore, store unnecessary for an unlimited sized log. However, it can be A1 must traverse the cache hierarchy. The uncacheable postponed until after the transaction commits for a limited U log A1 may be buffered (e.g., in a four to six cache- sized log (Section II-C). 338
Micro-ops: Processor issues clwb instructions in each transaction, a context Tx_begin(TxID) … do some reads store log_A’1 A’k Core Core switch by the OS can occur before the clwb instruction store log_A’2 cache cache do some computation ... clwb Shared Cache Ulog_C executes. This context switch interrupts the control flow of Uncacheable_log(addr(A), Rlog_C new_val(A), Micro-ops: Memory Controller transactions and diverts the program to other threads. This old_val(A)) load A1 Volatile A’k still in ! caches reintroduces the aforementioned issue of prematurely over- load A2 Nonvolatile write new_val(A) // A’ … A writing the records in a filled log. Implementing per-thread clwb //conservatively used undo Ulog_B Tx_commit store log_A1 A’A Ulog_A logs can mitigate this risk. However, doing so can introduce store log_A2 ... NVRAM redo Rlog_B Rlog_A new persistent memory API and complicates recovery. (a) (b) These inefficiencies expose the drawbacks of undo+redo Figure 2. Inefficiency of logging in software. logging in software and warrants a hardware solution. III. O UR D ESIGN C. Why Undo+Redo Logging in Hardware To address the challenges, we propose a hardware Though promising, undo+redo logging is not used in undo+redo logging design, consisting of Hardware Logging persistent memory system designs because previous software (HWL) and cache Force Write-Back (FWB) mechanisms. logging schemes are inefficient (Figure 2). This section describes our design principles. We describe Extra instructions in the CPU pipeline. Logging in detailed implementation methods and the required software software uses logging functions in transactions. Figure 2(a) support in Section IV. shows that both undo and redo logging can introduce a large number of instructions into the CPU pipeline. As A. Assumptions and Architecture Overview we demonstrate in our experimental results (Section VI), Figure 3(a) depicts an overview of our processor and using only undo logging can lead to more than doubled memory architecture. The figure also shows the circular instructions compared to memory systems without persistent log structure in NVRAM. All processor components are memory. Undo+redo logging can introduce a prohibitively completely volatile. We use write-back, write-allocate caches large number of instructions to the CPU pipeline, occupying common to processors. We support hybrid DRAM+NVRAM compute resources needed for data movement. for main memory, deployed on the processor-memory bus Increased NVRAM traffic. Most instructions for logging with separate memory controllers [19], [13]. However, this are loads and stores. As a result, logging substantially paper focuses on persistent data updates to NVRAM. increases memory traffic. In particular, undo logging must Failure Model. Data in DRAM and caches, but not in not only store to the log, but it must also first read the NVRAM, are lost across system reboots. Our design fo- old values of the working data from the cache and memory cuses on maintaining persistence of user-defined critical data hierarchy. This further increases memory traffic. stored in NVRAM. After failures, the system can recover Conservative cache forced write-back. Logs can have this data by replaying the log in NVRAM. DRAM is used a limited size1 . Suppose that, without losing generality, a to store data without persistence [19], [13]. log can hold undo+redo records of two transactions (Fig- Persistent Memory Transactions. Like prior work in ure 2(b)). To log a third transaction (U log C and Rlog C), persistent memory [19], [22], we use persistent memory we must overwrite an existing log record, say U log A and “transactions” as a software abstraction to indicate regions Rlog A (transaction A). If any updates of transaction A of memory that are persistent. Persistent memory writes (e.g., Ak ) are still in caches, we must force these updates require a persistence guarantee. Figure 2 illustrates a simple into the NVRAM before we overwrite their log entry. The code example of a persistent memory transaction imple- problem is that caches are invisible to software. Therefore, mented with logging (Figure 2(a)), and our with design software does not know whether or which particular updates (Figure 2(b)). The transaction defines object A as critical to A are still in the caches. Thus, once a log becomes full data that needs persistence guarantee. Unlike most logging- (after garbage collection), software may conservatively force based persistent memory transactions, our transactions elim- cache write-backs before committing the transaction. This inate explicit logging functions, cache forced write-back unfortunately negates the benefit of redo logging. instructions, and memory barrier instructions. We discuss Risks of data persistence in multithreading. In addition our software interface design in Section IV. to the above challenges, multithreading further complicates Uncacheable Logs in the NVRAM. We use single- software logging in persistent memory, when a log is shared consumer, single-producer Lamport circular structure [33] by multiple threads. Even if a persistent memory system for the log. Our system software can allocate and truncate the log (Section IV). Our hardware mechanisms append the 1 Although we can grow the log size on demand, this introduces extra log. We chose a circular log structure because it allows system overhead on managing variable size logs [19]. Therefore, we study simultaneous appends and truncates without locking [33], fixed size logs in this paper. 339
Tx_begin(TxID) (A’ , A’ , are new values to be written) 1 2 do some reads do some computation Write A Processor Tx_commit Core Core Core Processor A’1 miss Controllers L1$ L1$ Log Tx_commit Core Cache L1$ Buffer Processor A’1 hit Last-level Cache Tx_commit Write-allocate L1$ A’1 hits in a Memory Controllers Lower-level$ lower-level cache Tail Pointer Log Buffer Head Pointer … Log Buffer Log … … … DRAM NVRAM (Uncacheable) … Volatile … … … Log Nonvolatile Entry: NVRAM NVRAM 1-bit 16-bit 8-bit 48-bit 1-word 1-word Log Log (a) Architecture overview. (b) In case of a store hit in L1 cache. (c) In case of a store miss in L1 cache. Figure 3. Overview of the proposed hardware logging in persistent memory. [19]. Figure 3(a) shows that log records maintain undo and but not committed to memory. On a write miss, the write- redo information of a single update (e.g., store A1 ). In allocate (also called fetch-on-write) policy requires the cache addition to the undo (A1 ) and redo (A1 ) values, log records to first load (i.e., allocate) the entire missing cache line be- also contain the following fields: a 16-bit transaction ID, an fore writing new values to it. HWL leverages the write-back, 8-bit thread ID, a 48-bit physical address of the data, and write-allocate caching policies to feasibly enable undo+redo a torn bit. We use a torn bit per log entry to indicate the logging in persistent memory. HWL automatically triggers a update is complete [19]. Torn bits have the same value for all log update on a persistent write in hardware. HWL records entries in one pass over the log, but reverses when a log entry both redo and undo information in the log entry in NVRAM is overwritten. Thus, completely-written log records all have (shown in Figure 2(b)). We get the redo data from the the same torn bit value, while incomplete entries have mixed currently in-flight write operation itself. We get the undo values [19]. The log must accommodate all write requests data from the write request’s corresponding write-allocated of undo+redo. cache line. If the write request hits in the L1 cache, we The log is typically used during system recovery, and read the old value before overwriting the cache line and rarely reused during application execution. Additionally, log use that for the undo log. If the write request misses in updates must arrive in NVRAM in store-order. Therefore, we L1 cache, that cache line must first be allocated anyway, at make the log uncacheable. This is in line with most prior which point we get the undo data in a similar manner. The works, in which log updates are written directly into a write- log entry, consisting of a transaction ID, thread, the address combine buffer (WCB) [19], [31] that coalesces multiple of the write, and undo and redo values, is written out to the stores to the same cache line. circular log in NVRAM using the head and tail pointers. These pointers are maintained in special registers described B. Hardware Logging (HWL) in Section IV. The goal of our Hardware Logging (HWL) mechanism Inherent Ordering Guarantee Between the Log and is to enable feasible undo+redo logging of persistent data Data. Our design does not require explicit memory barriers in our microarchitecture. HWL also relaxes ordering con- to enforce that undo log updates arrive at NVRAM before straints on caching in a manner that neither undo nor its corresponding working data. The ordering is naturally en- redo logging can. Furthermore, our HWL design leverages sured by how HWL performs the undo logging and working information naturally available in the cache hierarchy but data updates. This includes i) the uncached log updates and not to the programmer or software. It does so without cached working data updates, and ii) store-granular undo the performance overhead of unnecessary data movement logging. The working data writes must traverse the cache or executing logging, cache force-write-back, or memory hierarchy, but the uncacheable undo log updates do not. barrier instructions in pipeline. Furthermore, our HWL also provides an optional volatile Leveraging Existing Undo+Redo Information in Caches. log buffer in the processor, similar to the write-combining Most processors caches use write-back, write-allocate buffers in commodity processor design, that coalesces the caching policies [34]. On a write hit, a cache only updates log updates. We configure the number of log buffer entries the cache line in the hitting level with the new values. A based on cache access latency. Specifically, we ensure that dirty bit in the cache tag indicates cache values are modified the log updates write out of the log buffer before a cached 340
store writes out of the cache hierarchy. Section IV-C and write the log updates into NVRAM in the order they are Section VI further discuss and evaluate this log buffer. issued (the log buffer is a FIFO). Therefore, log updates of subsequent transactions can only be written into NVRAM C. Decoupling Cache FWBs and Transaction Execution after current log updates are written and committed. Writes are seemingly persistent once their logs are written to NVRAM. In fact, we can commit a transaction once log- E. Putting It All Together ging of that transaction is completed. However, this does not Figure 3(b) and (c) illustrate how our hardware logging guarantee data persistence because of the circular structure works. Hardware treats all writes encompassed in persistent of the log in NVRAM (Section II-A). However, inserting transactions (e.g., write A in the transaction delimited by cache write-back instructions (such as clflush and clwb) tx_begin and tx_commit in Figure 2(b)) as persistent in software can impose substantial performance overhead writes. Those writes invoke our HWL and FWB mecha- (Section II-A). This further complicates data persistence nisms. They work together as follows. Note that log updates support in multithreading (Section II-C). go directly to the WCB or NVRAM if the system does not We eliminate the need for forced write-back instructions adopt the log buffer. and guarantee persistence in multithreaded applications by The processor sends writes of data object A (a variable or designing a cache Force-Write-Back (FWB) mechanism in other data structure), consisting of new values of one or more hardware. FWB is decoupled from the execution of each cache lines {A1 , A2 , ...}, to the L1 cache. Upon updating an transaction. Hardware uses FWB to force certain cache L1 cache line (e.g., from old value A1 to a new value A1 ): blocks to write-back when necessary. FWB introduces a 1) Write the new value (redo) into the cache line (). force write-back bit (fwb) alongside the tag and dirty bit of a) If the update is the first cache line update of each cache line. We maintain a finite state machine in each data object A, the HWL mechanism (which has cache block (Section IV-D) using the fwb and dirty bits. the transaction ID and the address of A from Caches already maintain the dirty bit: a cache line update the CPU) writes a log record header into the log sets the bit and a cache eviction (write-back) resets it. A buffer. cache controller maintains our fwb bit by scanning cache b) Otherwise, the HWL mechanism writes the new lines periodically. On the first scan, it sets the fwb bit in value (e.g., A1 ) into the log buffer. dirty cache blocks if unset. On the second scan, it forces write-backs in all cache lines with {f wb, dirty} = {1, 1}. 2) Obtain the undo data from the old value in the cache If the dirty bit ever gets reset for any reason, the fwb bit line (). This step runs parallel to Step-1. also resets and no forced write-back occurs. a) If the cache line write request hits in L1 (Fig- Our FWB design is also decoupled from software multi- ure 3(b)), the L1 cache controller immediately threading mechanisms. As such, our mechanism is impervi- extracts the old value (e.g., A1 ) from the cache ous to software context switch interruptions. That is, when line before writing the new value. The cache the OS requires the CPU to context switch, hardware waits controller reads the old value from the hitting until ongoing cache write-backs complete. The frequency line out of the cache read port and writes it into of the forced write-backs can vary. However, forced write- the log buffer in the Step-3. No additional read backs must be faster than the rate at which log entries instruction is necessary. with uncommitted persistent updates are overwritten in the b) If the write request misses in the L1 cache circular log. In fact, we can determine force write-back (Figure 3(c)), the cache hierarchy must write- frequency (associated with the scanning frequency) based on allocate that cache block as is standard. The the log size and the NVRAM write bandwidth (discussed in cache controller at a lower-level cache that owns Section IV-D). Our evaluation shows the frequency determi- that cache line extracts the old value (e.g., A1 ). nation (Section VI). The cache controller sends the extracted old value to the log buffer in Step-3. D. Instant Transaction Commits 3) Update the undo information of the cache line: the Previous designs require software or hardware memory cache controller writes the old value of the cache line barriers (and/or cache force-write-backs) at transaction com- (e.g., A1 ) to the log buffer (). mits to enforce write ordering of log updates (or persistent 4) The L1 cache controller updates the cache line in the data) into NVRAM across consecutive transactions [13], L1 cache (). The cache line can be evicted via stan- [26]. Instead, our design gives transaction commits a “free dard cache eviction policies without being subjected ride”. That is, no explicit instructions are needed. Our to data persistence constraints. Additionally, our log mechanisms also naturally enforce the order of intra- and buffer is small enough to guarantee that log updates inter-transaction log updates: we issue log updates in the traverse through the log buffer faster than the cache order of writes to corresponding working data. We also line traverses the cache hierarchy (Section IV-D). 341
Therefore, this step occurs without waiting for the void persistent_update( int threadid ) corresponding log entries to arrive in NVRAM. { tx_begin( threadid ); 5) The memory controller evicts the log buffer entries // Persistent data updates to NVRAM in a FIFO manner (). This step is write A[threadid]; independent from other steps. tx_commit(); 6) Repeat Step-1-(b) through 5 if the data object A } consists of multiple cache line writes. The log buffer // ... int main() coalesces the log updates of any writes to the same { cache line. // Executes one persistent 7) After log entries of all the writes in the transaction are // transaction per thread issued, the transaction can commit (). for ( int i = 0; i < nthreads; i++ ) 8) Persistent working data updates remain cached until thread t( persistent_update, i ); } they are written back to NVRAM by either normal eviction or our cache FWB. Figure 4. Pseudocode example for tx_begin and tx_commit, where thread ID is transaction ID to perform one persistent transaction per thread. F. Discussion Types of Logging. Systems with non-volatile memory IV. I MPLEMENTATION can adopt centralized [35] or distributed (e.g., per-thread) In this section, we describe the implementation details of logs [36], [37]. Distributed logs can be more scalable than our design and hardware overhead. We covered the impact centralized logs in large systems from software’s perspec- of NVRAM space consumption, lifetime, and endurance in tive. Our design works with either type of logs. With Section III-F. centralized logging, each log record needs to maintain a thread ID, while distributed logs do not need to maintain this information in log records. With centralized log, our A. Software Support hardware design effectively reduces the software overhead Our design has software support for defining persistent and can substantially improve system performance with real memory transactions, allocating and truncating the circular persistent memory workloads as we show in our experi- log in NVRAM, and reserving a special character as the log ments. In addition, our design also allows systems to adopt header indicator. alternative formats of distributed logs. For example, we can Transaction Interface. We use a pair of transaction func- partition the physical address space into multiple regions and tions, tx_begin( txid ) and tx_commit(), that de- maintain a log per memory region. We leave the evaluation fine transactions which do persistent writes in the program. of such log implementations to our future work. We use txid to provide the transaction ID information used NVRAM Capacity Utilization. Storing undo+redo log can by our HWL mechanism. This ID is groups writes from the consume more NVRAM space than either undo or redo same transaction. This transaction interface has been used alone. Our log uses a fixed-size circular buffer rather than by numerous previous persistent memory designs [13], [29]. doubling any previous undo or redo log implementation. Figure 4 shows an example of multithreaded pseudocode The log size can trade off with the frequency of our with our transaction functions. cache FWB (Section IV). The software support discussed System Library Functions Maintain the Log. Our HWL in Section IV-A allow users to determine the size of the log. mechanism performs log updates, while the system software Our FWB mechanism will adjust the frequency accordingly maintains the log structure. In particular, we use system li- to ensure data persistence. brary functions, log_create() and log_truncate() Lifetime of NVRAM Main Memory. The lifetime of the (similar to functions used in prior work [19]), to allocate and log region is not an issue. Suppose a log has 64K entries truncate the log, respectively. The system software sets the ( 4MB) and NVRAM (assuming phase-change memory) has log size. The memory controller obtains log maintenance a 200 ns write latency. Each entry will be overwritten once information by reading special registers (Section IV-B), every 64K × 200 ns. If NVRAM endurance is 108 writes, indicating the head and tail pointers of the log. Further- a cell, even statically allocated to the log, will take 15 more, a single transaction that exceeds the originally al- days to wear out, which is plenty of time for conventional located log size can corrupt persistent data. We provide NVRAM wear-leveling schemes to trigger [38], [39], [40]. two options to prevent overflows: 1) The log_create() In addition, our scheme has two impacts on overall NVRAM function allocates a large-enough log by reading the max- lifetime: logging normally leads to write amplification, but imum transaction size from the program interface (e.g., we improve NVRAM lifetime because our caches coalesce #define MAX_TX_SIZE N); 2) An additional library writes. The overall impact is likely slightly negative. How- function log_grow() allocates additional log regions ever, wear-leveling will trigger before any damage occurs. when the log is filled by an uncommitted transaction. 342
B. Special Registers reset force-write-back The txid argument from tx_begin() translates into cache an 8-bit unsigned integer (a physical transaction ID) stored line not write set in a special register in the processor. Because the transaction dirty fwb,dirty fwb,dirty fwb=1 fwb,dirty IDs group writes of the same transactions, we can simply ={0,0} = {0,1} = {1,1} pick a not-in-use physical transaction ID to represent a write-back newly received txid. An 8-bit length can accommodate Figure 5. State machine in cache controller for FWB. 256 unique active persistent memory transactions at a time. A physical transaction ID can be reused after the transaction execution, baseline cache controllers naturally set the dirty commits. and valid bits to 1 whenever a cache line is written and reset We also use two 64-bit special registers to store the the dirty bit back to 0 after the cache line is written back head and tail pointers of the log. The system library ini- to a lower level (typically on eviction). To implement our tializes the pointer values when allocating the log using state machine, the cache controllers periodically scan the log_create(). During log updates, the memory con- valid, dirty, and fwb bits of each cache line and performs troller and log_truncate() function update the pointers. the following. If log_grow() is used, we employ additional registers to • A cache line with {f wb, dirty} = {0, 0} is in IDLE state; store the head and tail pointers of newly allocated log regions the cache controller does nothing to those cache lines; and an indicator of the active log region. • A cache line with {f wb, dirty} = {0, 1} is in the FLAG C. An Optional Volatile Log Buffer state; the cache controller sets the fwb bit to 1. This indicates that the cache line needs a write-back during To improve performance of log updates to NVRAM, we the next scanning iteration if it is still in the cache. provide an optional log buffer (a volatile FIFO, similar to • A cache line with {f wb, dirty} = {1, 1} is in FWB state; WCB) in the memory controller to buffer and coalesce log the cache controller force writes-back this line. After the updates. This log buffer is not required for ensuring data forced write-back, the cache controller changes the line persistence, but only for performance optimization. Data persistence requires that log records arrive at back to IDLE state by resetting {f wb, dirty} = {0, 0}. NVRAM before the corresponding cache line with the • If a cache line is evicted from the cache at any point, the working data. Without the log buffer, log updates are di- cache controller resets its state to IDLE. rectly forced to the NVRAM bus without buffering in the Determining the Cache FWB Frequency. The tag scanning processor. If we choose to adopt a log buffer with N entries, frequency determines the frequency of our cache force write- a log entry will take N cycles to reach the NVRAM bus. back operations. The FWB must occur as frequently as to A data store sent to the L1 cache takes at least the latency ensure that the working data is written back to NVRAM (cycles) of all levels of cache access and memory controller before its log records are overwritten by newer updates. queues before reaching the NVRAM bus. The the minimum As a result, the more frequent the write requests, the more value of this latency is known at design time. Therefore, frequent the log will be overwritten. The larger the log, we can ensure that log updates arrive at the NVRAM bus the less frequent the log will be overwritten. Therefore, before the corresponding data stores by designing N to be the scanning frequency is determined by the maximum log smaller than the minimum number of cycles for a data store update frequency (bounded by NVRAM write bandwidth to traverse through the cache hierarchy. Section VI evaluates since applications cannot write to the NVRAM faster than the bound of N and system performance across various log its bandwidth) and log size (see the sensitivity study in buffer sizes based on our system configurations. Section VI). To accommodate large cache sizes with low scanning performance overhead, we also grow the size of D. Cache Modifications the log to reduce the scanning frequency accordingly. To implement our cache force write-back scheme, we add E. Summary of Hardware Overhead one fwb bit to the tag of each cache line, alongside the dirty bit as in conventional cache implementations. FWB maintain Table I presents the hardware overhead of our imple- three states (IDLE, FLAG, and FWB) for each cache block mented design in the processor. Note that these values using these state bits. may vary depending on the native processor and ISA. Our implementation assumes a 64-bit machine, hence why the Cache Block State Transition. Figure 5 shows the finite- circular log head and tail pointers are 8 bytes. Only half of state machine for FWB, implemented in the cache controller these bytes are required in a 32-bit machine. The size of of each level. When an application begins executing, cache the log buffer varies based on the size of the cache line. controllers initialize (reset) each cache line to the IDLE The size of the overhead needed for the fwb state varies on state by setting fwb bit to 0. Standard cache implementation the total number of cache lines at all levels of cache. This also initializes dirty and valid bits to 0. During application is much lower than previous studies that track transaction 343
Mechanism Logic Type Size Processor Similar to Intel Core i7 / 22 nm Cores 4 cores, 2.5GHz, 2 threads/core Transaction ID register flip-flops 1 Byte IL1 Cache 32KB, 8-way set-associative, Log head pointer register flip-flops 8 Bytes 64B cache lines, 1.6ns latency, Log tail pointer register flip-flops 8 Bytes DL1 Cache 32KB, 8-way set-associative, Log buffer (optional) SRAM 964 Bytes 64B cache lines, 1.6ns latency, Fwb tag bit SRAM 768 Bytes L2 Cache 8MB, 16-way set-associative, 64B cache lines, 4.4ns latency Table I Memory Controller 64-/64-entry read/write queues S UMMARY OF MAJOR HARDWARE OVERHEAD . 8GB, 8 banks, 2KB row NVRAM DIMM 36ns row-buffer hit, 100/300ns information in cache tags [13]. The numbers in the table read/write row-buffer conflict [44]. were computed based on the specifications of all our system Power and Energy Processor: 149W (peak) caches described in Section V. NVRAM: row buffer read (write): 0.93 (1.02) pJ/bit, array Note that these are major state logic components on- read (write): 2.47 (16.82) pJ/bit [44] chip. Our design also also requires additional gates for logic operations. However, these gates are primarily small and Table II P ROCESSOR AND MEMORY CONFIGURATIONS . medium-sized gates, on the same complexity level as a multiplexer or decoder. Memory Name Footprint Description F. Recovery Hash 256 MB Searches for a value in an [29] open-chain hash table. Insert We outline the steps of recovering the persistent data in if absent, remove if found. systems that adopt our design. RBTree 256 MB Searches for a value in a red-black Step 1: Following a power failure, the first step is to obtain [13] tree. Insert if absent, remove if found the head and tail pointers of the log in NVRAM. These SPS 1 GB Random swaps between entries [13] in a 1 GB vector of values. pointers are part of the log structure. They allow systems to BTree 256 MB Searches for a value in a B+ tree. correctly order the log entries. We use only one centralized [45] Insert if absent, remove if found circular log for all transactions for all threads. SSCA2 16 MB A transactional implementation Step 2: The system recovery handler fetches log entries [46] of SSCA 2.2, performing several from NVRAM and use the address, old value, and new analyses of large, scale-free graph. value fields to generate writes to NVRAM to the addresses Table III specified. The addresses are maintained via page table in A LIST OF EVALUATED MICROBENCHMARKS . NVRAM. We identify which writes did not commit by logging and clwb instructions. We feed the performance sim- tracing back from the tail pointer. Log entries with mis- ulation results into McPAT [43], a widely used architecture- matched values in NVRAM are considered non-committed. level power and area modeling tool, to estimate processor The address stored with each entry corresponds to the dynamic energy consumption. We modify the McPAT pro- address of the persistent data member. Aside from the head cessor configuration to model our hardware modifications, and tail pointers, we also use the torn bit to correctly order including the components added to support HWL and FWB. these writes [19]. Log entries with the same txid and torn We adopt phase-change memory parameters in the NVRAM bit are complete. DIMM [44]. Because all of our performance numbers shown Step 3: The generated writes bypass the caches and go in Section VI are relative, the same observations are valid directly to NVRAM. We use volatile caches, so their states for different NVRAM latency and access energy. Our work are reset and all generated writes on recovery are persistent. focuses on improving persistent memory access so we do Therefore, they can bypass the caches without issue. not evaluate DRAM access in our experiments. Step 4: We update the head and tail pointers of the circular We evaluate both microbenchmarks and real workloads log for each generated persistent write. After all updates in our experiments. The microbenchmarks repeatedly up- from the log are redone (or undone), the head and tail date persistent memory storing to different data structures pointers of the log point to entries to be invalidated. including hash table, red-black tree, array, B+tree, and graph. These are data structures widely used in storage V. E XPERIMENTAL S ETUP systems [29]. Table III describes these benchmarks. Our We evaluate our design by implementing it in Mc- experiments use multiple versions of each benchmark and SimA+ [41], a Pin-based [42] cycle-level multi-core simula- vary the data type between integers and strings within them. tor. We configure the simulator to model a multi-core out-of- Data structures with integer elements pack less data (smaller order processor with NVRAM DIMM described in Table II. than a cache line) per element, whereas those with strings Our simulator also models additional memory traffic for require multiple cache lines per element. This allows us to 344
explore complex structures used in real-world applications. consumption, compared with software logging. Note that In our microbenchmarks, each transaction performs an in- our design supports undo+redo logging, while the evaluated sert, delete, or swap operation. The number of transactions software logging mechanisms only support either undo or is proportional to the data structure size, listed as “memory redo logging, not both. Fwb yields higher throughput and footprint” in Table III. We compile these benchmarks in lower energy consumption: overall, it improves throughput native x86 and run them on the McSimA+ simulator. We by 1.86× with one thread and 1.75× with eight threads, evaluate both singlethreaded and multithreaded versions of compared with the better of redo-clwb and undo-clwb. each benchmark. In addition, we evaluate the set of real SSCA2 and BTree benchmarks generate less throughput and workload benchmarks from the WHISPER persistent mem- energy improvement over software logging. This is because ory benchmark suite [11]. The benchmark suite incorporates SSCA2 and BTree use more complex data structures, where various workloads, such as key-value stores, in-memory the overhead of manipulating the data structures outweigh databases, and persistent data caching, which are likely to that of the log structures. Figure 9 shows that our design benefit from future persistent memory techniques. substantially reduces NVRAM writes. The figures also show that unsafe-base, redo-clwb, and VI. R ESULTS undo-clwb significantly degrade throughput by up to 59% We evaluate our design in terms of transaction throughput, and impose up to 62% memory energy overhead compared instruction per cycle (IPC), instruction count, NVRAM with the ideal case non-pers. Our design brings system traffic, and dynamic energy consumption. Our experiments throughput back up. Fwb achieves 1.86× throughput, with compare among the following cases. only 6% processor-memory and 20% dynamic memory • non-pers – This uses NVRAM as a working memory energy overhead, respectively. Furthermore, our design’s without any data persistence or logging. This configu- performance and energy benefits over software logging ration yields an ideal yet unachievable performance for remain as we increase the number of threads. persistent memory systems [13]. IPC and Instruction Count. We also study IPC number of • unsafe-base – This uses software logging without forced executed instructions, shown in Figure 7. Overall, hwl and cache write-backs. As such, it does not guarantee data fwb significantly improve IPC over software logging. This persistence (hence “unsafe”). Note that the dashed lines appears promising because the figure shows our hardware in our figures show the best case achieved between either logging design executes much fewer instructions. Compared redo or undo logging for that benchmark. with non-pers, software logging imposes up to 2.5× the • redo-clwb and undo-clwb – Software redo and undo number of instructions executed. Our design fwb only im- logging, respectively. These invoke the clwb instruction poses a 30% instruction overhead. to force cache write-backs after persistent transactions. • hw-rlog and hw-ulog – Hardware redo or undo logging Performance Sensitivity to Log Buffer Size. Section IV-C with no persistence guarantee (like in unsafe-base). These discusses how the log buffer size is bounded by the data show an extremely optimized performance of hardware persistence requirement. The log updates must arrive at undo or redo logging [13]. NVRAM before its corresponding working data updates. • hwl – This design includes undo+redo logging from our This bound is ≤15 entries based on our processor configu- hardware logging (HWL) mechanism, but uses the clwb ration. Indeed, larger log buffers better improve throughput instruction to force cache write-backs. as we studied using the hash benchmark (Figure 11(a)). • fwb – This is the full implementation of our hardware An 8-entry log buffer improves system throughput by 10%; undo+redo logging design with both HWL and FWB. our implementation with a 15-entry log buffer improves throughput by 18%. Further increasing the log buffer size, A. Microbenchmark Results which may no longer guarantee data persistence, additionally We make the following major observations of our mi- improves system throughput until reaching the NVRAM crobenchmark experiments and analyze the results. We eval- write bandwidth limitation (64 entries based on our NVRAM uate benchmark configurations from single to eight threads. configuration). Note that the system throughput results The prefixes of these results correspond to one (-1t), two with 128 and 256 entries are generated assuming infinite (-2t), four (-4t), and eight (-8t) threads. NVRAM write bandwidth. We also improve throughput over System Performance and Energy Consumption. Fig- baseline hardware logging hw-rlog and hw-ulog. ure 6 and Figure 8 compare the transaction throughput and Relation Between FWB Frequency and Log Size. Sec- memory dynamic energy of each design. We observe that tion IV-D discusses that the force write-back frequency processor dynamic energy is not significantly altered by is determined by the NVRAM write bandwidth and log different configurations. Therefore, we only show memory size. With a given NVRAM write bandwidth, we study the dynamic energy in the figure. The figures illustrate that relation between the required FWB frequency and log size. hwl alone improves system throughput and dynamic energy Figure 11(b) shows that we only need to perform forced 345
Figure 6. Transaction throughput speedup (higher is better), normalized to unsafe-base. ! " ######## # # # # # ######$# # # # # ! Figure 7. IPC speedup (higher is better) and instruction count (lower is better), normalized to unsafe-base. Figure 8. Dynamic energy reduction (higher is better), normalized to unsafe-base (dashed line). write-backs every three million cycles if we have a 4MB much higher performance, lower energy, and lower NVRAM log. As a result, the fwb tag scanning only introduces 3.6% traffic than our baselines. Compared with redo-clwb and performance overhead with our 8MB cache. undo-clwb, our design significantly reduces the dynamic B. WHISPER Results memory energy consumption of tpcc and ycsb due to the high write intensity in these workloads. Overall, our design Compared with microbenchmarks, we observe even more (fwb) achieves up to 2.7× the throughput of the best case promising performance and energy improvements in real in redo-clwb and undo-clwb. This is also within 73% of persistent memory workloads in the WHISPER benchmark non-pers throughput of the same benchmarks. In addition, suite with large data sets (Figure 10). Among the WHIS- our design achieves up to a 2.43× reduction in dynamic PER benchmarks, ctree and hashmap benchmarks accu- memory over the baselines. rately correspond to and reflect the results achieved in our microbenchmarks due to their similarities. Although the magnitude of improvement vary, our design leads to 346
"""#""""""""""""%"""""""""""""""""""""&"""""""""""""""""""""""""""""#"""""""""""""""""""#"""&""""""""""&"""""""""""""""""""""""""""""""""""""""""""" Figure 9. Memory write traffic reduction (higher is better), normalized to unsafe-base (dashed line). Figure 10. WHISPER benchmark results, including IPC, dynamic memory energy consumption, transaction throughput, and NVRAM write traffic, normalized to unsafe-base (the dashed line). (!/ )!'"', or redo logging. As a result, the studies do not provide (!- (!,"', the level of relaxed ordering offered by our design. In (!+ (!'"', (!) addition, DudeTM [47] also relies on a shadow memory ,!'"'- )!/"'. ( which can incur substantial memory access cost. Doshi "" '!/ '!'1'' et al. uses redo logging for data recoverability with a ()/ ),- ,() )'+/ (-*/+ *).-/ (')+ +'0- /(0) -+ ' / (- *) -+ ()/ ),- backend controller [48]. The backend controller reads log #$ entries from the log in memory and updates data in-place. Figure 11. Sensitivity studies of (a) system throughput with varying log However, this design can unnecessarily saturate the memory buffer sizes and (b) cache fwb frequency with various NVRAM log sizes. read bandwidth needed for critical read operations. Also, it requires a separate victim cache to protect from dirty cache VII. R ELATED W ORK blocks. Instead, our design directly uses dirty cache bits to Compared to previous architecture support for persistent enforce persistence. memory systems, our design further relaxes ordering con- straints on caches with less hardware cost.2 Hardware support for persistent memory. Recent studies also propose general hardware mechanisms for persistent Hardware support for logging. Several recent studies memory with or without logging. Recent works propose that proposed hardware support for log-based persistent mem- caches may be implemented in software [49], or an addi- ory design. Lu et al. proposes custom hardware logging tional non-volatile cache integrated in the processor [50], mechanisms and multi-versioning caches to reduce intra- and [13] to maintain persistence. However, doing so can double inter-transaction dependencies [24]. However, they require the memory footprint for persistent memory operations. both large-scale changes to the cache hierarchy and cache Other works [31], [26], [51] optimize the memory controller multi-versioning support. Kolli et al. proposes a delegated to improve performance by distinguishing logging and data persist ordering [15] that substantially relaxes persistence updates. Epoch barrier [29], [16], [52] is proposed to relax ordering constraints by leveraging hardware support and the ordering constraints of persistent memory by allowing cache coherence. However, the design relies on snoop-based coarse-grained transaction ordering. However, epoch barriers coherence and a dedicated persistent memory controller. incur non-trivial overhead to the cache hierarchy. Further- Instead, our design is flexible because it directly leverages more, system performance can be sub-optimal with small the information already in the baseline cache hierarchy. epoch sizes, which is observed in many persistent mem- ATOM [35] and DudeTM [47] only implement either undo ory workloads [11]. Our design uses lightweight hardware 2 Volatile TM supports concurrency but does not guarantee persistence in changes on existing processor designs without expensive memory. non-volatile on-chip transaction buffering components. 347
You can also read