Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

High Performance Systems in Go - GopherCon 2014

Short presentation on some techniques to gain performance of the NATS messaging system as it was rewritten in Go.

  • Be the first to comment

High Performance Systems in Go - GopherCon 2014

  1. 1. High Performance Systems in Go Derek Collison April 24, 2014 GopherCon
  2. 2. About Architected/Built TIBCO Rendezvous and EMS Messaging Systems Designed and Built CloudFoundry at VMware Co-founded AJAX APIs group at Google Distributed Systems Founder of Apcera, Inc. in San Francisco, CA @derekcollison derek@apcera.com Derek Collison
  3. 3. Why Go? • Simple Compiled Language • Good Standard Library • Concurrency • Synchronous Programming Model • Garbage Collection • STACKS!
  4. 4. Why Go? • Not C/C++ • Not Java (or any JVM based language) • Not Ruby/Python/Node.js
  5. 5. What about High Performance?
  6. 6. NATS
  7. 7. NATS Messaging 101 • Subject-Based • Publish-Subscribe • Distributing Queueing • TCP/IP Overlay • Clustered Servers • Multiple Clients (Go, Node.js, Java, Ruby)
  8. 8. NATS • Originally written to support CloudFoundry • In use by CloudFoundry, Baidu, Apcera and others • Written first in Ruby -> 150k msgs/sec • Rewritten at Apcera in Go (Client and Server) • First pass -> 500k msgs/sec • Current Performance -> 5-6m msgs/sec
  9. 9. Tuning NATS (gnatsd) or how to get from 500k to 6m
  10. 10. Target Areas • Shuffling Data • Protocol Parsing • Subject/Routing
  11. 11. Target Areas • Shuffling Data • Protocol Parsing! • Subject/Routing
  12. 12. Protocol Parsing • NATS is a text based protocol • PUB foo.bar 2rnokrn • SUB foo.> 2rn • Ruby version based on RegEx • First Go version was port of RegEx • Current is zero allocation byte parser
  13. 13. Some Tidbits • Early on, defer was costly • Text based proto needs conversion from ascii to int • This was also slow due to allocations in strconv.ParseInt
  14. 14. defer
  15. 15. defer Results golang1.3 looks promising
  16. 16. parseSize
  17. 17. parseSize vs strconv.ParseInt
  18. 18. Target Areas • Shuffling Data • Protocol Parsing • Subject/Routing
  19. 19. Subject Router • Matches subjects to subscribers • Utilizes a trie of nodes and hashmaps • Has a frontend dynamic eviction cache • Uses []byte as keys (Go’s builtin does not)
  20. 20. Subject Router • Tried to avoid []byte -> string conversions • Go’s builtin hashmap was slow pre 1.0 • Built using hashing algorithms on []byte • Built on hashmaps with []byte keys
  21. 21. Hashing Algorithms
  22. 22. Hashing Algorithms
  23. 23. Jesteress
  24. 24. HashMap Comparisons
  25. 25. Some Lessons Learned • Use go tool pprof (linux) • Avoid short lived objects on the heap • Use the stack or make long lived objects • Benchmark standard library builtins (strconv) • Benchmark builtins (defer, hashmap) • Don’t use channels in performance critical path
  26. 26. Big Lesson Learned?
  27. 27. Go is a good choice for performance based systems
  28. 28. Go is getting better faster than the others
  29. 29. Thanks
  30. 30. Resources • https://github.com/apcera/gnatsd • https://github.com/apcera/nats • https://github.com/derekcollison/nats

    Be the first to comment

    Login to see the comments

  • SrinivasanVenugopal

    Aug. 11, 2015
  • sdhjl2000

    Sep. 9, 2015
  • AnatoliiPrylutskyi

    Sep. 11, 2015
  • arhan

    Sep. 30, 2015
  • Navneetk

    Nov. 22, 2015
  • kooer

    Dec. 8, 2015
  • Frikkhechoomian

    Mar. 20, 2016
  • cjeong

    Apr. 6, 2016
  • IanFlorianScheel

    May. 4, 2016
  • TannerWatson

    May. 13, 2016
  • rixor786

    Jun. 29, 2016
  • LucianoQuercia1

    Jun. 30, 2016
  • yoshinorikawasaki

    Aug. 4, 2016
  • archoncap

    Jan. 12, 2018
  • leelakrsna

    Jan. 16, 2018
  • MilosSimic

    Sep. 10, 2018
  • MikeTaghavi

    Feb. 12, 2019
  • ssuser9e9583

    Oct. 31, 2019
  • zjz311

    Apr. 4, 2020
  • AmoLaizer

    Jun. 10, 2021

Short presentation on some techniques to gain performance of the NATS messaging system as it was rewritten in Go.

Views

Total views

19,326

On Slideshare

0

From embeds

0

Number of embeds

2,263

Actions

Downloads

276

Shares

0

Comments

0

Likes

56

×