xref: /aosp_15_r20/system/logging/logd/README.compression.md (revision 598139dc91b21518d67c408eaea2644226490971)
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![Total Log Count](doc_images/total_log_count.png)
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![CPU Time Walleye](doc_images/cpu_walleye.png)
71*598139dcSAndroid Build Coastguard Worker![CPU Time Cuttlefish](doc_images/cpu_cuttlefish.png)
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![Memory Usage](doc_images/memory_usage.png)
81*598139dcSAndroid Build Coastguard Worker
82