Share
Embed
Testing in a Distributed World
RICON 2014 - See references, talk, and additional materials at https://github.com/Randommood/RICON2014
Ines Sombra
October 28, 2014
Transcript
41 slides
-
Distributed Systems Testing 1 DST in Academia 2 DST in
the Wild 3 Conclusions, Rants, & Pugs 4 * DST: Distributed Systems Testing -
! " # $ Why do we test? We test
to gain confidence that our system is doing the right thing (now & later) Guide > -
Many types of tests ! " # $ MEDIUM Unit
Integration System Acceptance SMALL Unit Integration (maybe) COMPLEX SYSTEM Fault injection Stress / performance Canary Regression Unit Integration System Acceptance Compatibility Today -
! " # $ CHALLENGES OF DST Timing Failures Unbounded
inputs Ordering Many states Nondeterminism Concurrency No centralized view -
! " # $ Behavior is aggregate Components tested in
isolation also need to be tested together Challenges of DST A B % % ? -
Detour: Hierarchy of Errors ! " # $ BYZANTINE FAILURES
(fail by doing whatever I want) OMISSION FAILURES (fail by dropping messages) CRASH FAILURES (fail by stopping) * Stolen from Henry Robinson’s PWLSF talk Deadlocks Livelock / starvation Under specification Over specification * -
Testing Distributed Systems ! Difficult to approach & many factors
in play Aim to gain confidence of proper system behavior now & later Behavior is aggregate -
! " # $ HUMAN ASSISTED PROOFS MODEL CHECKING LIGHTWEIGHT
FM Formal Methods “Scholarly” Testing TOP-DOWN BOTTOM-UP WHITE / BLACK BOX -
! " # $ Formal Methods LIVENESS SAFETY STATE-MACHINE OF
PROPERTIES, & TRANSITIONS. PARTICULARLY USED IN PROTOCOLS ( TLA+, MODIST, SPIN, …) MODEL CHECKING CONSIDERED SLOW & HARD TO USE. SAFETY- CRITICAL DOMAINS ( TLA+, COQ, ISABELLE ) HUMAN ASSISTED PROOFS LIGHTWEIGHT FM BEST OF BOTH WORLDS ( ALLOY, SAT ) NOTE: THE CHOICE OF METHOD TO USE IS APPLICATION DEPENDENT -
! " # $ Temporal logic of actions (TLA): logic
which combines temporal logic with a logic of actions. TLA+ verifies all traces exhaustively. Slowly making their way to industry HUMAN ASSISTED PROOFS -
! " # $ MODEL CHECKER INITIAL DESIGN IMPLEMENTATION MODEL
CHECKING IN ANALYSIS, DESIGN & CODING PHASES SPIN: Model of system design & requirements (properties) as input. Checker tells us if they hold. If not a counterexample is produced (system run that violates the requirement) ProMeLa (Process Meta Language) to describe models of dst systems (c-like) % MODEL CHECKING -
! " # $ Developed ecosystem: Java, Ruby & more.
Used a lot! LIGHTWEIGHT FM Alloy: solver that takes constraints of a model and finds structures that satisfy them Can be used both to explore the model by generating sample structures, and to check properties by generating counterexamples. -
! " # $ “Scholarly” Testing Pay-as-you-go: gradually increase confidence
Sacrifice rigor (less certainty) for something reasonable Challenged by large state space TOP-DOWN FAULT INJECTORS, INPUT GENERATORS BOTTOM-UP LINEAGE DRIVEN FAULT INJECTORS WHITE / BLACK BOX WE KNOW (OR NOT) ABOUT THE SYSTEM -
! " # $ Failures require only 3 nodes to
reproduce. Multiple inputs needed (~ 3) in correct order. Faulty error handling code culprit. Complex sequences. Aspirator: Tool capable of finding bugs (JVM). 121 new bugs & 379 bad practices! WHITE BOX / STATIC ANALYSIS -
! " # $ Reasons backwards from correct system outcomes
& determines if a failure could have prevented it. Molly only injects the failures it can prove might affect an outcome Counterexamples + Lineage visualizations to help you understand why BOTTOM-UP / MOLLY: LINEAGE DRIVEN FAULT INJECTION -
DST in Academia " Great research but accessibility is an
issue A few frameworks are emerging Some disconnect but reducing thanks to OSS -
State machine specification language & compiler to translate specs to
C++ Core algorithm: 2 explicit state machines Test safety vs liveness mode. All tests start in safety & inject random failures. Tests turned to liveness mode to verify system is not deadlocked. Repeatable ! " # $ -
! " # $ Precise description of system in TLA+
(PlusCal language - like c) Used it in 6 large complex real- world systems. 7 teams use TLA+ Found subtle bugs & confidence to make aggressive optimizations w/o sacrificing correctness Use formal specification to teach system to new engineers -
! " # $ Unit tests, acceptance tests, & integration
tests Shim out the network & introduce artificial partitions Terraform spins up test cluster 20-100 nodes & more testing Production verification & then release Jepsen for Consul Hashicorp -
Develop against LXCs (linux containers) to emulate our production architecture.
High setup cost Canary testing still falls short of giving us increased confidence Run Jepsen for purging system In a “seeking stage” ! " # $ -
# DST in the Wild Some patterns emerging Best practices
are still esoteric & ad-hoc Still not as many tools as we should have (think compilers) -
! " # $ HAVE DECENT TESTS INVEST IN VISIBILITY
VERIFY & ENHANCE Have the basics covered Then add behaviors, interactions, & fancy stuff Test the full distributed system. This means testing the client, system, AND provisioning code! -
! " # $ Any prod deploy Kicks off a
suite Master PRs Kick off a suite Dredd Tests Systems, boundaries, & integration Stacks OS + Our Images Scenario Live setup + assertions Suite Collection of scenarios INTEGRATION TESTS Run integration tests in EC2 Mock services maybe Using different AMIs helped us a lot Can you spot the problem? -
! " # $ VISIBILITY Visual aggregation of test results
Target architectures & legacy versions greatly increase state space Make errors a big deal Alerts & monitoring -
! " # $ VISIBILITY & LOGS Logs lie, are
verbose, & mostly awful BUT they are useful printf is still widely used as debugging Mind verbosity & configuration. Use different modes if tests repeatable -
! " # $ VISIBILITY ACROSS SYSTEMS Insights into system
interactions Help visualizing dependencies before an API changes Highlight request paths Find the request_id -
! " # $ Test failure, recovery, start, & restarts
(also missing dependencies) Disk corruption happens: use file checksums to test to detect this Shorter timeouts on leases in special nodes to prevent clock drift ON ADDRESSING STATES -
! " # $ Test provisioning code! Misconfiguration is a
common source of errors so test for bad configs Remember OSDI paper: 3 nodes, 3 inputs + unit tests can reproduce 77% of failures EC2 as real as it gets (Docker, LXCs too) CONFIGURATION & SETUP -
! " # $ Languages are starting to help us
(go race detector) Static analysis tools are more common Fault injection frameworks are good but you still need understanding of baseline behavior ON TOOLS & FRAMEWORKS -
TL;DR WHAT YOU CAN DO TODAY Test the full system:
client, code, & provisioning Increase tests investment as complexity increases. Easy things don’t cut it when you need certainty Invest in visibility & understanding of behavior Cost tradeoff present ACADEMIA & INDUSTRY Formal Methods when applied correctly tend to result in systems with highest integrity Conventional testing is still our foundation DST Getting it right is tricky Use multitude of methods to gain confidence Value in testing -
@randommood | [email protected] https://github.com/Randommood/RICON2014 Special thanks to: Peter Alvaro, Kyle
Kingsbury, Armon Dadgar, Sean Cribbs, Sargun Dhillon, Ryan Kennedy, Mike O’Neill, Thomas Mahoney, Eric Kustarz , Bruce Spang, Neha Narula, Zeeshan Lakhani, Camille Fournier, and Greg Bako. Thank you!