SlideShare a Scribd company logo
Eduardo Berrocal García de Carellán
eduardo.berrocal@Intel.com
04/17/2019
SPDK, PMDK & Vtune™ Summit
Agenda
• Introduction
• Hardware Issues
• Error Injection
• Software Bugs
• Conclusions and Q&A
2
SPDK, PMDK & Vtune™ Summit 3
Persistent memory programming
introduces new opportunities…
• Byte addressable
• Cache coherent
• Load/Store access
• no page caching
• Memory-like performance
introduction DRAM
NVDIMM
Intel®Optane™ssd
Pciessd
Pciessd
SATASSD
SATASSD
HDD
HDD
tape
SPDK, PMDK & Vtune™ Summit 4
…but also new challenges
• Programming difficulty
• New classes of bugs
• New vectors to consider for
performance
Introduction(CONT’D) DRAM
NVDIMM
Intel®Optane™ssd
Pciessd
Pciessd
SATASSD
SATASSD
HDD
HDD
tape
SPDK, PMDK & Vtune™ Summit 5
• Module failure
• HDDs and SSDs use RAID
• Memory controllers do not implement RAID
• Data integrity
• Block corruption (i.e., bad blocks)
HARDWAREISSUES
IMC
Cascade Lake
IMC
SPDK, PMDK & Vtune™ Summit 6
Dataintegrity
• What if we discover that our pool is corrupted due to bad blocks?
• Opening a corrupted pool
• Pool gets corrupted while program is running
$ ./myProgram /mnt/pmem/poolfile
/mnt/pmem/poolfile: Input/output error
Bus error (core dumped)
SPDK, PMDK & Vtune™ Summit 7
Dataintegrity
• What if we discover that our pool is corrupted due to bad blocks?
• Pmempool check will also fail
$ cp /mnt/pmem/poolfile ./
cp: error reading '/mnt/pmem/poolfile': Input/output error
# dd if=/dev/pmem0 of=/dev/null
dd: error reading /dev/pmem0: Input/output error
20480+0 records in
20480+0 records out
10485760 bytes (10 MB) copied, 0.0912348 s, 115 MB/s
$ pmempool check –v /mnt/pmem/poolfile
Bus error (core dumped)
SPDK, PMDK & Vtune™ Summit 8
Dataintegrity
• Cleaning the poison by writing to the affected blocks
# cat /sys/block/pmem0/badblocks
20480 1
# dd conv=notrunc if=/dev/zero of=/dev/pmem0 oflag=direct bs=512 seek=20480 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000114311 s, 9.0 MB/s
# cat /sys/block/pmem0/badblocks
#
SPDK, PMDK & Vtune™ Summit 9
Tool-Pmempool
• Standalone utility for management and off-line analysis of persistent memory pools
• It works for both the single-file pools and for pool set files.
• Commands: create, info, dump, check, rm, convert, sync and transform
• usage: pmempool [--version] [--help] <command> [<args>]
SPDK, PMDK & Vtune™ Summit 10
Pmempool(check)
data
header
data
header
Applications are responsible for correcting these errors
We can use pmempool to check (and sometimes correct)
corruptions in the headers
$ pmempool check -v /mnt/pmem/poolfile
checking pool header
incorrect pool header
/mnt/mem/poolfile: not consistent
SPDK, PMDK & Vtune™ Summit 11
Pmempool(check)
$ pmempool check –v –r –N –a /mnt/pmem/poolfile
checking pool header
incorrect pool header
pool_hdr.signature is not valid. Do you want to set it to PMEMBLK? [Y/n] Y
pool_hdr.major is not valid. Do you want to set it to default value 0x1? [Y/n] Y
setting pool_hdr.signature to PMEMBLK
setting pool_hdr.major to 0x1
invalid pool_hdr.poolset_uuid. Do you want to set it to 2a3b402a-2be0-46f0-a86d-7afef54b258a from BTT Info? [Y/n] Y
setting pool_hdr.poolset_uuid to 2a3b402a-2be0-46f0-a86d-7afef54b258a
invalid pool_hdr.checksum. Do you want to regenerate checksum? [Y/n] Y
setting pool_hdr.checksum to 0xb199cec3475bbf3a
checking pmemblk header
pmemblk header correct
checking BTT Info headers
arena 0: BTT Info header checksum correct
checking BTT Map and Flog
arena 0: checking BTT Map and Flog
/mnt/pmem/poolfile: repaired
• Attempting repairs (-r [-N –a])
SPDK, PMDK & Vtune™ Summit
• In PMDK (tools and libraries), pool sets are equivalent to regular pools.
• Pool extensions
• Pool replication
• Local
• Remote
12
PMDKFEATURE-Poolsets
$ cat my_extended_pool.set
PMEMPOOLSET
100G /mountpoint0/myfile.part0
200G /mountpoint1/myfile.part1
400G /mountpoint2/myfile.part2
$ cat my_local_replica.set
PMEMPOOLSET
100G /mountpoint0/myfile
REPLICA
100G /mountpoint1/myreplica
$ cat my_remote_replica.set
PMEMPOOLSET
100G /mountpoint0/myfile
REPLICA user@example.com myremotepool.set
data0
header
data1
header
data2
header
data
header
data
header
+ +
=
data
header
data
header
=
SPDK, PMDK & Vtune™ Summit 13
Pmempool(sync)
$ pmempool check –v mypool.set
replica 0 part 0: checking pool header
replica 0 part 0: incorrect pool header
poolfile.set: not consistent
$ pmempool sync -v mypool.set
mypool.set: synchronized
$ pmempool check –v mypool.set
replica 0: checking shutdown state
replica 0: shutdown state correct
replica 1: checking shutdown state
replica 1: shutdown state correct
replica 0 part 0: checking pool header
replica 0 part 0: pool header correct
replica 1 part 0: checking pool header
replica 1 part 0: pool header correct
mypool.set: consistent
• Repairing a corrupted replica
SPDK, PMDK & Vtune™ Summit 14
ERRORINJECTION
# filefrag -v -b512 /mnt/pmem/poolfile | grep -E "^[ ]+[0-9]+.*" | head -1 | awk '{ print $4 }' | cut -d. -f1
278528
# echo 278528 1 > /sys/block/pmem0/badblocks
• Using sysfs
• What about ndctl?
# ndctl inject-error --block=1 --count=2 namespace0.0
SPDK, PMDK & Vtune™ Summit 15
Softwarebugs
• Persistent memory leaks
• Non-persistent stores
• Stores not added into a transaction
• Memory added to two different transactions
• Memory overwrites
• Unnecessary flushes
• Out-of-order stores
SPDK, PMDK & Vtune™ Summit 16
Persistentmemoryleaks
• Volatile programs treat leaks mainly as a
performance problem
• In persistent programs, we need to also think
about data corruption/loss
• The good: we can recover leaks
• The bad: Garbage collection is not supported
natively in PMKD yet
• The ugly: We need to use macros to access this
API
header
root
obj0 objn-1 objn
objk
SPDK, PMDK & Vtune™ Summit 17
Persistentmemoryleaks
persistent_ptr<my_type> my_data_structure = proot->ds;
PMEMoid raw_root = my_data_structure.raw ();
PMEMoid raw_obj;
POBJ_FOREACH (pop.get_handle (), raw_obj)
{
if (pmemobj_type_num (raw_obj)
== pmemobj_type_num (raw_root)) {
if (my_data_structure.is_missing (raw_obj) == true) {
my_data_structure.add_missing (raw_obj);
}
}
}
• All allocated objects in libpmemobj are always added to an internal list
SPDK, PMDK & Vtune™ Summit 18
Persistentmemoryleaks
• API (libpmemobj) for this internal list:
• POBJ_FIRST (pop, t)
• POBJ_NEXT (o)
• POBJ_FOREACH (pop, varoid)
• POBJ_FOREACH_SAFE (pop, varoid, nvaroid)
• POBJ_FOREACH_TYPE (pop, var)
• POBJ_FOREACH_SAFE_TYPE (pop, var, nvar)
SPDK, PMDK & Vtune™ Summit 19
Tool-Pmemcheck
• New Valgrind* tool developed by Intel®
• You also need an enhanced version of Valgrind* supporting CLFLUSHOPT and CLWB
• Go to https://github.com/pmem/valgrind
• usage: valgrind --tool=pmemcheck [<options>] <program> [<args>]
• More info: valgrind --tool=pmemcheck --help
SPDK, PMDK & Vtune™ Summit 20
Pmemcheck(withoutpmdk)
• Pmemcheck does not have a way to know which memory addresses are persistent and
which ones are volatile
• Pmemcheck does not know where a transaction starts and ends
data = (int *)mmap (NULL, size, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, 0);
VALGRIND_PMC_REGISTER_PMEM_MAPPING (data, size);
...
munmap (data, size);
VALGRIND_PMC_REMOVE_PMEM_MAPPING (data, size);
VALGRIND_PMC_START_X;
...
VALGRIND_PMC_END_TX;
SPDK, PMDK & Vtune™ Summit 21
Tool-Intel®inspector–persistentinspector
• Specifically tailored for persistent memory
• Included as part of Intel® Inspector 2019
• Intel® Inspector is available with
Intel® Parallel Studio XE and Intel® System
Studio
• Analysis
1. pmeminsp cb –pmem-file <pmem_file_path> -- <writer_program> [<params>]
2. pmeminsp ca –pmem-file <pmem_file_path> -- <reader_program> [<params>]
3. pmeminsp rp -- <writer_program> <reader_program>
SPDK, PMDK & Vtune™ Summit 22
• Data written to persistent memory
but not flushed correctly
• Data not flushed may still sit on the
CPU caches and could be lost if
process crashes
Non-persistentstores
writer () {
var1 = "Hello world to PMEM!";
flush (var1);
var1_valid = True;
flush (var1_valid);
}
reader () {
if (var1_valid == True) {
print (var1);
}
}
SPDK, PMDK & Vtune™ Summit 23
• Data written to persistent memory
but not flushed correctly
• Data not flushed may still sit on the
CPU caches and could be lost if
process crashes
Non-persistentstores
writer () {
var1 = "Hello world to PMEM!";
flush (var1);
var1_valid = True;
flush (var1_valid);
}
reader () {
if (var1_valid == True) {
print (var1);
}
}
var1_valid
var1
write
dependency
SPDK, PMDK & Vtune™ Summit 24
Non-persistentstores
$ valgrind --tool=pmemcheck ./test1w_
==28699== pmemcheck-1.0, a simple persistent store checker
==28699== Copyright (c) 2014-2016, Intel Corporation
==28699== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==28699== Command: ./test1w_
==28699==
==28699==
==28699== Number of stores not made persistent: 2
==28699== Stores not made persistent properly:
==28699== [0] at 0x400931: main (test1w_.c:16)
==28699== Address: 0x4023000 size: 4state: DIRTY
==28699== [1] at 0x400927: main (test1w_.c:15)
==28699== Address: 0x4023004 size: 4state: DIRTY
==28699== Total memory not made persistent: 8
==28699== ERROR SUMMARY: 2 errors
• Pmemcheck
SPDK, PMDK & Vtune™ Summit 25
Non-persistentstores
$ pmeminsp rp -- listing_8-16 listing_8-17
#===============================================================================
# Diagnostic # 1: Missing cache flush
#-------------------
The first memory store
of size 4 at address 0x7F9C68893004 (offset 0x4 in /mnt/pmem/file)
in /data/listing_8-16!main at listing_8-16.c:13 - 0x67D
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534
is not flushed before
the second memory store
of size 4 at address 0x7F9C68893000 (offset 0x0 in /mnt/pmem/file)
in /data/listing_8-16!main at listing_8-16.c:14 - 0x687
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534
while
memory load from the location of the first store
in /data/listing_8-17!main at listing_8-17.c:13 - 0x6C8
depends on
memory load from the location of the second store
in /data/listing_8-17!main at listing_8-17.c:12 - 0x6BD
• Persistent Inspector
#===============================================================================
# Diagnostic # 2: Missing cache flush
#-------------------
Memory store
of size 4 at address 0x7F9C68893000 (offset 0x0 in /mnt/pmem/file)
in /data/listing_8-16!main at listing_8-16.c:14 - 0x687
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534
is not flushed before
memory is unmapped
in /data/listing_8-16!main at listing_8-16.c:15 - 0x699
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534
Analysis complete. 2 diagnostic(s) reported.
SPDK, PMDK & Vtune™ Summit 26
Non-persistentstores
$ pmeminsp rp -- listing_8-16 listing_8-17
#===============================================================================
# Diagnostic # 1: Missing cache flush
#-------------------
The first memory store
of size 4 at address 0x7F9C68893004 (offset 0x4 in /mnt/pmem/file)
in /data/listing_8-16!main at listing_8-16.c:13 - 0x67D
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534
is not flushed before
the second memory store
of size 4 at address 0x7F9C68893000 (offset 0x0 in /mnt/pmem/file)
in /data/listing_8-16!main at listing_8-16.c:14 - 0x687
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534
while
memory load from the location of the first store
in /data/listing_8-17!main at listing_8-17.c:13 - 0x6C8
depends on
memory load from the location of the second store
in /data/listing_8-17!main at listing_8-17.c:12 - 0x6BD
• Persistent Inspector
#===============================================================================
# Diagnostic # 2: Missing cache flush
#-------------------
Memory store
of size 4 at address 0x7F9C68893000 (offset 0x0 in /mnt/pmem/file)
in /data/listing_8-16!main at listing_8-16.c:14 - 0x687
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534
is not flushed before
memory is unmapped
in /data/listing_8-16!main at listing_8-16.c:15 - 0x699
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534
Analysis complete. 2 diagnostic(s) reported.
SPDK, PMDK & Vtune™ Summit 27
StoresnotaddedIntoatransaction
TX_BEGIN (pop) {
TOID (struct my_root) root = POBJ_ROOT (pop, struct my_root);
TX_ADD_FIELD (root, value);
D_RW (root)->value = 4;
D_RW (root)->is_odd = D_RO (root)->value % 2;
} TX_END
• It is assumed that all the modified PMEM locations have been added to it at
the beginning
• This allows the transaction to flush these locations at the end or roll back to
the old values in the event of an unexpected failure
SPDK, PMDK & Vtune™ Summit 28
StoresnotaddedIntoatransaction
$ valgrind --tool=pmemcheck ./listing_8-25
==48660== pmemcheck-1.0, a simple persistent store checker
==48660== Copyright (c) 2014-2016, Intel Corporation
==48660== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==48660== Command: ./listing_8-25
==48660==
==48660==
==48660== Number of stores not made persistent: 1
==48660== Stores not made persistent properly:
==48660== [0] at 0x400C2D: main (listing_8-25.c:18)
==48660== Address: 0x7dc0554 size: 4 state: DIRTY
==48660== Total memory not made persistent: 4
==48660==
==48660== Number of stores made without adding to transaction: 1
==48660== Stores made without adding to transactions:
==48660== [0] at 0x400C2D: main (listing_8-25.c:18)
==48660== Address: 0x7dc0554 size: 4
==48660== ERROR SUMMARY: 2 errors
$ pmeminsp cb -pmem-file /mnt/pmem/pool -- ./listing_8-25
++ Analysis starts
++ Analysis completes
++ Data is stored in folder "/data/.pmeminspdata/data/listing_8-25"
$
$ pmeminsp rp -- ./listing_8-25
#===============================================================================
# Diagnostic # 1: Store without undo log
#-------------------
Memory store
of size 4 at address 0x7FAA84DC0554 (offset 0x3C0554 in /mnt/pmem/pool)
in /data/listing_8-25!main at listing_8-25.c:18 - 0xC2D
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-25!_start at <unknown_file>:<unknown_line> - 0x954
is not undo logged in
transaction
in /data/listing_8-25!main at listing_8-25.c:14 - 0xB67
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /data/listing_8-25!_start at <unknown_file>:<unknown_line> - 0x954
Analysis complete. 1 diagnostic(s) reported.
• pmemcheck • Persistent Inspector
SPDK, PMDK & Vtune™ Summit 29
StoresAddedtotwodifferenttransactions
• Adding the same object to multiple
transactions can corrupt data
• In PMDK, the library maintains a
transaction per thread
SPDK, PMDK & Vtune™ Summit 30
Storesaddedtotwodifferenttransactions
$ valgrind --tool=pmemcheck ./test8b
==42444== pmemcheck-1.0, a simple persistent store checker
==42444== Copyright (c) 2014-2016, Intel Corporation
==42444== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==42444== Command: ./test8b
==42444==
==42444==
==42444== Number of stores not made persistent: 0
==42444==
==42444== Number of overlapping regions registered in different transactions: 1
==42444== Overlapping regions:
==42444== [0] at 0x4E6ADCC: pmemobj_tx_add_snapshot (tx.c:1080)
==42444== by 0x4E6B2FC: pmemobj_tx_add_common.constprop.18 (tx.c:1168)
==42444== by 0x4E6C38B: pmemobj_tx_add_range (tx.c:1352)
==42444== by 0x400C48: func (test8b.c:15)
==42444== by 0x4C2DDD4: start_thread (in /usr/lib64/libpthread-2.17.so)
==42444== by 0x517EEAC: clone (in /usr/lib64/libc-2.17.so)
==42444== Address: 0x7dc0550 size: 8 tx_id: 2
==42444== First registered here:
==42444== [0]' at 0x4E6ADCC: pmemobj_tx_add_snapshot (tx.c:1080)
==42444== by 0x4E6B2FC: pmemobj_tx_add_common.constprop.18 (tx.c:1168)
==42444== by 0x4E6C38B: pmemobj_tx_add_range (tx.c:1352)
==42444== by 0x400D81: main (test8b.c:26)
==42444== Address: 0x7dc0550 size: 8 tx_id: 1
==42444== ERROR SUMMARY: 1 errors
• pmemcheck • Persistent Inspector
$ pmeminsp cb -pmem-file /mnt/pmem/file -- ./test8b
...
$ pmeminsp ca -pmem-file /mnt/pmem/file -- ./test8b
...
$ pmeminsp rp -- ./test8b
#===============================================================================
# Diagnostic # 1: Overlapping regions registered in different transactions
#-------------------
transaction
in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!main at test8b.c:24 - 0xD1E
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!_start at
<unknown_file>:<unknown_line> - 0x9F4
protects
memory region
in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!main at test8b.c:26 - 0xD7D
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!_start at
<unknown_file>:<unknown_line> - 0x9F4
overlaps with
memory region
in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!func at test8b.c:15 - 0xC44
in /lib64/libpthread.so.0!start_thread at <unknown_file>:<unknown_line> - 0x7DCD
in /lib64/libc.so.6!__clone at <unknown_file>:<unknown_line> - 0xFDEAB
Analysis complete. 1 diagnostic(s) reported.
SPDK, PMDK & Vtune™ Summit 31
Memoryoverwrites
• This refers to the case where multiple modifications to the same persistent
memory location occur before the location is made persistent
• This issue is mostly related to performance, although it can uncover lack of
flushing too.
• In general, it is always better to use volatile memory for short-lived data
...
persistent_data = 10;
persistent_data *= 2;
flush (&persistent_data);
...
SPDK, PMDK & Vtune™ Summit 32
Memoryoverwrites
$ valgrind --tool=pmemcheck --mult-stores=yes ./test2w_
==121362== pmemcheck-1.0, a simple persistent store checker
==121362== Copyright (c) 2014-2016, Intel Corporation
==121362== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==121362== Command: ./test2w_
==121362==
==121362==
==121362== Number of stores not made persistent: 0
==121362==
==121362== Number of overwritten stores: 1
==121362== Overwritten stores before they were made persistent:
==121362== [0] at 0x40097C: main (test2w_.c:23)
==121362== Address: 0x4023004 size: 4 state: DIRTY
==121362== ERROR SUMMARY: 1 errors
• pmemcheck • Persistent Inspector
SPDK, PMDK & Vtune™ Summit 33
Unnecessaryflushes
• Flushing should be done carefully
• Detecting unnecessary flushes (such as redundant ones) can help in
improving code performance
...
persistent_data = computation ();
flush (&persistent_data);
flush (&persistent_data);
...
SPDK, PMDK & Vtune™ Summit 34
Unnecessaryflushes
$ valgrind --tool=pmemcheck --flush-check=yes ./test3b
==54720== pmemcheck-1.0, a simple persistent store checker
==54720== Copyright (c) 2014-2016, Intel Corporation
==54720== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==54720== Command: ./test3b
==54720==
==54720==
==54720== Number of stores not made persistent: 0
==54720==
==54720== Number of unnecessary flushes: 1
==54720== [0] at 0x400868: flush (emmintrin.h:1459)
==54720== by 0x400989: main (test3b.c:22)
==54720== Address: 0x4023000 size: 64
==54720== ERROR SUMMARY: 1 errors
$ pmeminsp rp -- ./test3w_ ./test3r_
#===============================================================================
# Diagnostic # 1: Redundant cache flush
#-------------------
Cache flush
of size 64 at address 0x7F10DD6D6000 (offset 0x0 in /mnt/pmem/file)
in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!flush at test3w_.c:11 - 0x674
in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!main at test3w_.c:24 - 0x73F
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!_start at
<unknown_file>:<unknown_line> - 0x574
is redundant with regard to
cache flush
of size 64 at address 0x7F10DD6D6000 (offset 0x0 in /mnt/pmem/file)
in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!flush at test3w_.c:11 - 0x674
in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!main at test3w_.c:25 - 0x750
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!_start at
<unknown_file>:<unknown_line> - 0x574
of
memory store
of size 4 at address 0x7F10DD6D6000 (offset 0x0 in /mnt/pmem/file)
in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!main at test3w_.c:23 - 0x72D
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!_start at
<unknown_file>:<unknown_line> - 0x574
• pmemcheck • Persistent Inspector
SPDK, PMDK & Vtune™ Summit 35
• Data written to persistent memory
but not flushed explicitly can still be
flushed out by the CPU
• Bugs can arise when data is not
written to persistent media in the
order expected
Out-of-orderanalysis writer () {
pcounter = 0;
for (i=0; i<max; i++) {
pcounter++;
if (rand() % 2 == 0) {
pcells[i].data = data();
flush (pcells[i].data);
pcells[i].valid = True;
} else {
pcells[i].valid = False;
}
flush (pcells[i].valid);
}
flush (pcounter);
}
reader () {
for (i=0; i<pcounter; i++) {
if (pcells[i].valid == True) {
print (pcells[i].data);
}
}
}
SPDK, PMDK & Vtune™ Summit 36
Out-of-orderanalysis
$ pmeminsp rp -check-out-of-order-store -- ./test9w_ ./test9r_
#===============================================================================
# Diagnostic # 1: Out-of-order stores
#-------------------
Memory store
of size 4 at address 0x7F6979541000 (offset 0x0 in /mnt/pmem/file)
in /mnt/hgfs/workbench/pmemcheck-test/test9/test9w_!main at test9w_.c:30 - 0x72C
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /mnt/hgfs/workbench/pmemcheck-test/test9/test9w_!_start at
<unknown_file>:<unknown_line> - 0x5C4
is out of order with respect to
memory store
of size 1 at address 0x7F697954107F (offset 0x7F in /mnt/pmem/file)
in /mnt/hgfs/workbench/pmemcheck-test/test9/test9w_!main at test9w_.c:36 - 0x7AE
in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3
in /mnt/hgfs/workbench/pmemcheck-test/test9/test9w_!_start at
<unknown_file>:<unknown_line> - 0x5C4
• Persistent Inspector
SPDK, PMDK & Vtune™ Summit 37
Out-of-orderanalysis
$ valgrind --tool=pmemcheck -q --log-stores=yes --log-stores-stacktraces=yes --log-stores-stacktraces-depth=2 --print-summary=yes
--log-file=store_log.log ./program
$
$
$ pmreorder -l store_log.log -o output_file.log -x pmem_memset_persist=NoReorderNoCheck -r ReorderFull -c prog -p ./program_checker
$
$ cat output_file.log
WARNING:pmreorder:File /mnt/pmem/file inconsistent
WARNING:pmreorder:Call trace:
Store [0]:
by 0x401D0C: main (test9bw_.cpp:55)
• pmemcheck + pmreorder
You need a checker returning 0 if data
is consistent, or 1 otherwise
Assign an engine type to specific marker
(set by macros)
Engines: NoReorderNoCheck, NoReorderDoCheck, ReorderFull,
ReorderPartial, ReorderAccumulative, ReorderReverseAccumulative
SPDK, PMDK & Vtune™ Summit 39
Backup
Debugging Tools & Techniques for Persistent Memory Programming

