Slide 1

Slide 1 text

ADVENTURES IN CGO PERFORMANCE

Slide 2

Slide 2 text

SEAN T. ALLEN VP OF ENGINEERING AT WALLAROO LABS AUTHOR OF “STORM APPLIED” MEMBER OF THE PONY CORE TEAM LOVER OF ARTISANAL STREET ART @SEANTALLEN @WALLAROOLABS @PONYLANG

Slide 3

Slide 3 text

WHAT’S IN THIS TALK…

Slide 4

Slide 4 text

CGO AND ME GLUING LANGUAGES TOGETHER FOR FUN AND PROFIT

Slide 5

Slide 5 text

I’M A C PROGRAMMER

Slide 6

Slide 6 text

I’M A PONY PROGRAMMER

Slide 7

Slide 7 text

YOU MIGHT EVEN CALL ME A CGO PROGRAMMER

Slide 8

Slide 8 text

YOU PROBABLY WOULDN’T CALL ME A GO PROGRAMMER

Slide 9

Slide 9 text

I ENDED UP HERE BECAUSE WALLAROO LABS NEEDED TO CALL GO CODE FROM PONY CODE

Slide 10

Slide 10 text

WALLAROO SCALE-INDEPENDENT COMPUTING FOR GO (AND PYTHON)

Slide 11

Slide 11 text

FRAMEWORK FOR DOING “BIG DATA STUFF” * think Hadoop, Spark, Storm, Flink, Kafka Streams

Slide 12

Slide 12 text

FRAMEWORK FOR HORIZONTALLY SCALING EVENT-BY-EVENT STREAM PROCESSING APPLICATIONS * think Storm, Flink, Kafka Streams

Slide 13

Slide 13 text

TWO-LAYER ARCHITECTURE

Slide 14

Slide 14 text

scale-independent scale-aware API

Slide 15

Slide 15 text

scale-independent scale-aware API

Slide 16

Slide 16 text

scale-independent scale-aware API

Slide 17

Slide 17 text

scale-independent scale-aware API

Slide 18

Slide 18 text

scale-independent scale-aware API

Slide 19

Slide 19 text

scale-independent scale-aware API

Slide 20

Slide 20 text

WALLAROO & GO A MARRIAGE MADE IN CGO

Slide 21

Slide 21 text

WALLAROO Decode Compute Encode WALLAROO RUNTIME

Slide 22

Slide 22 text

WALLAROO: PONY RUNTIME Decode Compute Encode WALLAROO RUNTIME

Slide 23

Slide 23 text

WALLAROO: GO COMPUTATIONS Decode Compute Encode WALLAROO RUNTIME

Slide 24

Slide 24 text

WALLAROO: CGO BRIDGE Decode Compute Encode WALLAROO RUNTIME

Slide 25

Slide 25 text

TWO-LAYER ARCHITECTURE REVISITED scale-independent scale-aware API

Slide 26

Slide 26 text

SCALE-AWARE PONY RUNTIME scale-independent scale-aware API

Slide 27

Slide 27 text

SCALE-AWARE PONY RUNTIME scale-independent Pony API

Slide 28

Slide 28 text

USER SUPPLIED SCALE-INDEPENDENT GO scale-independent Pony API

Slide 29

Slide 29 text

USER SUPPLIED SCALE-INDEPENDENT GO Go Pony API

Slide 30

Slide 30 text

CGO BRIDGE BETWEEN GO AND PONY Go Pony API

Slide 31

Slide 31 text

CGO BRIDGE BETWEEN GO AND PONY Go Pony cgo

Slide 32

Slide 32 text

AND SO ENDS THE SEAN T. ALLEN CGO BACKSTORY

Slide 33

Slide 33 text

CGO WE AREN’T IN KANSAS ANYMORE

Slide 34

Slide 34 text

CALL “C” FROM GO

Slide 35

Slide 35 text

CALL GO FROM “C”

Slide 36

Slide 36 text

TO MY EYE, CGO IS NOT FFI* * except it is according to Wikipedia

Slide 37

Slide 37 text

AND IT’S NOT GO

Slide 38

Slide 38 text

CGO PERFORMANCE IT’S COMPLICATED

Slide 39

Slide 39 text

CGO PERFORMANCE CALLING “C” FROM GO

Slide 40

Slide 40 text

CALLING “C” FROM GO METHOD OPERATIONS COMPLETED NANOS PER OPERATION CGO 10,000,000 171 NS/OP GO 2,000,000,000 1.83 NS/OP * according to a simple Cockroach Labs benchmark

Slide 41

Slide 41 text

CGO PERFORMANCE CALLING GO FROM “C”

Slide 42

Slide 42 text

CALLING GO FROM C TEST MACHINE MILLISECONDS PER OPERATION AWS (various instance types) 1-2 MS/OP 2014 MacBook Pro 5-6 MS/OP * according to a simple Sean T. Allen benchmark

Slide 43

Slide 43 text

RUNTIME/PROC.GO LINE 1771

Slide 44

Slide 44 text

RECOMMENDATION: BATCH YOUR CGO CALLS

