Previous Installment: Topics/Approaches Prevent Redis Instance Slow Now: Examine Ways Measuring Performance
What To Measure
Focus: Command Latency และ Components ทำไม? เพราะ Commands Push Through Redis Server/Library = Result ของ Speed แต่ละ Command
Quick And Easy: The CLI
First Way Check Command Latency: redis-cli Quick Immediate Checkpoint Examples Use Localhost Simplicity Setup ใช้ -h <host> -a <auth> -p <port>
Basic Latency
Run redis-cli --latency Output: Min, Max, Avg, Iterations Iterations = Run PING Command Against Open Connection ไม่ Include Connection Time Code Connects Every Command -> Worse Performance Than This Indicates
Run Until Kill (CTRL-C) Latency Numbers = Milliseconds Result:
min: 0, max: 1, avg: 0.11 (11369 samples)
Min <1ms Max 1ms Avg 0.11ms Per-PING Localhost Connection 11,369 Samples
Alternative: --latency-history Break Into Temporal Slices Default Window 15s Result:
min: 0, max: 1, avg: 0.11 (1475 samples) -- 15.01 seconds range min: 0, max: 1, avg: 0.10 (1474 samples) -- 15.01 seconds range
Run Until Kill Different Interval: -i Example:
redis-cli --latency-history -i 10 min: 0, max: 1, avg: 0.11 (984 samples) -- 10.01 seconds range min: 0, max: 1, avg: 0.11 (983 samples) -- 10.01 seconds range min: 0, max: 1, avg: 0.11 (983 samples) -- 10.01 seconds range
Operations Use PING Command Works Any Redis Version
Intrinsic Latency
Name Might Mislead: Internal Latency Mode Measure Intrinsic Latency Server ไม่ใช่ redis-cli Source GitHub -> Doesn't Even Talk To Server:
start = ustime(); compute_something_fast(); end = ustime(); latency = end-start;
Source Comments: Measure Max Latency Running Process Not From Syscalls Hint: Kernel Leaves Process Without Chance To Run
Testing Intrinsic Latency On Your Client Host Useful Know If Problem Client Side Not Server Should Probably Not First Steps Checking Latency Update: Salvatore Confirmed Intention Run From Server Useful If Shell Access Redis Server Not Useful Otherwise (Common Redis Service Provider)
Using Commissar
Commissar = Small Suite Tracking/Testing Redis Latency Overall Performance Warning: Early Development Much Will Change Only Use If Comfortable Non-production Quality Github: Commissar Repository
This Article: Latency Tool/Directory Env Variables Config Connect Redis Instance Run Same "Time PING Command" Mechanism As redis-cli Parity Test Differs: Output More Info Store In MongoDB (More Stores Coming)
Run Latency Example (Output Likely Changed Since Article):
./latency Connected to 100000 iterations over 53698us, average 536us/operation Percentile breakout: ==================== 99.00%: 3,876.99us 95.00%: 640.00us 90.00%: 514.00us 75.00%: 452.00us 50.00%: 414.00us Min: 243us Max: 44,686us Mean: 536.98us Jitter: 764.37us
Temporal Unit 'us' (Microseconds) Percentile Breakout Better Picture Than Simple Min/Max/Avg 'Jitter' = Standard Deviation Sample
Output Tells: Overall Pretty Good Private Network Peak Much Higher Than Mean But 95% Iterations <= 640 Microseconds What Does This Tell?
Sporadic Network Issue, Server-side Delay, Garbage Collection Test Client Affecting Output Distribution Available: See How Common "High" Result Is
Determine Where Problem: Look How Long Commands On Server Take -> Tell If Server Problem
Example: Check redis info Output Commandstats Section:
redis-cli info commandstats # Commandstats cmdstat_ping:calls=32497193,usec=22213723,usec_per_call=0.68
Average Execute PING On Server = 0.68 Microseconds PING Command Not Culprit But Other Commands During Test Could Back Up Redis Process Causing Delay
Recent Addition: Concurrent Latency Tests Env Var LATENCY_CLIENTCOUNT Run Multiple Connections See Concurrency Affects Latency Results Difference 10 vs 100 vs 1000 Concurrent Clients Useful Dev/Staging vs Production
Testing From Containers
Prefer Docker Containers? Push Built Docker Containers golatency Tool Public Docker Registry docker pull therealbill/golatency Image Ready Seconds (<4MB) docker run Env Vars Connect/Configure ReadMe Pull Output Stdout Or docker logs Daemon No Build Needed Significant Changes -> Docker Repo Updated New Image Alternatively Dockerfile In Repo Customize
Final Thoughts
Analyzing Redis Performance Tricky Fortunately Understanding Latency/Throughput Affect Application -> Focus Analyzing Application's Use Of Redis Rather Than Redis Itself Improve Usage/Understanding Best Use Redis Keep In Mind Zen Of Redis "The Key To Performance Is Not Slowing Redis Down" Isolate Network Issues Data Structure Alternatives -> Smarter, More Efficient Applications Better Performance