Professional Documents
Culture Documents
Solid-State Drive (SSD) Endurance
Solid-State Drive (SSD) Endurance
Solid-State Drive (SSD) Endurance
STANDARD
JESD219A
(Revision of JESD219, September 2010)
JULY 2012
JEDEC standards and publications contain material that has been prepared, reviewed, and
approved through the JEDEC Board of Directors level and subsequently reviewed and approved
by the JEDEC legal counsel.
JEDEC standards and publications are designed to serve the public interest through eliminating
misunderstandings between manufacturers and purchasers, facilitating interchangeability and
improvement of products, and assisting the purchaser in selecting and obtaining with minimum
delay the proper product for use by those other than JEDEC members, whether the standard is to
be used either domestically or internationally.
JEDEC standards and publications are adopted without regard to whether or not their adoption
may involve patents or articles, materials, or processes. By such action JEDEC does not assume
any liability to any patent owner, nor does it assume any obligation whatever to parties adopting
the JEDEC standards or publications.
The information included in JEDEC standards and publications represents a sound approach to
product specification and application, principally from the solid state device manufacturer
viewpoint. Within the JEDEC organization there are procedures whereby a JEDEC standard or
publication may be further processed and ultimately become an ANSI standard.
No claims to be in conformance with this standard may be made unless all requirements stated in
the standard are met.
Inquiries, comments, and suggestions relative to the content of this JEDEC standard or
publication should be addressed to JEDEC at the address below, or refer to www.jedec.org under
Standards and Documents for alternative contact information.
Published by
JEDEC Solid State Technology Association 2012
3103 North 10th Street
Suite 240 South
Arlington, VA 22201-2107
This document may be downloaded free of charge; however JEDEC retains the
copyright on this material. By downloading this file the individual agrees not to
charge for or resell the resulting material.
DONT VIOLATE
THE
LAW!
(From JEDEC Board Ballot, JCB-12-16, formulated under the cognizance of the JC-64.8 Subcommittee
on Solid-State Drives.)
1 Scope
This standard defines workloads for the endurance rating and endurance verification of SSD application
classes. These workloads shall be used in conjunction with the Solid State Drive (SSD) Requirements and
Endurance Test Method standard, JESD218.
2 Reference documents
JESD218, Solid State Drive (SSD) Requirements and Endurance Test Method
cluster: The minimum # of contiguous LBAs allocated by the host operating system.
Cold LBA Range: An LBA Range not referenced by a write or trim in a trace.
command trace: A trace of I/O commands.
compression: The process of scaling LBAs associated with commands in the Master Trace to produce a
Test Trace with a smaller LBA Range.
entropy: The non-compressibility of a data pattern when in file format such that 100% entropy has no
reduction in file size and 50% entropy has approximately a 50% reduction in file size when converting to
a zip file.
expansion: The process of scaling LBAs associated with commands in the Master Trace to produce a
Test Trace with a larger LBA Range.
footprint: A set of LBAs.
Free LBA Space: A set of LBAs within LBA Address Space, which are not currently allocated for data
storage by the host OS.
LBA Address Space: The full set of user addressable LBAs on the device.
LBA Range: The set of contiguous LBA addresses bounded by the lowest and highest LBA of an
addressed structure.
Maximum LBA: A value specifying the LBA number corresponding to the last LBA in the LBA
Address Space.
Master Trace: A command trace typical of a period of continuous drive operation in a typical client
environment, from which Test Traces are derived.
JEDEC Standard No. 219
Page 2
The enterprise endurance workload consists of random data distributed across an SSD in a manner similar
to some enterprise workload traces that are publicly available for review.
Prior to running the workload, the SSD under test shall have the user-addressable LBA space filled with
valid data (e.g., the drive does not return a data read error because of the content of the LBA prior to
being written during the test routine). Initialization may not be necessary if the formatted SSD satisfies
this requirement.
a) The enterprise endurance workload shall be comprised of random data with the following payload
size distribution:
b) The data payloads greater than or equal to 4096 bytes data payload sizes shall be arranged such that
the data payloads less than 4096 bytes are pseudo randomized among the data payloads greater than
or equal to 4096 bytes. Data payloads greater than or equal to 4096 bytes are aligned on 4K
boundaries.
JEDEC Standard No. 219A
Page 3
c) The workload shall be distributed across the SSD such that the following is achieved:
d) To avoid testing only a particular area of the SSD, the distribution described in c) is offset through the
user LBA space on different units under test such that all of the SSD LBAs are subjected to the
highest number of accesses (e.g., SSD 1 has LBA group a applied to the first 5% of LBAs, SSD 2 has
LBA group a applied to the next 5% of LBAs, etc).
e) The write data payload size distribution shall be applied to each of the three LBA groups
concurrently. The write sequence across the LBA groups may be applied in either a deterministic
fashion or randomly, depending on the capabilities of the test tools, so long as the percentage of
accesses to each LBA group conforms to those specified in 4c and the LBA access shall be random
(not sequential) within each LBA group. An example of a deterministic method is given in Annex A.1
and an example of a random method is given in Annex A.2.
f) Random data is considered to have 100% entropy. The randomization of the data shall be such that if
data compression/reduction is done by the SSD under test, the compression/reduction has the same
effect as it would on encrypted data. It is acceptable to substitute a few bytes in each sector with
metadata (such as the LBA number) or other information in place of the random data in those bytes if
the addition of such information provides enhanced test interpretation capability. The random data for
the payload may be generated by various means. An informative example script for generating the
random data and the read/write distribution across LBA groups is provided in Annex A.2. This script
uses open-source software that may be found at vdbench.org.
The standard TBW rating for a client drive shall be derived for and verified under the following workload
conditions:
a) PreCond%full = 100%;
b) trim commands enabled; and
c) random data pattern.
Additional TBW ratings may optionally be derived and verified for different values of these parameters;
however, such ratings shall be reported only in addition to the standard TBW rating. See clause 6
concerning extrapolation of non-standard TBW ratings.
JEDEC Standard No. 219
Page 4
The preconditioning phase establishes an initial pattern of free LBA distribution within the LBA
Address Space of the drive under test. This phase creates the logical fullness of the drive at the start
of the test phase, as defined by the PreCond%full parameter specified for the test.
1) Write once, sequentially, to the full LBA Address Space using random data (see 5.3.2). If
additional TBW ratings are being determined with non-random data (see 5.3.3), non-random
data shall be used for this step instead of random data.
2) Create Free LBA Space from the Maximum LBA contiguous to the lower LBA address
corresponding to the PreCond%full value if the PreCond%full value is less than 100%.
2. Test Phase
The test phase stresses the drive in a manner that is representative of use during long-term operation
in a client environment. The test phase comprises multiple runs of a Test Trace. The Test Trace
has the same LBA footprint for each iteration.
During the test phase, a Test Trace, as specified in 5.2.2, is run repeatedly, per the methods
specified in JESD218.
The client endurance workload traces referenced in this standard are contained in a trace library
maintained by JEDEC and can be downloaded at www.jedec.org, using search criteria: JESD219.
This Master Trace should not be used to verify the endurance of SSDs utilized in cache applications
since the workload may vary from the activity performed in the client workload Master Trace.
1
JESD219 refers to trim commands. Trim applies to the ATA command set. The equivalent of the trim command
is defined in other interface standards (e.g., SCSI Unmap; NVMe Deallocate). If a device using a command set
other than ATA is being tested, the relevant form of trim for the devices command set should be used by the test
software.
JEDEC Standard No. 219A
Page 5
Compression is achieved by reducing the length of Cold LBA Ranges in the trace. Expansion is achieved
by increasing the length of Cold LBA Ranges in the trace.
Expanded
LBA Footprint for 1 2 3 4 5
Test Trace
LBA Footprint of
1 2 3 4 5
Master Trace
Compressed
LBA Footprint for 1 2 3 4 5
Test Trace
Compressed Expanded
Write/Trim LBA Range Cold LBA Range
Cold LBA Range Cold LBA Range
If the Master Trace has an LBA Range = M, and it is required to create a Test Trace with LBA Range =
T, then the total length of Cold LBA Ranges within the Master Trace is compressed (or expanded) by M-
T in order to create the Test Trace.
If the total length of all the Cold LBA Ranges within the Master Trace is C, then the length of each
individual Cold LBA Range, of length > 20MB, shall be reduced by a fraction (M-T)/C, or increased by
a fraction (T-M)/C, as appropriate. During reduction or expansion, the change in length of an individual
Cold LBA Range should be a multiple of 4KB.
The LBA Range of a Test Trace almost spans the LBA address range of the drive to which it relates. A
Test Trace for a specified SSD_Capacity parameter is derived from the Master Trace with the use of
compression or expansion if required.
The Test Trace may combine consecutive trim commands found in the Master Trace into a single trim
command.
Multiple Test Traces exist in the JEDEC trace library, each corresponding to a specific value of the
SSD_Capacity parameter.
JEDEC Standard No. 219
Page 6
The workload trace files only contain the ATA I/O commands. The data payload content of the LBAs is
not included in the traces due to the size of such a file not being practical and due to the need for the data
to change within the LBA during repeated writes. Some drives may include data compression or reduction
techniques. Some encryption software may cause data to become essentially 100% random. Due to these
variables, random data shall be used as the standard TBW rating condition. Based on examination of
drives in field applications, for additional TBW ratings of drives that incorporate data compression or
reduction techniques, the non-random data shall have entropy of approximately 50%.
Random data shall be generated according to the description for the enterprise workload (see 4f). A local
copy of the test trace file may be written to the SSD in place of some random data as required by the
testing method.
Non-random data patterns should be created using the non-random data file created by the Perl code
located in Annex B.1. The non-random data file generated by this Perl code has approximately 50%
entropy. A random byte offset shall be used to ensure that the data selected from the non-random data file
has sufficient randomness to exceed the SSD_Capacity. It is acceptable to substitute a few bytes in each
sector with metadata (such as the LBA number) or other information in place of the non-random data in
those bytes if the addition of such information provides enhanced test interpretation capability. A local
copy of the test trace file may be written to the SSD in place of some non-random data as required by the
testing method.
See Annex B.1 for an example of Perl code that produces a 1GB data file with approximately 50%
entropy.
See Annex B.2 for an example of Perl code that produces the random byte offset.
See Annex B.3 for an example of Perl code that evaluates the entropy of the output file generated.
5.4 Trim
A minimum sample of two drives shall be tested with the non-standard conditions to be rated
(i.e., PreCond%full < 100%, trim commands disabled, and/or non-random data pattern) to establish the
steady-state write amplification factor (WAFnonstd). One, two, or three of these variables may be combined
in a single test, depending on the desired test configuration. The ratio of the steady-state WAF of the drive
family verified with the standard conditions described in 5.1 (WAFrnd) to the steady-state non-standard
conditions WAF (WAFnonstd) of the drive is used to extrapolate the TBW with non-random data:
WAFstd
TBWstd = TBWnonstd
WAFnonstd
Non-standard TBW ratings shall be reported only in addition to the standard TBW rating.
JEDEC Standard No. 219
Page 8
The write data payload size distribution is applied to each of the three LBA groups. Accesses are mixed
among the LBA groups such that the sequence of single write commands of the defined data payload
sizes are performed within the following LBA group:
1) LBA group a
2) LBA group b
3) LBA group a
4) LBA group c
5) LBA group a
6) LBA group b
7) LBA group a
8) LBA group c
9) LBA group a
10) LBA group b
11) Back to 1) and repeat sequence
This script is provided as an example only. It is not intended to imply a preferred method for generating
the enterprise workload. Due to possible updates made to this open-source software, minor changes to the
script may be required to achieve the desired functions. The following are instructions for running a
VDbench script.
NOTE The script may be wrapped to the next line due to margin limitations. Function identifiers begin each line
of script.
JEDEC Standard No. 219A
Page 9
MAXIO.CMD
echo off
echo **
Echo ** usage example :
echo **
echo ** SSDIO 1 50 3000 MySSD_results
echo ** use Storage Device physicaldrive = 1
echo ** Apply max. Thread count/workload definition = 50
echo ** IO rate set = 3000 IOs per second
echo ** output directory name for results = MySSD_results
echo **
echo Test using SD=%1 Threads=%2 IOrate=%3 results=%4
echo on
pause
echo off
REM ==================================================
REM SSDIO Endurance Profile Example
REM ==================================================
set Drv=%1%
set T=%2%
set IO=%3%
set /A A1=%IO%*90
set /A A=%A1%/100
set /A B1=%IO%*80
set /A B=%B1%/100
set /A C1=%IO%*50
set /A C=%C1%/100
set /A D1=%IO%*10
set /A D=%D1%/100
set /A E=%IO%/100
REM ***************************************************************************
REM enduration time set by elapse time=1000h (hours)
REM set data errors to 10 Any greater then device testing should not continue
REM ***************************************************************************
REM
echo * SSDIO Profile > ssdio.go
echo sd=sd1,lun=\\.\physicaldrive%Drv%,align=4k,threads=%T% >> ssdio.go
echo data_errors=10
echo
wd=wd1,sd=sd1,rdpct=40,seek=100,xfersize=(512,4,1k,1,1.5k,1,2k,1,2.5k,1,3k,1,3.5k,1,4K,67,8k,10,16k,7,32k,3,6
4k,3),range=(1,5),skew=50 >> ssdio.go
echo
wd=wd2,sd=sd1,rdpct=40,seek=100,xfersize=(512,4,1k,1,1.5k,1,2k,1,2.5k,1,3k,1,3.5k,1,4K,67,8k,10,16k,7,32k,3,6
4k,3),range=(6,20),skew=30 >> ssdio.go
echo
wd=wd3,sd=sd1,rdpct=40,seek=100,xfersize=(512,4,1k,1,1.5k,1,2k,1,2.5k,1,3k,1,3.5k,1,4K,67,8k,10,16k,7,32k,3,6
4k,3),range=(21,100),skew=20 >> ssdio.go
echo rd=SSD_Sustain,wd=wd*,iorate=%3%,elapsed=1000h,interval=60 >> ssdio.go
REM echo Please Check these values are correct!
REM pause
vdbench -f ssdio.go -o %4%
JEDEC Standard No. 219
Page 10
Annex B (informative) Example Perl code associated with non- random data payloads
B.1 Example Perl code that generates the data payload with approximately 50% entropy.
#!/usr/bin/perl
use Getopt::Long;
# Parse arguments...
if (!GetOptions (
"max_len=i" => \$MAX_LEN,
"entropy=f" => \$entropy,
"help" => \&help)) {
die "$0: Failed to parse options";
exit 17;
}
# Initialize RNG...
random_init ();
# Restrict copies to being within this range (further adjusted by $MAX_FIXED below)
$COPY_RANGE_LIMIT = 512;
# Empirically determined so that at 50%, we get ~50% compressibility of the whole file with gzip -9
$random_efficiency = (0.559 + ($entropy / 0.25) * 0.168);
# Determine the number of random vs. "fixed" (copies/repeats) characters we want overall
$len_random = (($entropy > $random_efficiency) ? $MAX_LEN :
($entropy * $random_efficiency * $MAX_LEN));
$len_fixed = ($MAX_LEN - $len_random);
# $fixed_to_random_ratio provides the fine-grained localized control by making things stay close locally
$fixed_to_random_ratio = (($len_fixed > 0) ? ($len_random / $len_fixed) : 0);
}
else {
$char = $fixed_char;
}
# Decrement count, and check to see if we should switch to random for pre-determined amount
unless (--$in_fixed) {
$in_random = $next_in_random;
}
}
else {
# Not fixed -- see if we're currently in random mode
if ($in_random) {
# In random mode, output a random character and decrement count...
$char = int (rand (256));
--$in_random;
}
elsif (!$last_in_fixed && ($len_fixed > 0)) {
# Finished random mode and didn't just fall out of fixed mode (initial state) and have fixed chars
left to generate
# Empirically, about half of compressibility due to runs (very data dependent, of course)
$use_fifo = ((rand (1.0) <= 0.5) && $wrapped);
if ($use_fifo) {
# FIFO (copy) mode
# Need to make sure we have at least a two-character repeat
$fifo_pos = $fifo_ptr - (int (rand ($copy_limit - 2)) + 2);
$fifo_pos += $fifo_max if ($fifo_pos < 0);
$char = $fifo[$fifo_pos];
}
else {
# Repeated character mode
$fixed_char = int (rand (256));
$char = $fixed_char;
}
# Determine fixed length as a bound between the min and the max
$in_fixed = int (rand ($MAX_FIXED - $MIN_FIXED) + $MIN_FIXED);
# Decrement the number of fixed chars we have left to generate
$len_fixed -= $in_fixed;
# Determine how many random characters should follow this fixed sequence --
# Either all the rest if fixed are exhausted, or the right ratio to keep things even...
$next_in_random = (($len_fixed <= 0) ? $len_random :
int ($fixed_to_random_ratio * $in_fixed));
# printf ("Fixed = %d\n", $in_fixed);
}
else {
# We must be out of fixed chars -- it's all random for the rest...
$char = int (rand (256));
}
}
print (FOO chr($char));
$fifo[$fifo_ptr] = $char;
JEDEC Standard No. 219A
Page 13
#
# random_init:
# Initialize the built-in RNG.
sub random_init {
my ($i);
# help:
# Help message...
sub help {
printf ("$0 help:\n");
printf (" -max_len #\n");
printf (" -entropy #.#\n");
printf (" -help \tprint this useful information\n");
printf ("\n");
exit (0);
}
JEDEC Standard No. 219
Page 14
B.2 Example Perl code that generates the data payload with approximately 50% entropy.
#!/usr/bin/Perl
use Getopt::Long;
# Parse arguments...
if (!GetOptions (
"size=i" => \$SIZE,
"help" => \&help)) {
die "$0: Failed to parse options";
exit 17;
}
# Initialize RNG...
random_init ();
#
# random_init:
# Initialize the built-in RNG.
sub random_init {
my ($i);
# help:
# Help message...
sub help {
printf ("$0 help:\n");
printf (" -size # \tsize of the random chunk to generate\n");
printf (" -help \tprint this useful information\n");
printf ("\n");
exit (0);
}
JEDEC Standard No. 219
Page 16
B.3 Example Perl code for evaluating the entropy of the output file generated for data payload
#!/usr/bin/Perl
use Getopt::Long;
use Algorithm::Huffman;
use IPC::Open2;
# Parse arguments...
if (!GetOptions (
"num=i" => \$NUM,
"len=i" => \$LEN,
"samples=i" => \$SAMPLES,
"gzip_cmd=s" => \$GZIP_CMD,
"help" => \&help)) {
die "$0: Failed to parse options";
exit 17;
}
($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $ifile_size) = stat $ifile;
# Initialize RNG...
random_init ();
# Output statistics...
printf ("Entropy (char) for %d samples of length %d: min=%5.3f, max=%5.3f, avg=%5.3f\n",
$SAMPLES, $window_len, $min_ent, $max_ent, ($sum_ent/$SAMPLES));
printf ("Huffman (char) for %d samples of length %d: min=%5.3f, max=%5.3f, avg=%5.3f\n",
$SAMPLES, $window_len, $min_hln, $max_hln, ($sum_hln/$SAMPLES));
($str = $GZIP_CMD) =~ s/ -c//;
printf ("%-14s for %d samples of length %d: min=%5.3f, max=%5.3f, avg=%5.3f\n",
$str, $SAMPLES, $window_len, $min_gln, $max_gln, ($sum_gln/$SAMPLES));
#
# compute_entropy:
# Compute and return the entropy on the argument string of the given length
sub compute_entropy {
my ($str, $len) = @_;
my ($i, $chr, $chr_pos, $prob, $ent, @count);
@count = ();
for ($i = 0; $i < $len; $i++) {
$chr = substr ($str, $i, 1);
$chr_pos = ord ($chr);
++$count[$chr_pos];
}
$ent = 0.0;
for ($i = 0; $i < 256; $i++) {
if ($count[$i]) {
$prob = ($count[$i] / $len);
$ent += $prob * log2 ($prob);
# printf ("count %d, prob %6.4f, ent %6.3f\n", $count[$i], $prob, $ent);
}
}
# Entropy is # of bits needed to encode characters -- convert to fraction of 8 bits (compressibility)
return (-$ent / 8);
}
JEDEC Standard No. 219A
Page 19
#
# compute_huffman:
# Compute and return the Huffman length of the argument string of the given length
sub compute_huffman {
my ($str, $len) = @_;
my ($i, $chr, $huff, $encode_hash, $encode_of_str, %count);
%count = ();
for ($i = 0; $i < $len; $i++) {
$chr = substr ($str, $i, 1);
++$count{$chr};
}
$huff = Algorithm::Huffman->new(\%count);
$encode_hash = $huff->encode_hash;
$encode_of_str = $huff->encode_bitstring($str);
#
# compute_gzip:
# Compute and return the gzip length of the argument string of the given length
sub compute_gzip {
my ($str, $len) = @_;
my ($pid, $i, $j, @out_str);
local (*Reader, *Writer);
$j = 0;
foreach $i (@out_str) {
$j += length ($i);
}
#
# log2:
# Compute and return the log base 2 of the given input.
sub log2 {
my ($val) = @_;
#
# random_init:
# Initialize the built-in RNG.
sub random_init {
my ($i);
# help:
# Help message...
sub help {
printf ("$0 help:\n");
printf (" -num # \tnumber of pieces of size LEN to make the window\n");
printf (" -len # \tlength of each piece over which to evaluate compressibility\n");
printf (" -samples # \tnumber of random spots in file to test\n");
printf (" -gzip_cmd <str>\tcommand to use for compressing each sample\n");
printf (" -help \tprint this useful information\n");
printf ("\n");
exit (0);
}
Standard Improvement Form JEDEC JESD219A
The purpose of this form is to provide the Technical Committees of JEDEC with input from the industry
regarding usage of the subject standard. Individuals or companies are invited to submit comments to
JEDEC. All comments will be collected and dispersed to the appropriate committee(s).
If you can provide input, please complete this form and return to:
Other
Submitted by
Name: Phone:
Company: E-mail:
Address:
City/State/Zip: Date: