1*598139dcSAndroid Build Coastguard Worker# Log Compression instead of Chatty in Android S 2*598139dcSAndroid Build Coastguard Worker 3*598139dcSAndroid Build Coastguard Worker## The problem 4*598139dcSAndroid Build Coastguard Worker 5*598139dcSAndroid Build Coastguard Worker* Log buffer space is precious, but suffers from the tragedy of the commons 6*598139dcSAndroid Build Coastguard Worker* Log spam fills the buffers making them less useful in logcat/bugreports 7*598139dcSAndroid Build Coastguard Worker* “Spam” is often in the eye of the beholder: which messages are important depends on what you’re trying to debug 8*598139dcSAndroid Build Coastguard Worker 9*598139dcSAndroid Build Coastguard Worker## The idea 10*598139dcSAndroid Build Coastguard Worker 11*598139dcSAndroid Build Coastguard Worker* Chatty isn’t helping as much as we’d hoped, and is surprisingly expensive 12*598139dcSAndroid Build Coastguard Worker* Compress logs to make more efficient use of the buffer 13*598139dcSAndroid Build Coastguard Worker* Address the root cause of log spam at its source: 14*598139dcSAndroid Build Coastguard Worker * Do not hide log spam at runtime, which de-incentivize fixes 15*598139dcSAndroid Build Coastguard Worker * Add presubmit coverage similar to SELinux violations to keep log spam down 16*598139dcSAndroid Build Coastguard Worker 17*598139dcSAndroid Build Coastguard Worker--- 18*598139dcSAndroid Build Coastguard Worker 19*598139dcSAndroid Build Coastguard Worker## Chatty in Theory 20*598139dcSAndroid Build Coastguard Worker 21*598139dcSAndroid Build Coastguard Worker* Delete messages classified as spam to extend the range of logs from other sources 22*598139dcSAndroid Build Coastguard Worker* “Spam” defined as: 23*598139dcSAndroid Build Coastguard Worker * Logs from UIDs whose logs consume over 12.5% of a log buffer 24*598139dcSAndroid Build Coastguard Worker * Back-to-back exact duplicate messages 25*598139dcSAndroid Build Coastguard Worker 26*598139dcSAndroid Build Coastguard Worker## Chatty in Practice 27*598139dcSAndroid Build Coastguard Worker 28*598139dcSAndroid Build Coastguard Worker* Developer confusion about missing and de-duplicated logs 29*598139dcSAndroid Build Coastguard Worker* Lowered incentive to fix the root cause of bad logging behavior 30*598139dcSAndroid Build Coastguard Worker* High CPU overhead 31*598139dcSAndroid Build Coastguard Worker* Memory usage greatly exceeds configured buffer size 32*598139dcSAndroid Build Coastguard Worker* Only marginal increase in log range 33*598139dcSAndroid Build Coastguard Worker 34*598139dcSAndroid Build Coastguard Worker--- 35*598139dcSAndroid Build Coastguard Worker 36*598139dcSAndroid Build Coastguard Worker## Log Compression in Theory 37*598139dcSAndroid Build Coastguard Worker 38*598139dcSAndroid Build Coastguard Worker* Store many more logs in the same log buffer size => better for diagnosis 39*598139dcSAndroid Build Coastguard Worker* Memory usage stays below configured log size => better system health 40*598139dcSAndroid Build Coastguard Worker* No gaps in logs, no de-duplicated logs => no developer confusion 41*598139dcSAndroid Build Coastguard Worker* No hiding bad behavior => increased accountability/incentive to fix root causes 42*598139dcSAndroid Build Coastguard Worker 43*598139dcSAndroid Build Coastguard Worker## Log Compression Preliminary Results 44*598139dcSAndroid Build Coastguard Worker 45*598139dcSAndroid Build Coastguard Worker* Captured 2, 5 day periods of full time personal usage of Pixel 4 and replayed the logs offline 46*598139dcSAndroid Build Coastguard Worker* Compression vs Chatty: 47*598139dcSAndroid Build Coastguard Worker * **3.5x more log messages on average** 48*598139dcSAndroid Build Coastguard Worker * **50% less CPU usage** 49*598139dcSAndroid Build Coastguard Worker * **50% less memory usage** 50*598139dcSAndroid Build Coastguard Worker 51*598139dcSAndroid Build Coastguard Worker--- 52*598139dcSAndroid Build Coastguard Worker 53*598139dcSAndroid Build Coastguard Worker## Log Messages in 1MB 54*598139dcSAndroid Build Coastguard Worker 55*598139dcSAndroid Build Coastguard Worker* The number of log messages still available in logcat after ‘Message Count’ messages have been logged to a 1MB log buffer 56*598139dcSAndroid Build Coastguard Worker* Note: ‘Simple’ is the Chatty code without log spam detection and without de-duplication. 57*598139dcSAndroid Build Coastguard Worker 58*598139dcSAndroid Build Coastguard Worker 59*598139dcSAndroid Build Coastguard Worker 60*598139dcSAndroid Build Coastguard Worker--- 61*598139dcSAndroid Build Coastguard Worker 62*598139dcSAndroid Build Coastguard Worker## CPU Time 63*598139dcSAndroid Build Coastguard Worker 64*598139dcSAndroid Build Coastguard Worker* Total CPU time on ARM64 (Walleye) and 32bit x86 (Cuttlefish) 65*598139dcSAndroid Build Coastguard Worker* X axis represents different log buffer size configurations. 66*598139dcSAndroid Build Coastguard Worker * Chatty uses significantly more CPU time at 1MB (the default Pixel configuration) 67*598139dcSAndroid Build Coastguard Worker * Chatty scales poorly with increased log buffer sizes 68*598139dcSAndroid Build Coastguard Worker* Note: “simple” isn’t “compression without actually compressing”, it’s “chatty without doing the chatty elimination”, which is why “simple” is more expensive than “compression” on walleye. 69*598139dcSAndroid Build Coastguard Worker 70*598139dcSAndroid Build Coastguard Worker 71*598139dcSAndroid Build Coastguard Worker 72*598139dcSAndroid Build Coastguard Worker 73*598139dcSAndroid Build Coastguard Worker--- 74*598139dcSAndroid Build Coastguard Worker 75*598139dcSAndroid Build Coastguard Worker## Memory Usage 76*598139dcSAndroid Build Coastguard Worker 77*598139dcSAndroid Build Coastguard Worker* The memory used by ‘Message Count’ messages, on both Walleye and Cuttlefish 78*598139dcSAndroid Build Coastguard Worker* Note: Chatty does not consider the metadata (UID, PID, timestamp, etc) in its calculation of log buffer size, so a 1MB log buffer will consume more than 1MB. Note that there are 8 log buffers, 5 of which are typically filled. 79*598139dcSAndroid Build Coastguard Worker 80*598139dcSAndroid Build Coastguard Worker 81*598139dcSAndroid Build Coastguard Worker 82