More Related Content

What's hot

Ceph: Open Source Storage Software Optimizations on Intel® Architecture for C...
Ceph: Open Source Storage Software Optimizations on Intel® Architecture for C...Ceph: Open Source Storage Software Optimizations on Intel® Architecture for C...
Ceph: Open Source Storage Software Optimizations on Intel® Architecture for C...
Odinot Stanislas
 
Journey to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Journey to Stability: Petabyte Ceph Cluster in OpenStack CloudJourney to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Journey to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Patrick McGarry
 
Ceph Day Beijing - Our journey to high performance large scale Ceph cluster a...
Ceph Day Beijing - Our journey to high performance large scale Ceph cluster a...Ceph Day Beijing - Our journey to high performance large scale Ceph cluster a...
Ceph Day Beijing - Our journey to high performance large scale Ceph cluster a...
Danielle Womboldt
 
Ceph on Intel: Intel Storage Components, Benchmarks, and Contributions
Ceph on Intel: Intel Storage Components, Benchmarks, and ContributionsCeph on Intel: Intel Storage Components, Benchmarks, and Contributions
Ceph on Intel: Intel Storage Components, Benchmarks, and Contributions
Colleen Corrice
 
Out of the box replication in postgres 9.4
Out of the box replication in postgres 9.4Out of the box replication in postgres 9.4
Out of the box replication in postgres 9.4
Denish Patel
 
High Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando PatroniHigh Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando Patroni
Zalando Technology
 
Using Recently Published Ceph Reference Architectures to Select Your Ceph Con...
Using Recently Published Ceph Reference Architectures to Select Your Ceph Con...Using Recently Published Ceph Reference Architectures to Select Your Ceph Con...
Using Recently Published Ceph Reference Architectures to Select Your Ceph Con...
Patrick McGarry
 
Revisiting CephFS MDS and mClock QoS Scheduler
Revisiting CephFS MDS and mClock QoS SchedulerRevisiting CephFS MDS and mClock QoS Scheduler
Revisiting CephFS MDS and mClock QoS Scheduler
Yongseok Oh
 
Build an High-Performance and High-Durable Block Storage Service Based on Ceph
Build an High-Performance and High-Durable Block Storage Service Based on CephBuild an High-Performance and High-Durable Block Storage Service Based on Ceph
Build an High-Performance and High-Durable Block Storage Service Based on Ceph
Rongze Zhu
 
PostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized WorldPostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized World
Jignesh Shah
 
Cephfs jewel mds performance benchmark
Cephfs jewel mds performance benchmarkCephfs jewel mds performance benchmark
Cephfs jewel mds performance benchmark
Xiaoxi Chen
 
Ceph at Work in Bloomberg: Object Store, RBD and OpenStack
Ceph at Work in Bloomberg: Object Store, RBD and OpenStackCeph at Work in Bloomberg: Object Store, RBD and OpenStack
Ceph at Work in Bloomberg: Object Store, RBD and OpenStack
Red_Hat_Storage
 