Slide 45

Slide 45 text

GO => “C” DO AS MUCH AS YOU CAN IN A SINGLE “C” CALL

Slide 46

Slide 46 text

“C” => GO DO AS MUCH AS YOU CAN IN A SINGLE GO CALL

Slide 47

Slide 47 text

THE PROBLEM WITH POINTERS

Slide 48

Slide 48 text

BUT FIRST, LET’S TALK ABOUT GARBAGE COLLECTION

Slide 49

Slide 49 text

THERE ARE MORE TYPES OF GARBAGE COLLECTION IN HEAVEN AND EARTH THAN ARE DREAMT OF IN YOUR PHILOSOPHY

Slide 50

Slide 50 text

“COPYING” GARBAGE COLLECTORS WILL MOVE OBJECTS IN MEMORY

Slide 51

Slide 51 text

RELOCATING OBJECTS IN MEMORY ADDS COMPLEXITY TO FFI

Slide 52

Slide 52 text

C ISN’T ALLOWED TO HOLD ONTO GO POINTERS

Slide 53

Slide 53 text

C ISN’T ALLOWED TO HOLD ONTO GO POINTERS AND IT’S CHECKED AT RUNTIME

Slide 54

Slide 54 text

AND BAD THINGS HAPPEN IF YOU DON’T FOLLOW THE RULES • Go code may pass a Go pointer to C provided the Go memory to which it points does not contain any Go pointers • C code may not keep a copy of a Go pointer after the call returns • A Go function called by C code may not return a Go pointer • Go code may not store a Go pointer in C memory.

Slide 55

Slide 55 text

BUT… WHAT IF I REALLY NEED TO? * like Wallaroo for example

Slide 56

Slide 56 text

“BIG OLD MAP” A SOLUTION OF SORTS

Slide 57

Slide 57 text

GO IS ALLOWED TO RETURN NON-POINTERS TO C * like a unit64

Slide 58

Slide 58 text

A “BIG OLD MAP” OF INTEGERS TO GO OBJECTS SOLVES OUR POINTER PROBLEM

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

BONUS PROBLEM SOLVED…

Slide 64

Slide 64 text

HOLDING OBJECTS IN THE BIG OLD MAP KEEPS THEM FROM BEING GARBAGE COLLECTED

Slide 65

Slide 65 text

“BIG OLD MAP” THERE ARE PROBLEMS

Slide 66

Slide 66 text

PERFORMANCE WILL SUFFER UNDER CONTENTION

Slide 67

Slide 67 text

CONTENDED LOCKS DESTROY PERFORMANCE

Slide 68

Slide 68 text

“BIG OLD MAP” WON’T TAKE YOU VERY FAR

Slide 69

Slide 69 text

TIME FOR A LITTLE SHARDING

Slide 70

Slide 70 text

CONCURRENT MAP FROM 1 LOCK TO MANY LOCKS

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

ID TO SHARD WITH 8 SHARDS ID SHARD 0 0 1 1 8 0 12 4

Slide 77

Slide 77 text

ID GENERATION

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

No content

Slide 80

Slide 80 text

CONCURRENT MAP THERE ARE PROBLEMS

Slide 81

Slide 81 text

THERE’S THAT LOCK IN OUR ID GENERATOR

Slide 82

Slide 82 text

CAN WE DITCH THAT ID GENERATION LOCK?

Slide 83

Slide 83 text

ATOMICS A MORE CONCURRENCY FRIENDLY ALTERNATIVE

Slide 84

Slide 84 text

No content

Slide 85

Slide 85 text

RECOMMENDATIONS

Slide 86

Slide 86 text

FOR ID GENERATION: USE THE ATOMICS PACKAGE OR SOMETHING INTRINSIC TO THE VALUE

Slide 87

Slide 87 text

PICK YOUR “MAP” CAREFULLY.. CONCURRENT MAP PROBABLY ISN’T RIGHT FOR YOU

Slide 88

Slide 88 text

CONSIDER PERFORMANCE UPFRONT

Slide 89

Slide 89 text

AVOID LOCKS

Slide 90

Slide 90 text

CGO AND YOU HOW YOU CAN HELP IMPROVE CGO

Slide 91

Slide 91 text

DOCUMENTATION IS NEEDED

Slide 92

Slide 92 text

IF YOU ARE USING CGO, TALK ABOUT THE PAIN * and the value

Slide 93

Slide 93 text

WORK TO MAKE THE CGO EXPERIENCE MORE LIKE THE GO EXPERIENCE

Slide 94

Slide 94 text

WORK ON THAT TODO ON LINE 1771 IN RUNTIME/PROC.GO * or otherwise contribute code

Slide 95

Slide 95 text

THANKS BRIAN KETELSEN ANDREW TURLEY

Slide 96

Slide 96 text

SPECIAL THANKS TO JEFF WENDLING AKA @ZEEBO ON THE GOPHER SLACK

Slide 97

Slide 97 text

LEARN MORE GITHUB.COM/SEANTALLEN/ ADVENTURES-IN-CGO- PERFORMANCE