diff options
author | johnson.yeh <johnson.yeh@mediatek.com> | 2019-12-19 20:25:02 +0800 |
---|---|---|
committer | Hongguang Chen <hgchen@google.com> | 2020-01-06 17:08:08 +0000 |
commit | 0eef0004af0ddc38f0c23165b26cea81f465d10c (patch) | |
tree | 9e89e21ed1ac78f2afe9d5d62353a0364d2ec908 /src/android/net | |
parent | 7b60bfa137ad7ec9213ec4c2169cea4f303e2ce0 (diff) |
Add rate-limiting to reduce CPU loading of IpClient
Bug: b/144826001
Test: Build Pass: OK
Test: Power ON/OFF: OK
Test: Verify CPU loading improvement: OK
Change-Id: I412f3db7071672ebc3213dc128bbfc8f8bd2abcc
Diffstat (limited to 'src/android/net')
-rw-r--r-- | src/android/net/ip/ConnectivityPacketTracker.java | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/android/net/ip/ConnectivityPacketTracker.java b/src/android/net/ip/ConnectivityPacketTracker.java index dc793cd..bbaf61e 100644 --- a/src/android/net/ip/ConnectivityPacketTracker.java +++ b/src/android/net/ip/ConnectivityPacketTracker.java @@ -28,6 +28,7 @@ import android.net.util.InterfaceParams; import android.net.util.NetworkStackUtils; import android.net.util.PacketReader; import android.os.Handler; +import android.os.SystemClock; import android.system.ErrnoException; import android.system.Os; import android.text.TextUtils; @@ -35,6 +36,7 @@ import android.util.LocalLog; import android.util.Log; import com.android.internal.util.HexDump; +import com.android.internal.util.TokenBucket; import java.io.FileDescriptor; import java.io.IOException; @@ -63,10 +65,15 @@ public class ConnectivityPacketTracker { private static final String MARK_STOP = "--- STOP ---"; private static final String MARK_NAMED_START = "--- START (%s) ---"; private static final String MARK_NAMED_STOP = "--- STOP (%s) ---"; + // Use a TokenBucket to limit CPU usage of logging packets in steady state. + private static final int TOKEN_FILL_RATE = 50; // Maximum one packet every 20ms. + private static final int MAX_BURST_LENGTH = 100; // Maximum burst 100 packets. private final String mTag; private final LocalLog mLog; private final PacketReader mPacketListener; + private final TokenBucket mTokenBucket = new TokenBucket(TOKEN_FILL_RATE, MAX_BURST_LENGTH); + private long mLastRateLimitLogTimeMs = 0; private boolean mRunning; private String mDisplayName; @@ -115,6 +122,17 @@ public class ConnectivityPacketTracker { @Override protected void handlePacket(byte[] recvbuf, int length) { + if (!mTokenBucket.get()) { + // Rate limited. Log once every second so the user knows packets are missing. + final long now = SystemClock.elapsedRealtime(); + if (now >= mLastRateLimitLogTimeMs + 1000) { + addLogEntry("Warning: too many packets, rate-limiting to one every " + + TOKEN_FILL_RATE + "ms"); + mLastRateLimitLogTimeMs = now; + } + return; + } + final String summary = ConnectivityPacketSummary.summarize( mInterface.macAddr, recvbuf, length); if (summary == null) return; |