qcon london - persistent memory · 2016-04-05 · space user space libc (or other) vmem_malloc vmem...

Post on 08-Jul-2020

10 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Maciej Maciejewski

HARDWARE

2

Persistent memory

3

How does it differ from DRAM

4

How fast is it?

5

OPERATING SYSTEM

6

ACPI NFIT

7

E820

8

What can we do with it?

9

10

PersistentMemory

UserSpace

KernelSpace

Application

Load/Store

MMUMappings

NVDIMM Driver

temporary file

StandardFile API

PM-awareFile System

NVML

http://pmem.io

https://github.com/pmem/nvml/

NVML

11

Memory

12

Memory - libvmmalloc

13

libvmem

jemalloc

Application

PM

KernelSpace

UserSpace

malloc

vmmalloc

mmap

DRAM

vmem_pool_mallocvmem_pool_create

constructor

temporary file

Memory - libvmem

14

libvmem

jemalloc (3.6.0)

Application

Persistent Memory

KernelSpace

UserSpace

libc(or other)

vmem_malloc

vmem

fallocate/mmap

malloc

DRAM

mmap/sbrk

vmem_create

vmem_pool_mallocmalloc

vmem_pool_create

Memory - memkind

15

Block storage

16

17

Byte persistency

18

Why persistency is an issue?

19

CPU

L1

L2

L3

iMC

NVDIMM

CPU

L1

L2

iMC

NVDIMM

CLFLUSHCLFLUSHOPTCLWB

SFENCE

PCOMMIT

SFENCE

20

Flushing to Persistence

open(…);

mmap(…);

strcpy(pmem, „Hello");

msync(pmem, 6, MS_SYNC);

pmem_persist(pmem, 6);

strcpy(pmem, „Hello, World!");

pmem_persist(pmem, 14);

Crossing the 8-Byte Store

Result?

1. „\0\0\0\0\0\0\0\0\0\0...”

2. „Hello, W\0\0\0\0\0\0...”

3. „\0\0\0\0\0\0\0\0orld!\0”

4. „Hello, \0\0\0\0\0\0\0\0”

5. „Hello, World!\0”crash

nvml Persistent Libraries

libpmem – Basic persistency handling

libpmemblk – Block access to pmem

libpmemlog - Log file on pmem (append-mostly)

libpmemobj - Transactional Object Store on pmem

21

libpmemobj

Object API

Transactional API

22

Applications

23

pm_invaders

24

25

Redis key/value store

26

31

0

5

10

15

20

25

30

32 64 128 256 512 1024 2048 4096 8192

seco

nd

s

object size

Startup time

RDB

AOF

PM

32

0

1000

2000

3000

4000

5000

6000

7000

8000

32 64 128 256 512 1024 2048 4096 8192

DR

AM

all

oca

tio

ns

[MB

]

objects size

DRAM usage

AOF

RDB

PM

33

0

20000

40000

60000

80000

100000

120000

36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141

op

era

tio

ns

/ se

c

% of OS memory

Running out of DRAM

No Persist

34

0

20000

40000

60000

80000

100000

120000

36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141

op

era

tio

ns

/ se

c

% of OS memory

Running out of DRAM

No Persist

RDB

35

0

20000

40000

60000

80000

100000

120000

36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141

op

era

tio

ns

/ se

c

% of OS memory

Running out of DRAM

No Persist

RDB

AOF

36

0

20000

40000

60000

80000

100000

120000

36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141

op

era

tio

ns

/ se

c

% of OS memory

Running out of DRAM

No Persist

RDB

PM

AOF

37

0

10000

20000

30000

40000

50000

60000

70000

80000

32 64 128 256 512 1024 2048 4096 8192

op

era

tio

ns

/ se

c

objects size

CPU usage

PM 1X

AOF 1X

38

0

10000

20000

30000

40000

50000

60000

70000

80000

32 64 128 256 512 1024 2048 4096 8192

op

era

tio

ns

/ se

c

objects size

CPU usage

PM 1X

PM 4X

AOF 1X

AOF 4X

39

0

10000

20000

30000

40000

50000

60000

70000

80000

32 64 128 256 512 1024 2048 4096 8192

op

era

tio

ns

/ se

c

objects size

CPU usage

PM 1X

PM 4X

PM 6X

PM 10X

AOF 1X

AOF 4X

AOF 10X

Moving even more data

0

100

200

300

400

500

600

Time [s] Memory [MB]

GMRES Sparse Matrix solver

Original Matrix data in PM All in PM

40

Modifying app engine

for (int i=0; i<NUMBER_OF_ITERATIONS; i++) {result = calculateThis(i, result);

}

41

i_pm = 0; //at first runtime of app only

...

...

for (i_pm; i_pm<NUMBER_OF_ITERATIONS; i_pm++) {TX_BEGIN(pool) {

result_pm = calculateThis(i_pm, result_pm);} TX_END

} i_pm = 0;

Possibilities

Choices

Even more fun ...

42

top related