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
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