PostgreSQL Extensions: A deeper look
PostgreSQL Extensions:  A deeper lookPostgreSQL Extensions:  A deeper look
PostgreSQL Extensions: A deeper look
Jignesh Shah
 
Impact of Intel Optane Technology on HPC
Impact of Intel Optane Technology on HPCImpact of Intel Optane Technology on HPC
Impact of Intel Optane Technology on HPC
MemVerge
 
[若渴計畫] Challenges and Solutions of Window Remote Shellcode
[若渴計畫] Challenges and Solutions of Window Remote Shellcode[若渴計畫] Challenges and Solutions of Window Remote Shellcode
[若渴計畫] Challenges and Solutions of Window Remote Shellcode
Aj MaChInE
 
Bluestore
BluestoreBluestore
Bluestore
Patrick McGarry
 
BlueStore: a new, faster storage backend for Ceph
BlueStore: a new, faster storage backend for CephBlueStore: a new, faster storage backend for Ceph
BlueStore: a new, faster storage backend for Ceph
Sage Weil
 

What's hot (18)

Ceph: Open Source Storage Software Optimizations on Intel® Architecture for C...
Ceph: Open Source Storage Software Optimizations on Intel® Architecture for C...Ceph: Open Source Storage Software Optimizations on Intel® Architecture for C...
Ceph: Open Source Storage Software Optimizations on Intel® Architecture for C...
 
Journey to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Journey to Stability: Petabyte Ceph Cluster in OpenStack CloudJourney to Stability: Petabyte Ceph Cluster in OpenStack Cloud
Journey to Stability: Petabyte Ceph Cluster in OpenStack Cloud
 
Ceph Day Beijing - Our journey to high performance large scale Ceph cluster a...
Ceph Day Beijing - Our journey to high performance large scale Ceph cluster a...Ceph Day Beijing - Our journey to high performance large scale Ceph cluster a...
Ceph Day Beijing - Our journey to high performance large scale Ceph cluster a...
 
Ceph on Intel: Intel Storage Components, Benchmarks, and Contributions
Ceph on Intel: Intel Storage Components, Benchmarks, and ContributionsCeph on Intel: Intel Storage Components, Benchmarks, and Contributions
Ceph on Intel: Intel Storage Components, Benchmarks, and Contributions
 
Out of the box replication in postgres 9.4
Out of the box replication in postgres 9.4Out of the box replication in postgres 9.4
Out of the box replication in postgres 9.4
 
High Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando PatroniHigh Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando Patroni
 
Using Recently Published Ceph Reference Architectures to Select Your Ceph Con...
Using Recently Published Ceph Reference Architectures to Select Your Ceph Con...Using Recently Published Ceph Reference Architectures to Select Your Ceph Con...
Using Recently Published Ceph Reference Architectures to Select Your Ceph Con...
 
Revisiting CephFS MDS and mClock QoS Scheduler
Revisiting CephFS MDS and mClock QoS SchedulerRevisiting CephFS MDS and mClock QoS Scheduler
Revisiting CephFS MDS and mClock QoS Scheduler
 
Build an High-Performance and High-Durable Block Storage Service Based on Ceph
Build an High-Performance and High-Durable Block Storage Service Based on CephBuild an High-Performance and High-Durable Block Storage Service Based on Ceph
Build an High-Performance and High-Durable Block Storage Service Based on Ceph
 
optimizing_ceph_flash
optimizing_ceph_flashoptimizing_ceph_flash
optimizing_ceph_flash
 
PostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized WorldPostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized World
 
Cephfs jewel mds performance benchmark
Cephfs jewel mds performance benchmarkCephfs jewel mds performance benchmark
Cephfs jewel mds performance benchmark
 
Ceph at Work in Bloomberg: Object Store, RBD and OpenStack
Ceph at Work in Bloomberg: Object Store, RBD and OpenStackCeph at Work in Bloomberg: Object Store, RBD and OpenStack
Ceph at Work in Bloomberg: Object Store, RBD and OpenStack
 
PostgreSQL Extensions: A deeper look
PostgreSQL Extensions:  A deeper lookPostgreSQL Extensions:  A deeper look
PostgreSQL Extensions: A deeper look
 
Impact of Intel Optane Technology on HPC
Impact of Intel Optane Technology on HPCImpact of Intel Optane Technology on HPC
Impact of Intel Optane Technology on HPC
 
[若渴計畫] Challenges and Solutions of Window Remote Shellcode
[若渴計畫] Challenges and Solutions of Window Remote Shellcode[若渴計畫] Challenges and Solutions of Window Remote Shellcode
[若渴計畫] Challenges and Solutions of Window Remote Shellcode
 
Bluestore
BluestoreBluestore
Bluestore
 
BlueStore: a new, faster storage backend for Ceph
BlueStore: a new, faster storage backend for CephBlueStore: a new, faster storage backend for Ceph
BlueStore: a new, faster storage backend for Ceph
 

Similar to Debugging Tools & Techniques for Persistent Memory Programming

Driver Debugging Basics
Driver Debugging BasicsDriver Debugging Basics
Driver Debugging Basics
Bala Subra
 
php & performance
 php & performance php & performance
php & performance
simon8410
 
Multi Source Replication With MySQL 5.7 @ Verisure
Multi Source Replication With MySQL 5.7 @ VerisureMulti Source Replication With MySQL 5.7 @ Verisure
Multi Source Replication With MySQL 5.7 @ Verisure
Kenny Gryp
 
Make Your Life Easier With Maatkit
Make Your Life Easier With MaatkitMake Your Life Easier With Maatkit
Make Your Life Easier With MaatkitMySQLConference
 
PHP & Performance
PHP & PerformancePHP & Performance
PHP & Performance
毅 吕
 
10 things i wish i'd known before using spark in production
10 things i wish i'd known before using spark in production10 things i wish i'd known before using spark in production
10 things i wish i'd known before using spark in production
Paris Data Engineers !
 
Speed up R with parallel programming in the Cloud
Speed up R with parallel programming in the CloudSpeed up R with parallel programming in the Cloud
Speed up R with parallel programming in the Cloud
Revolution Analytics
 
Mongo db v3_deep_dive
Mongo db v3_deep_diveMongo db v3_deep_dive
Mongo db v3_deep_dive
Bryan Reinero
 
Testing Persistent Storage Performance in Kubernetes with Sherlock
Testing Persistent Storage Performance in Kubernetes with SherlockTesting Persistent Storage Performance in Kubernetes with Sherlock
Testing Persistent Storage Performance in Kubernetes with Sherlock
ScyllaDB
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life better
ZendCon
 
All The Little Pieces
All The Little PiecesAll The Little Pieces
All The Little Pieces
Andrei Zmievski
 
KSCOPE 2013: Exadata Consolidation Success Story
KSCOPE 2013: Exadata Consolidation Success StoryKSCOPE 2013: Exadata Consolidation Success Story
KSCOPE 2013: Exadata Consolidation Success StoryKristofferson A
 
Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012
Wim Godden
 
AHMED JASSAT SOUTH ARICAN ORACLE USER GROUP PRESENTATION
AHMED JASSAT SOUTH ARICAN ORACLE USER GROUP PRESENTATIONAHMED JASSAT SOUTH ARICAN ORACLE USER GROUP PRESENTATION
AHMED JASSAT SOUTH ARICAN ORACLE USER GROUP PRESENTATION
Zahid02
 
Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011
Wim Godden
 
phptek13 - Caching and tuning fun tutorial
phptek13 - Caching and tuning fun tutorialphptek13 - Caching and tuning fun tutorial
phptek13 - Caching and tuning fun tutorial
Wim Godden
 
