Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HeapOff memory WTF

HeapOff memory WTF

HeapOff caching with Apache DirectMemory

Avatar for Olivier Lamy

Olivier Lamy

June 14, 2012
Tweet

More Decks by Olivier Lamy

Other Decks in Technology

Transcript

  1. Abstract * Java memory fundamental * heap off memory principles

    * heap-off cache with Apache DirectMemory
  2. /me Olivier Lamy * Open Source Architect @Talend Apache Team

    * Apache Member : Maven, Archiva, Tomcat, DirectMemory, Build Infra, etc.. * Jenkins * Add bugs in various OpenSource projects * twitter.com/olamy olamy.blogspot.com
  3. Java Memory Fundamental The cool part * Automatic memory allocation

    (do you remember when you used malloc) * Garbage collector (GC) (no more free)
  4. Java Memory Fundamental The bad part * stop-the-world mode *

    proportionnal to memory's size * unpredictable unresponsive application : complicated with tight SLA
  5. Heap Off Memory How to use that ? Native libraries

    with JNA https://github.com/twall/jna ByteBuffer @since 1.4 with nio ByteBuffer.allocate( size ) (not off heap) ByteBuffer.allocateDirect( size ) You can use sun.misc.Unsafe but can cause issue and not portable
  6. Heap Off Memory How to use that ? You can

    manipulate only Buffer (ByteBuffer byte[] etc..) ! So you must serialize/deserialize your datas Maximum size with -XX:MaxDirectMemorySize=
  7. Our use case : Cache RAM : 10-60 ns Network

    : 10000-30000 ns SSD Disk : 70000-120000 ns Disk : 3000000-10000000 ns Cache must use memory !
  8. Solutions : * Terracotta BigMemory (off-heap storage on top of

    ehcache) * Infinispan (by Jboss) * Huge collections * Apache DirectMemory
  9. Apache Direct Memory Goals : Apache Direct Memory is a

    multi layered cache implementation featuring off-heap memory storage to enable caching of java objects without degrading jvm performance.
  10. Apache Direct Memory • Joined Apache Incubator end 2011 •

    12 developpers ATM • Under development : – Memory allocation service just rewrite – APIs are subject to be changed and bugs to be found !
  11. Design & principles • ByteBuffer.allocateDirect is the foundation of the

    cache • ByteBuffers are allocated in big chunk and splitted for internal use
  12. Design & principles Build on layers – CachingService : serialize

    object (pluggable) – MemoryManagerService: Compute ByteBuffer access – ByteBufferAllocatorService: Eventually deals with ByteBuffer
  13. ByteBuffers Allocation Merging Strategy – No memory wasted – Suffers

    from fragmentation – Need synchronization at de/allocation Fixed Size buffers allocation – Memory wasted if size not correctly configured – No fragmentation
  14. Use case (1) Multi layers cache • Most used objects

    are cached on heap, the rest off-heap (maybe overflow to disk) • Sounds like ehcache with BigMemory • Hard coded class to use : net.sf.ehcache.store.offheap.OffHeapStore • So same package class name in Apache DirectMemory (https://jira.terracotta.org/jira/browse/EHC-940) • Demo
  15. Use case (2) Cache Server • « à la »

    memcache tru http(s) • But with a REST Api and written in Java • Client API available • Demo
  16. > PUT /dm/cache/bordeaux HTTP/1.1 > Content-Type:text/plain {"millesime":"2003","description":"so good so good"}

    < HTTP/1.1 200 OK < X-DirectMemory-SerializeSize: 58 < Content-Length: 0 > GET /dm/cache/bordeaux HTTP/1.1 > Accept:text/plain < HTTP/1.1 200 OK < Content-Type: text/plain < Content-Length: 51 {"millesime":"2003","description":"so good so good"} > DELETE /dm/cache/foo HTTP/1.1
  17. Next Steps • JSR 107 ? • Benchmarks • Components

    Integration (Cassandra, Tomcat etc..) • Dynamic cache size modification • Management/Monitoring
  18. Abstract * Java memory fundamental * heap off memory principles

    * heap-off cache with Apache DirectMemory
  19. /me Olivier Lamy * Open Source Architect @Talend Apache Team

    * Apache Member : Maven, Archiva, Tomcat, DirectMemory, Build Infra, etc.. * Jenkins * Add bugs in various OpenSource projects * twitter.com/olamy olamy.blogspot.com
  20. Java Memory Fundamental The cool part * Automatic memory allocation

    (do you remember when you used malloc) * Garbage collector (GC) (no more free)
  21. Java Memory Fundamental The bad part * stop-the-world mode *

    proportionnal to memory's size * unpredictable unresponsive application : complicated with tight SLA
  22. Heap Off Memory How to use that ? Native libraries

    with JNA https://github.com/twall/jna ByteBuffer @since 1.4 with nio ByteBuffer.allocate( size ) (not off heap) ByteBuffer.allocateDirect( size ) You can use sun.misc.Unsafe but can cause issue and not portable
  23. Heap Off Memory How to use that ? You can

    manipulate only Buffer (ByteBuffer byte[] etc..) ! So you must serialize/deserialize your datas Maximum size with -XX:MaxDirectMemorySize=
  24. Our use case : Cache RAM : 10-60 ns Network

    : 10000-30000 ns SSD Disk : 70000-120000 ns Disk : 3000000-10000000 ns Cache must use memory !
  25. Solutions : * Terracotta BigMemory (off-heap storage on top of

    ehcache) * Infinispan (by Jboss) * Huge collections * Apache DirectMemory
  26. Apache Direct Memory Goals : Apache Direct Memory is a

    multi layered cache implementation featuring off-heap memory storage to enable caching of java objects without degrading jvm performance.
  27. Apache Direct Memory • Joined Apache Incubator end 2011 •

    12 developpers ATM • Under development : – Memory allocation service just rewrite – APIs are subject to be changed and bugs to be found !
  28. Design & principles • ByteBuffer.allocateDirect is the foundation of the

    cache • ByteBuffers are allocated in big chunk and splitted for internal use
  29. Design & principles Build on layers – CachingService : serialize

    object (pluggable) – MemoryManagerService: Compute ByteBuffer access – ByteBufferAllocatorService: Eventually deals with ByteBuffer
  30. ByteBuffers Allocation Merging Strategy – No memory wasted – Suffers

    from fragmentation – Need synchronization at de/allocation Fixed Size buffers allocation – Memory wasted if size not correctly configured – No fragmentation
  31. Use case (1) Multi layers cache • Most used objects

    are cached on heap, the rest off-heap (maybe overflow to disk) • Sounds like ehcache with BigMemory • Hard coded class to use : net.sf.ehcache.store.offheap.OffHeapStore • So same package class name in Apache DirectMemory (https://jira.terracotta.org/jira/browse/EHC-940) • Demo
  32. Use case (2) Cache Server • « à la »

    memcache tru http(s) • But with a REST Api and written in Java • Client API available • Demo
  33. > PUT /dm/cache/bordeaux HTTP/1.1 > Content-Type:text/plain {"millesime":"2003","description":"so good so good"}

    < HTTP/1.1 200 OK < X-DirectMemory-SerializeSize: 58 < Content-Length: 0 > GET /dm/cache/bordeaux HTTP/1.1 > Accept:text/plain < HTTP/1.1 200 OK < Content-Type: text/plain < Content-Length: 51 {"millesime":"2003","description":"so good so good"} > DELETE /dm/cache/foo HTTP/1.1
  34. Next Steps • JSR 107 ? • Benchmarks • Components

    Integration (Cassandra, Tomcat etc..) • Dynamic cache size modification • Management/Monitoring