Summary Introduction How to Dive into a Code Base Raw Erlang OTP Applications Library Applications Regular Applications Dependencies OTP Releases Excerises Building Open Source Erlang Software Project Structure OTP Applications OTP Releases Supervisors and start_link Semantics It’s About the Guarantees Side Effects Example: Initializing without guaranteeing connections In a nutshell Application Strategies Exercises Planning for Overload Common Overload Sources error_logger Explodes Locks and Blocking Operations Unexpected Messages Restricting Input How Long Should a Time Out Be Asking For Permission What Users See Discarding Data Random Drop Queue Buffers Stack Buffers Time-Sensitive Buffers Dealing With Constant Overload How Do You Drop Exercises Connecting to Remote Nodes Job Control Mode Remsh SSH Daemon Named Pipes Exercises Runtime Metrics Global View Memory CPU Processes Port Digging In Process OTP Processes Ports Exercises Reading Crash Dumps General View Full Mailboxes Too Many (or to o few) Processes Too Many Ports Can’t Allocate Memory Exercises Memory Leaks Common Sources of Leaks Atom Binary Code ETS Processes Nothing in Particular Binaries Detecting Leaks Fixing Leaks Memory Fragmentation Finding Fragmentation Erlang's Memory Model Fixing Memory Fragmentation with a Different Allo cation Strategy Exercises CPU and Scheduler Hogs Profiling and Reduction Counts System Monitors Suspended Ports Exercises Tracing Tracing Principles Tracing with Recon Example Sessions Exercises Conclusion