Oracle Basics and Architecture
Oracle Basics and ArchitectureOracle Basics and Architecture
Oracle Basics and ArchitectureSidney Chen
 
Membrane protein-ligand tutorial with GROMACS.pdf
Membrane protein-ligand tutorial with GROMACS.pdfMembrane protein-ligand tutorial with GROMACS.pdf
Membrane protein-ligand tutorial with GROMACS.pdf
Rubem Francisco Silva Bezerra
 
Pecl Picks
Pecl PicksPecl Picks
Pecl Picks
Elizabeth Smith
 
Creating a Benchmarking Infrastructure That Just Works
Creating a Benchmarking Infrastructure That Just WorksCreating a Benchmarking Infrastructure That Just Works
Creating a Benchmarking Infrastructure That Just Works
Tim Callaghan
 

Similar to Debugging Tools & Techniques for Persistent Memory Programming (20)

Driver Debugging Basics
Driver Debugging BasicsDriver Debugging Basics
Driver Debugging Basics
 
php & performance
 php & performance php & performance
php & performance
 
Multi Source Replication With MySQL 5.7 @ Verisure
Multi Source Replication With MySQL 5.7 @ VerisureMulti Source Replication With MySQL 5.7 @ Verisure
Multi Source Replication With MySQL 5.7 @ Verisure
 
Make Your Life Easier With Maatkit
Make Your Life Easier With MaatkitMake Your Life Easier With Maatkit
Make Your Life Easier With Maatkit
 
PHP & Performance
PHP & PerformancePHP & Performance
PHP & Performance
 
10 things i wish i'd known before using spark in production
10 things i wish i'd known before using spark in production10 things i wish i'd known before using spark in production
10 things i wish i'd known before using spark in production
 
Speed up R with parallel programming in the Cloud
Speed up R with parallel programming in the CloudSpeed up R with parallel programming in the Cloud
Speed up R with parallel programming in the Cloud
 
Mongo db v3_deep_dive
Mongo db v3_deep_diveMongo db v3_deep_dive
Mongo db v3_deep_dive
 
Testing Persistent Storage Performance in Kubernetes with Sherlock
Testing Persistent Storage Performance in Kubernetes with SherlockTesting Persistent Storage Performance in Kubernetes with Sherlock
Testing Persistent Storage Performance in Kubernetes with Sherlock
 
PECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life betterPECL Picks - Extensions to make your life better
PECL Picks - Extensions to make your life better
 
All The Little Pieces
All The Little PiecesAll The Little Pieces
All The Little Pieces
 
KSCOPE 2013: Exadata Consolidation Success Story
KSCOPE 2013: Exadata Consolidation Success StoryKSCOPE 2013: Exadata Consolidation Success Story
KSCOPE 2013: Exadata Consolidation Success Story
 
Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012
 
AHMED JASSAT SOUTH ARICAN ORACLE USER GROUP PRESENTATION
AHMED JASSAT SOUTH ARICAN ORACLE USER GROUP PRESENTATIONAHMED JASSAT SOUTH ARICAN ORACLE USER GROUP PRESENTATION
AHMED JASSAT SOUTH ARICAN ORACLE USER GROUP PRESENTATION
 
Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011
 
phptek13 - Caching and tuning fun tutorial
phptek13 - Caching and tuning fun tutorialphptek13 - Caching and tuning fun tutorial
phptek13 - Caching and tuning fun tutorial
 
Oracle Basics and Architecture
Oracle Basics and ArchitectureOracle Basics and Architecture
Oracle Basics and Architecture
 
Membrane protein-ligand tutorial with GROMACS.pdf
Membrane protein-ligand tutorial with GROMACS.pdfMembrane protein-ligand tutorial with GROMACS.pdf
Membrane protein-ligand tutorial with GROMACS.pdf
 
Pecl Picks
Pecl PicksPecl Picks
Pecl Picks
 
Creating a Benchmarking Infrastructure That Just Works
Creating a Benchmarking Infrastructure That Just WorksCreating a Benchmarking Infrastructure That Just Works
Creating a Benchmarking Infrastructure That Just Works
 

More from Intel® Software

AI for All: Biology is eating the world & AI is eating Biology
AI for All: Biology is eating the world & AI is eating Biology AI for All: Biology is eating the world & AI is eating Biology
AI for All: Biology is eating the world & AI is eating Biology
Intel® Software
 
Python Data Science and Machine Learning at Scale with Intel and Anaconda
Python Data Science and Machine Learning at Scale with Intel and AnacondaPython Data Science and Machine Learning at Scale with Intel and Anaconda
Python Data Science and Machine Learning at Scale with Intel and Anaconda
Intel® Software
 
Streamline End-to-End AI Pipelines with Intel, Databricks, and OmniSci
Streamline End-to-End AI Pipelines with Intel, Databricks, and OmniSciStreamline End-to-End AI Pipelines with Intel, Databricks, and OmniSci
Streamline End-to-End AI Pipelines with Intel, Databricks, and OmniSci
Intel® Software
 
AI for good: Scaling AI in science, healthcare, and more.
AI for good: Scaling AI in science, healthcare, and more.AI for good: Scaling AI in science, healthcare, and more.
AI for good: Scaling AI in science, healthcare, and more.
Intel® Software
 
Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...
Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...
Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...
Intel® Software
 
Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...
Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...
Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...
Intel® Software
 
Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...
Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...
Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...
Intel® Software
 
AWS & Intel Webinar Series - Accelerating AI Research
AWS & Intel Webinar Series - Accelerating AI ResearchAWS & Intel Webinar Series - Accelerating AI Research
AWS & Intel Webinar Series - Accelerating AI Research
Intel® Software
 
Intel Developer Program
Intel Developer ProgramIntel Developer Program
Intel Developer Program
Intel® Software
 
Intel AIDC Houston Summit - Overview Slides
Intel AIDC Houston Summit - Overview SlidesIntel AIDC Houston Summit - Overview Slides
Intel AIDC Houston Summit - Overview Slides
Intel® Software
 
AIDC NY: BODO AI Presentation - 09.19.2019
AIDC NY: BODO AI Presentation - 09.19.2019AIDC NY: BODO AI Presentation - 09.19.2019
AIDC NY: BODO AI Presentation - 09.19.2019
Intel® Software
 
AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019
AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019
AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019
Intel® Software
 
Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...
Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...
Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...
Intel® Software
 
Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...
Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...
Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...
Intel® Software
 
Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...
Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...
Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...
Intel® Software
 
RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...
RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...
RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...
Intel® Software
 
AIDC India - AI on IA
AIDC India  - AI on IAAIDC India  - AI on IA
AIDC India - AI on IA
Intel® Software
 
AIDC India - Intel Movidius / Open Vino Slides
AIDC India - Intel Movidius / Open Vino SlidesAIDC India - Intel Movidius / Open Vino Slides
AIDC India - Intel Movidius / Open Vino Slides
Intel® Software
 
AIDC India - AI Vision Slides
AIDC India - AI Vision SlidesAIDC India - AI Vision Slides
AIDC India - AI Vision Slides
Intel® Software
 
Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...
Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...
Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...
Intel® Software
 

More from Intel® Software (20)

AI for All: Biology is eating the world & AI is eating Biology
AI for All: Biology is eating the world & AI is eating Biology AI for All: Biology is eating the world & AI is eating Biology
AI for All: Biology is eating the world & AI is eating Biology
 
Python Data Science and Machine Learning at Scale with Intel and Anaconda
Python Data Science and Machine Learning at Scale with Intel and AnacondaPython Data Science and Machine Learning at Scale with Intel and Anaconda
Python Data Science and Machine Learning at Scale with Intel and Anaconda
 
Streamline End-to-End AI Pipelines with Intel, Databricks, and OmniSci
Streamline End-to-End AI Pipelines with Intel, Databricks, and OmniSciStreamline End-to-End AI Pipelines with Intel, Databricks, and OmniSci
Streamline End-to-End AI Pipelines with Intel, Databricks, and OmniSci
 
AI for good: Scaling AI in science, healthcare, and more.
AI for good: Scaling AI in science, healthcare, and more.AI for good: Scaling AI in science, healthcare, and more.
AI for good: Scaling AI in science, healthcare, and more.
 
Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...
Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...
Software AI Accelerators: The Next Frontier | Software for AI Optimization Su...
 
Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...
Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...
Advanced Techniques to Accelerate Model Tuning | Software for AI Optimization...
 
Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...
Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...
Reducing Deep Learning Integration Costs and Maximizing Compute Efficiency| S...
 
AWS & Intel Webinar Series - Accelerating AI Research
AWS & Intel Webinar Series - Accelerating AI ResearchAWS & Intel Webinar Series - Accelerating AI Research
AWS & Intel Webinar Series - Accelerating AI Research
 
Intel Developer Program
Intel Developer ProgramIntel Developer Program
Intel Developer Program
 
Intel AIDC Houston Summit - Overview Slides
Intel AIDC Houston Summit - Overview SlidesIntel AIDC Houston Summit - Overview Slides
Intel AIDC Houston Summit - Overview Slides
 
AIDC NY: BODO AI Presentation - 09.19.2019
AIDC NY: BODO AI Presentation - 09.19.2019AIDC NY: BODO AI Presentation - 09.19.2019
AIDC NY: BODO AI Presentation - 09.19.2019
 
AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019
AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019
AIDC NY: Applications of Intel AI by QuEST Global - 09.19.2019
 
Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...
Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...
Advanced Single Instruction Multiple Data (SIMD) Programming with Intel® Impl...
 
Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...
Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...
Build a Deep Learning Video Analytics Framework | SIGGRAPH 2019 Technical Ses...
 
Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...
Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...
Bring Intelligent Motion Using Reinforcement Learning Engines | SIGGRAPH 2019...
 
RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...
RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...
RenderMan*: The Role of Open Shading Language (OSL) with Intel® Advanced Vect...
 
AIDC India - AI on IA
AIDC India  - AI on IAAIDC India  - AI on IA
AIDC India - AI on IA
 
AIDC India - Intel Movidius / Open Vino Slides
AIDC India - Intel Movidius / Open Vino SlidesAIDC India - Intel Movidius / Open Vino Slides
AIDC India - Intel Movidius / Open Vino Slides
 
AIDC India - AI Vision Slides
AIDC India - AI Vision SlidesAIDC India - AI Vision Slides
AIDC India - AI Vision Slides
 
Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...
Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...
Enhance and Accelerate Your AI and Machine Learning Solution | SIGGRAPH 2019 ...
 

Recently uploaded

LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
Product School
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
CatarinaPereira64715
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
Bhaskar Mitra
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 

Recently uploaded (20)

LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 

Debugging Tools & Techniques for Persistent Memory Programming

  • 1. Eduardo Berrocal García de Carellán eduardo.berrocal@Intel.com 04/17/2019
  • 2. SPDK, PMDK & Vtune™ Summit Agenda • Introduction • Hardware Issues • Error Injection • Software Bugs • Conclusions and Q&A 2
  • 3. SPDK, PMDK & Vtune™ Summit 3 Persistent memory programming introduces new opportunities… • Byte addressable • Cache coherent • Load/Store access • no page caching • Memory-like performance introduction DRAM NVDIMM Intel®Optane™ssd Pciessd Pciessd SATASSD SATASSD HDD HDD tape
  • 4. SPDK, PMDK & Vtune™ Summit 4 …but also new challenges • Programming difficulty • New classes of bugs • New vectors to consider for performance Introduction(CONT’D) DRAM NVDIMM Intel®Optane™ssd Pciessd Pciessd SATASSD SATASSD HDD HDD tape
  • 5. SPDK, PMDK & Vtune™ Summit 5 • Module failure • HDDs and SSDs use RAID • Memory controllers do not implement RAID • Data integrity • Block corruption (i.e., bad blocks) HARDWAREISSUES IMC Cascade Lake IMC
  • 6. SPDK, PMDK & Vtune™ Summit 6 Dataintegrity • What if we discover that our pool is corrupted due to bad blocks? • Opening a corrupted pool • Pool gets corrupted while program is running $ ./myProgram /mnt/pmem/poolfile /mnt/pmem/poolfile: Input/output error Bus error (core dumped)
  • 7. SPDK, PMDK & Vtune™ Summit 7 Dataintegrity • What if we discover that our pool is corrupted due to bad blocks? • Pmempool check will also fail $ cp /mnt/pmem/poolfile ./ cp: error reading '/mnt/pmem/poolfile': Input/output error # dd if=/dev/pmem0 of=/dev/null dd: error reading /dev/pmem0: Input/output error 20480+0 records in 20480+0 records out 10485760 bytes (10 MB) copied, 0.0912348 s, 115 MB/s $ pmempool check –v /mnt/pmem/poolfile Bus error (core dumped)
  • 8. SPDK, PMDK & Vtune™ Summit 8 Dataintegrity • Cleaning the poison by writing to the affected blocks # cat /sys/block/pmem0/badblocks 20480 1 # dd conv=notrunc if=/dev/zero of=/dev/pmem0 oflag=direct bs=512 seek=20480 count=1 1+0 records in 1+0 records out 512 bytes (512 B) copied, 0.000114311 s, 9.0 MB/s # cat /sys/block/pmem0/badblocks #
  • 9. SPDK, PMDK & Vtune™ Summit 9 Tool-Pmempool • Standalone utility for management and off-line analysis of persistent memory pools • It works for both the single-file pools and for pool set files. • Commands: create, info, dump, check, rm, convert, sync and transform • usage: pmempool [--version] [--help] <command> [<args>]
  • 10. SPDK, PMDK & Vtune™ Summit 10 Pmempool(check) data header data header Applications are responsible for correcting these errors We can use pmempool to check (and sometimes correct) corruptions in the headers $ pmempool check -v /mnt/pmem/poolfile checking pool header incorrect pool header /mnt/mem/poolfile: not consistent
  • 11. SPDK, PMDK & Vtune™ Summit 11 Pmempool(check) $ pmempool check –v –r –N –a /mnt/pmem/poolfile checking pool header incorrect pool header pool_hdr.signature is not valid. Do you want to set it to PMEMBLK? [Y/n] Y pool_hdr.major is not valid. Do you want to set it to default value 0x1? [Y/n] Y setting pool_hdr.signature to PMEMBLK setting pool_hdr.major to 0x1 invalid pool_hdr.poolset_uuid. Do you want to set it to 2a3b402a-2be0-46f0-a86d-7afef54b258a from BTT Info? [Y/n] Y setting pool_hdr.poolset_uuid to 2a3b402a-2be0-46f0-a86d-7afef54b258a invalid pool_hdr.checksum. Do you want to regenerate checksum? [Y/n] Y setting pool_hdr.checksum to 0xb199cec3475bbf3a checking pmemblk header pmemblk header correct checking BTT Info headers arena 0: BTT Info header checksum correct checking BTT Map and Flog arena 0: checking BTT Map and Flog /mnt/pmem/poolfile: repaired • Attempting repairs (-r [-N –a])
  • 12. SPDK, PMDK & Vtune™ Summit • In PMDK (tools and libraries), pool sets are equivalent to regular pools. • Pool extensions • Pool replication • Local • Remote 12 PMDKFEATURE-Poolsets $ cat my_extended_pool.set PMEMPOOLSET 100G /mountpoint0/myfile.part0 200G /mountpoint1/myfile.part1 400G /mountpoint2/myfile.part2 $ cat my_local_replica.set PMEMPOOLSET 100G /mountpoint0/myfile REPLICA 100G /mountpoint1/myreplica $ cat my_remote_replica.set PMEMPOOLSET 100G /mountpoint0/myfile REPLICA user@example.com myremotepool.set data0 header data1 header data2 header data header data header + + = data header data header =
  • 13. SPDK, PMDK & Vtune™ Summit 13 Pmempool(sync) $ pmempool check –v mypool.set replica 0 part 0: checking pool header replica 0 part 0: incorrect pool header poolfile.set: not consistent $ pmempool sync -v mypool.set mypool.set: synchronized $ pmempool check –v mypool.set replica 0: checking shutdown state replica 0: shutdown state correct replica 1: checking shutdown state replica 1: shutdown state correct replica 0 part 0: checking pool header replica 0 part 0: pool header correct replica 1 part 0: checking pool header replica 1 part 0: pool header correct mypool.set: consistent • Repairing a corrupted replica
  • 14. SPDK, PMDK & Vtune™ Summit 14 ERRORINJECTION # filefrag -v -b512 /mnt/pmem/poolfile | grep -E "^[ ]+[0-9]+.*" | head -1 | awk '{ print $4 }' | cut -d. -f1 278528 # echo 278528 1 > /sys/block/pmem0/badblocks • Using sysfs • What about ndctl? # ndctl inject-error --block=1 --count=2 namespace0.0
  • 15. SPDK, PMDK & Vtune™ Summit 15 Softwarebugs • Persistent memory leaks • Non-persistent stores • Stores not added into a transaction • Memory added to two different transactions • Memory overwrites • Unnecessary flushes • Out-of-order stores
  • 16. SPDK, PMDK & Vtune™ Summit 16 Persistentmemoryleaks • Volatile programs treat leaks mainly as a performance problem • In persistent programs, we need to also think about data corruption/loss • The good: we can recover leaks • The bad: Garbage collection is not supported natively in PMKD yet • The ugly: We need to use macros to access this API header root obj0 objn-1 objn objk
  • 17. SPDK, PMDK & Vtune™ Summit 17 Persistentmemoryleaks persistent_ptr<my_type> my_data_structure = proot->ds; PMEMoid raw_root = my_data_structure.raw (); PMEMoid raw_obj; POBJ_FOREACH (pop.get_handle (), raw_obj) { if (pmemobj_type_num (raw_obj) == pmemobj_type_num (raw_root)) { if (my_data_structure.is_missing (raw_obj) == true) { my_data_structure.add_missing (raw_obj); } } } • All allocated objects in libpmemobj are always added to an internal list
  • 18. SPDK, PMDK & Vtune™ Summit 18 Persistentmemoryleaks • API (libpmemobj) for this internal list: • POBJ_FIRST (pop, t) • POBJ_NEXT (o) • POBJ_FOREACH (pop, varoid) • POBJ_FOREACH_SAFE (pop, varoid, nvaroid) • POBJ_FOREACH_TYPE (pop, var) • POBJ_FOREACH_SAFE_TYPE (pop, var, nvar)
  • 19. SPDK, PMDK & Vtune™ Summit 19 Tool-Pmemcheck • New Valgrind* tool developed by Intel® • You also need an enhanced version of Valgrind* supporting CLFLUSHOPT and CLWB • Go to https://github.com/pmem/valgrind • usage: valgrind --tool=pmemcheck [<options>] <program> [<args>] • More info: valgrind --tool=pmemcheck --help
  • 20. SPDK, PMDK & Vtune™ Summit 20 Pmemcheck(withoutpmdk) • Pmemcheck does not have a way to know which memory addresses are persistent and which ones are volatile • Pmemcheck does not know where a transaction starts and ends data = (int *)mmap (NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); VALGRIND_PMC_REGISTER_PMEM_MAPPING (data, size); ... munmap (data, size); VALGRIND_PMC_REMOVE_PMEM_MAPPING (data, size); VALGRIND_PMC_START_X; ... VALGRIND_PMC_END_TX;
  • 21. SPDK, PMDK & Vtune™ Summit 21 Tool-Intel®inspector–persistentinspector • Specifically tailored for persistent memory • Included as part of Intel® Inspector 2019 • Intel® Inspector is available with Intel® Parallel Studio XE and Intel® System Studio • Analysis 1. pmeminsp cb –pmem-file <pmem_file_path> -- <writer_program> [<params>] 2. pmeminsp ca –pmem-file <pmem_file_path> -- <reader_program> [<params>] 3. pmeminsp rp -- <writer_program> <reader_program>
  • 22. SPDK, PMDK & Vtune™ Summit 22 • Data written to persistent memory but not flushed correctly • Data not flushed may still sit on the CPU caches and could be lost if process crashes Non-persistentstores writer () { var1 = "Hello world to PMEM!"; flush (var1); var1_valid = True; flush (var1_valid); } reader () { if (var1_valid == True) { print (var1); } }
  • 23. SPDK, PMDK & Vtune™ Summit 23 • Data written to persistent memory but not flushed correctly • Data not flushed may still sit on the CPU caches and could be lost if process crashes Non-persistentstores writer () { var1 = "Hello world to PMEM!"; flush (var1); var1_valid = True; flush (var1_valid); } reader () { if (var1_valid == True) { print (var1); } } var1_valid var1 write dependency
  • 24. SPDK, PMDK & Vtune™ Summit 24 Non-persistentstores $ valgrind --tool=pmemcheck ./test1w_ ==28699== pmemcheck-1.0, a simple persistent store checker ==28699== Copyright (c) 2014-2016, Intel Corporation ==28699== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info ==28699== Command: ./test1w_ ==28699== ==28699== ==28699== Number of stores not made persistent: 2 ==28699== Stores not made persistent properly: ==28699== [0] at 0x400931: main (test1w_.c:16) ==28699== Address: 0x4023000 size: 4state: DIRTY ==28699== [1] at 0x400927: main (test1w_.c:15) ==28699== Address: 0x4023004 size: 4state: DIRTY ==28699== Total memory not made persistent: 8 ==28699== ERROR SUMMARY: 2 errors • Pmemcheck
  • 25. SPDK, PMDK & Vtune™ Summit 25 Non-persistentstores $ pmeminsp rp -- listing_8-16 listing_8-17 #=============================================================================== # Diagnostic # 1: Missing cache flush #------------------- The first memory store of size 4 at address 0x7F9C68893004 (offset 0x4 in /mnt/pmem/file) in /data/listing_8-16!main at listing_8-16.c:13 - 0x67D in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534 is not flushed before the second memory store of size 4 at address 0x7F9C68893000 (offset 0x0 in /mnt/pmem/file) in /data/listing_8-16!main at listing_8-16.c:14 - 0x687 in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534 while memory load from the location of the first store in /data/listing_8-17!main at listing_8-17.c:13 - 0x6C8 depends on memory load from the location of the second store in /data/listing_8-17!main at listing_8-17.c:12 - 0x6BD • Persistent Inspector #=============================================================================== # Diagnostic # 2: Missing cache flush #------------------- Memory store of size 4 at address 0x7F9C68893000 (offset 0x0 in /mnt/pmem/file) in /data/listing_8-16!main at listing_8-16.c:14 - 0x687 in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534 is not flushed before memory is unmapped in /data/listing_8-16!main at listing_8-16.c:15 - 0x699 in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534 Analysis complete. 2 diagnostic(s) reported.
  • 26. SPDK, PMDK & Vtune™ Summit 26 Non-persistentstores $ pmeminsp rp -- listing_8-16 listing_8-17 #=============================================================================== # Diagnostic # 1: Missing cache flush #------------------- The first memory store of size 4 at address 0x7F9C68893004 (offset 0x4 in /mnt/pmem/file) in /data/listing_8-16!main at listing_8-16.c:13 - 0x67D in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534 is not flushed before the second memory store of size 4 at address 0x7F9C68893000 (offset 0x0 in /mnt/pmem/file) in /data/listing_8-16!main at listing_8-16.c:14 - 0x687 in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534 while memory load from the location of the first store in /data/listing_8-17!main at listing_8-17.c:13 - 0x6C8 depends on memory load from the location of the second store in /data/listing_8-17!main at listing_8-17.c:12 - 0x6BD • Persistent Inspector #=============================================================================== # Diagnostic # 2: Missing cache flush #------------------- Memory store of size 4 at address 0x7F9C68893000 (offset 0x0 in /mnt/pmem/file) in /data/listing_8-16!main at listing_8-16.c:14 - 0x687 in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534 is not flushed before memory is unmapped in /data/listing_8-16!main at listing_8-16.c:15 - 0x699 in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-16!_start at <unknown_file>:<unknown_line> - 0x534 Analysis complete. 2 diagnostic(s) reported.
  • 27. SPDK, PMDK & Vtune™ Summit 27 StoresnotaddedIntoatransaction TX_BEGIN (pop) { TOID (struct my_root) root = POBJ_ROOT (pop, struct my_root); TX_ADD_FIELD (root, value); D_RW (root)->value = 4; D_RW (root)->is_odd = D_RO (root)->value % 2; } TX_END • It is assumed that all the modified PMEM locations have been added to it at the beginning • This allows the transaction to flush these locations at the end or roll back to the old values in the event of an unexpected failure
  • 28. SPDK, PMDK & Vtune™ Summit 28 StoresnotaddedIntoatransaction $ valgrind --tool=pmemcheck ./listing_8-25 ==48660== pmemcheck-1.0, a simple persistent store checker ==48660== Copyright (c) 2014-2016, Intel Corporation ==48660== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info ==48660== Command: ./listing_8-25 ==48660== ==48660== ==48660== Number of stores not made persistent: 1 ==48660== Stores not made persistent properly: ==48660== [0] at 0x400C2D: main (listing_8-25.c:18) ==48660== Address: 0x7dc0554 size: 4 state: DIRTY ==48660== Total memory not made persistent: 4 ==48660== ==48660== Number of stores made without adding to transaction: 1 ==48660== Stores made without adding to transactions: ==48660== [0] at 0x400C2D: main (listing_8-25.c:18) ==48660== Address: 0x7dc0554 size: 4 ==48660== ERROR SUMMARY: 2 errors $ pmeminsp cb -pmem-file /mnt/pmem/pool -- ./listing_8-25 ++ Analysis starts ++ Analysis completes ++ Data is stored in folder "/data/.pmeminspdata/data/listing_8-25" $ $ pmeminsp rp -- ./listing_8-25 #=============================================================================== # Diagnostic # 1: Store without undo log #------------------- Memory store of size 4 at address 0x7FAA84DC0554 (offset 0x3C0554 in /mnt/pmem/pool) in /data/listing_8-25!main at listing_8-25.c:18 - 0xC2D in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-25!_start at <unknown_file>:<unknown_line> - 0x954 is not undo logged in transaction in /data/listing_8-25!main at listing_8-25.c:14 - 0xB67 in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /data/listing_8-25!_start at <unknown_file>:<unknown_line> - 0x954 Analysis complete. 1 diagnostic(s) reported. • pmemcheck • Persistent Inspector
  • 29. SPDK, PMDK & Vtune™ Summit 29 StoresAddedtotwodifferenttransactions • Adding the same object to multiple transactions can corrupt data • In PMDK, the library maintains a transaction per thread
  • 30. SPDK, PMDK & Vtune™ Summit 30 Storesaddedtotwodifferenttransactions $ valgrind --tool=pmemcheck ./test8b ==42444== pmemcheck-1.0, a simple persistent store checker ==42444== Copyright (c) 2014-2016, Intel Corporation ==42444== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info ==42444== Command: ./test8b ==42444== ==42444== ==42444== Number of stores not made persistent: 0 ==42444== ==42444== Number of overlapping regions registered in different transactions: 1 ==42444== Overlapping regions: ==42444== [0] at 0x4E6ADCC: pmemobj_tx_add_snapshot (tx.c:1080) ==42444== by 0x4E6B2FC: pmemobj_tx_add_common.constprop.18 (tx.c:1168) ==42444== by 0x4E6C38B: pmemobj_tx_add_range (tx.c:1352) ==42444== by 0x400C48: func (test8b.c:15) ==42444== by 0x4C2DDD4: start_thread (in /usr/lib64/libpthread-2.17.so) ==42444== by 0x517EEAC: clone (in /usr/lib64/libc-2.17.so) ==42444== Address: 0x7dc0550 size: 8 tx_id: 2 ==42444== First registered here: ==42444== [0]' at 0x4E6ADCC: pmemobj_tx_add_snapshot (tx.c:1080) ==42444== by 0x4E6B2FC: pmemobj_tx_add_common.constprop.18 (tx.c:1168) ==42444== by 0x4E6C38B: pmemobj_tx_add_range (tx.c:1352) ==42444== by 0x400D81: main (test8b.c:26) ==42444== Address: 0x7dc0550 size: 8 tx_id: 1 ==42444== ERROR SUMMARY: 1 errors • pmemcheck • Persistent Inspector $ pmeminsp cb -pmem-file /mnt/pmem/file -- ./test8b ... $ pmeminsp ca -pmem-file /mnt/pmem/file -- ./test8b ... $ pmeminsp rp -- ./test8b #=============================================================================== # Diagnostic # 1: Overlapping regions registered in different transactions #------------------- transaction in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!main at test8b.c:24 - 0xD1E in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!_start at <unknown_file>:<unknown_line> - 0x9F4 protects memory region in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!main at test8b.c:26 - 0xD7D in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!_start at <unknown_file>:<unknown_line> - 0x9F4 overlaps with memory region in /mnt/hgfs/workbench/pmemcheck-test/test8/test8b!func at test8b.c:15 - 0xC44 in /lib64/libpthread.so.0!start_thread at <unknown_file>:<unknown_line> - 0x7DCD in /lib64/libc.so.6!__clone at <unknown_file>:<unknown_line> - 0xFDEAB Analysis complete. 1 diagnostic(s) reported.
  • 31. SPDK, PMDK & Vtune™ Summit 31 Memoryoverwrites • This refers to the case where multiple modifications to the same persistent memory location occur before the location is made persistent • This issue is mostly related to performance, although it can uncover lack of flushing too. • In general, it is always better to use volatile memory for short-lived data ... persistent_data = 10; persistent_data *= 2; flush (&persistent_data); ...
  • 32. SPDK, PMDK & Vtune™ Summit 32 Memoryoverwrites $ valgrind --tool=pmemcheck --mult-stores=yes ./test2w_ ==121362== pmemcheck-1.0, a simple persistent store checker ==121362== Copyright (c) 2014-2016, Intel Corporation ==121362== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info ==121362== Command: ./test2w_ ==121362== ==121362== ==121362== Number of stores not made persistent: 0 ==121362== ==121362== Number of overwritten stores: 1 ==121362== Overwritten stores before they were made persistent: ==121362== [0] at 0x40097C: main (test2w_.c:23) ==121362== Address: 0x4023004 size: 4 state: DIRTY ==121362== ERROR SUMMARY: 1 errors • pmemcheck • Persistent Inspector
  • 33. SPDK, PMDK & Vtune™ Summit 33 Unnecessaryflushes • Flushing should be done carefully • Detecting unnecessary flushes (such as redundant ones) can help in improving code performance ... persistent_data = computation (); flush (&persistent_data); flush (&persistent_data); ...
  • 34. SPDK, PMDK & Vtune™ Summit 34 Unnecessaryflushes $ valgrind --tool=pmemcheck --flush-check=yes ./test3b ==54720== pmemcheck-1.0, a simple persistent store checker ==54720== Copyright (c) 2014-2016, Intel Corporation ==54720== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info ==54720== Command: ./test3b ==54720== ==54720== ==54720== Number of stores not made persistent: 0 ==54720== ==54720== Number of unnecessary flushes: 1 ==54720== [0] at 0x400868: flush (emmintrin.h:1459) ==54720== by 0x400989: main (test3b.c:22) ==54720== Address: 0x4023000 size: 64 ==54720== ERROR SUMMARY: 1 errors $ pmeminsp rp -- ./test3w_ ./test3r_ #=============================================================================== # Diagnostic # 1: Redundant cache flush #------------------- Cache flush of size 64 at address 0x7F10DD6D6000 (offset 0x0 in /mnt/pmem/file) in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!flush at test3w_.c:11 - 0x674 in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!main at test3w_.c:24 - 0x73F in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!_start at <unknown_file>:<unknown_line> - 0x574 is redundant with regard to cache flush of size 64 at address 0x7F10DD6D6000 (offset 0x0 in /mnt/pmem/file) in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!flush at test3w_.c:11 - 0x674 in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!main at test3w_.c:25 - 0x750 in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!_start at <unknown_file>:<unknown_line> - 0x574 of memory store of size 4 at address 0x7F10DD6D6000 (offset 0x0 in /mnt/pmem/file) in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!main at test3w_.c:23 - 0x72D in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /mnt/hgfs/workbench/pmemcheck-test/test3/test3w_!_start at <unknown_file>:<unknown_line> - 0x574 • pmemcheck • Persistent Inspector
  • 35. SPDK, PMDK & Vtune™ Summit 35 • Data written to persistent memory but not flushed explicitly can still be flushed out by the CPU • Bugs can arise when data is not written to persistent media in the order expected Out-of-orderanalysis writer () { pcounter = 0; for (i=0; i<max; i++) { pcounter++; if (rand() % 2 == 0) { pcells[i].data = data(); flush (pcells[i].data); pcells[i].valid = True; } else { pcells[i].valid = False; } flush (pcells[i].valid); } flush (pcounter); } reader () { for (i=0; i<pcounter; i++) { if (pcells[i].valid == True) { print (pcells[i].data); } } }
  • 36. SPDK, PMDK & Vtune™ Summit 36 Out-of-orderanalysis $ pmeminsp rp -check-out-of-order-store -- ./test9w_ ./test9r_ #=============================================================================== # Diagnostic # 1: Out-of-order stores #------------------- Memory store of size 4 at address 0x7F6979541000 (offset 0x0 in /mnt/pmem/file) in /mnt/hgfs/workbench/pmemcheck-test/test9/test9w_!main at test9w_.c:30 - 0x72C in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /mnt/hgfs/workbench/pmemcheck-test/test9/test9w_!_start at <unknown_file>:<unknown_line> - 0x5C4 is out of order with respect to memory store of size 1 at address 0x7F697954107F (offset 0x7F in /mnt/pmem/file) in /mnt/hgfs/workbench/pmemcheck-test/test9/test9w_!main at test9w_.c:36 - 0x7AE in /lib64/libc.so.6!__libc_start_main at <unknown_file>:<unknown_line> - 0x223D3 in /mnt/hgfs/workbench/pmemcheck-test/test9/test9w_!_start at <unknown_file>:<unknown_line> - 0x5C4 • Persistent Inspector
  • 37. SPDK, PMDK & Vtune™ Summit 37 Out-of-orderanalysis $ valgrind --tool=pmemcheck -q --log-stores=yes --log-stores-stacktraces=yes --log-stores-stacktraces-depth=2 --print-summary=yes --log-file=store_log.log ./program $ $ $ pmreorder -l store_log.log -o output_file.log -x pmem_memset_persist=NoReorderNoCheck -r ReorderFull -c prog -p ./program_checker $ $ cat output_file.log WARNING:pmreorder:File /mnt/pmem/file inconsistent WARNING:pmreorder:Call trace: Store [0]: by 0x401D0C: main (test9bw_.cpp:55) • pmemcheck + pmreorder You need a checker returning 0 if data is consistent, or 1 otherwise Assign an engine type to specific marker (set by macros) Engines: NoReorderNoCheck, NoReorderDoCheck, ReorderFull, ReorderPartial, ReorderAccumulative, ReorderReverseAccumulative
  • 38.
  • 39. SPDK, PMDK & Vtune™ Summit 39 Backup