From 38c28f3b5f9f038a2d3dee2a9482aad055e77a37 Mon Sep 17 00:00:00 2001 From: Daeho Jeong Date: Thu, 23 Jun 2022 11:32:41 -0700 Subject: [PATCH 1/3] Make smart idle maint update write amount record every period Now, when the condition doesn't meet, smart idle maintenance service doesn't update write amount record. Fixed it, since it should be updated every period. Bug: 241601216 Test: check smart idle maint log of StorageManagerService Signed-off-by: Daeho Jeong Change-Id: I339109fcaa821620a3b9b4b8c49e25fd18d03cf3 Merged-In: I339109fcaa821620a3b9b4b8c49e25fd18d03cf3 --- .../com/android/server/StorageManagerService.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 5eec6e58e9250..ae331859a785a 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -2829,6 +2829,14 @@ class StorageManagerService extends IStorageManager.Stub enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); try { + int latestWrite = mVold.getWriteAmount(); + if (latestWrite == -1) { + Slog.w(TAG, "Failed to get storage write record"); + return; + } + + updateStorageWriteRecords(latestWrite); + // Block based checkpoint process runs fstrim. So, if checkpoint is in progress // (first boot after OTA), We skip the smart idle maintenance if (!needsCheckpoint() || !supportsBlockCheckpoint()) { @@ -2836,13 +2844,6 @@ class StorageManagerService extends IStorageManager.Stub return; } - int latestWrite = mVold.getWriteAmount(); - if (latestWrite == -1) { - Slog.w(TAG, "Failed to get storage write record"); - return; - } - - updateStorageWriteRecords(latestWrite); int avgWriteAmount = getAverageWriteAmount(); Slog.i(TAG, "Set smart idle maintenance: " + "latest write amount: " + From 57ef007ec9f9622f303b0942af5f61a1841f267a Mon Sep 17 00:00:00 2001 From: Daeho Jeong Date: Thu, 23 Jun 2022 16:12:52 -0700 Subject: [PATCH 2/3] Make minimum gc sleep time tunnable Bug: 241601436 Test: check smart idle maint log of StorageManagerService Signed-off-by: Daeho Jeong Change-Id: I004bb6752e84d26b041cfdd27848949f6e49d05e Merged-In: I004bb6752e84d26b041cfdd27848949f6e49d05e --- .../com/android/server/StorageManagerService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index ae331859a785a..3838db3490664 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -370,6 +370,8 @@ class StorageManagerService extends IStorageManager.Stub private static final float DEFAULT_LOW_BATTERY_LEVEL = 20F; // Decide whether charging is required to turn on the feature private static final boolean DEFAULT_CHARGING_REQUIRED = true; + // Minimum GC interval sleep time in ms + private static final int DEFAULT_MIN_GC_SLEEPTIME = 10000; private volatile int mLifetimePercentThreshold; private volatile int mMinSegmentsThreshold; @@ -377,6 +379,7 @@ class StorageManagerService extends IStorageManager.Stub private volatile float mSegmentReclaimWeight; private volatile float mLowBatteryLevel; private volatile boolean mChargingRequired; + private volatile int mMinGCSleepTime; private volatile boolean mNeedGC; private volatile boolean mPassedLifetimeThresh; @@ -2712,6 +2715,8 @@ class StorageManagerService extends IStorageManager.Stub "low_battery_level", DEFAULT_LOW_BATTERY_LEVEL); mChargingRequired = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT, "charging_required", DEFAULT_CHARGING_REQUIRED); + mMinGCSleepTime = DeviceConfig.getInt(DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT, + "min_gc_sleeptime", DEFAULT_MIN_GC_SLEEPTIME); // If we use the smart idle maintenance, we need to turn off GC in the traditional idle // maintenance to avoid the conflict @@ -2851,9 +2856,11 @@ class StorageManagerService extends IStorageManager.Stub ", min segment threshold: " + mMinSegmentsThreshold + ", dirty reclaim rate: " + mDirtyReclaimRate + ", segment reclaim weight: " + mSegmentReclaimWeight + - ", period: " + sSmartIdleMaintPeriod); + ", period(min): " + sSmartIdleMaintPeriod + + ", min gc sleep time(ms): " + mMinGCSleepTime); mVold.setGCUrgentPace(avgWriteAmount, mMinSegmentsThreshold, mDirtyReclaimRate, - mSegmentReclaimWeight, sSmartIdleMaintPeriod); + mSegmentReclaimWeight, sSmartIdleMaintPeriod, + mMinGCSleepTime); } else { Slog.i(TAG, "Skipping smart idle maintenance - block based checkpoint in progress"); } From 7b847f7c649e851b7911f9640248587e9ac4d895 Mon Sep 17 00:00:00 2001 From: Daeho Jeong Date: Fri, 24 Jun 2022 15:08:08 -0700 Subject: [PATCH 3/3] Make target dirty segment ratio tunable Bug: 241601436 Test: check smart idle maint log of StorageManagerService Signed-off-by: Daeho Jeong Change-Id: I97503795473a9977740e717bf7b0ef6283c65a53 Merged-In: I97503795473a9977740e717bf7b0ef6283c65a53 --- .../java/com/android/server/StorageManagerService.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 3838db3490664..9a98f545d8d01 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -372,6 +372,8 @@ class StorageManagerService extends IStorageManager.Stub private static final boolean DEFAULT_CHARGING_REQUIRED = true; // Minimum GC interval sleep time in ms private static final int DEFAULT_MIN_GC_SLEEPTIME = 10000; + // Target dirty segment ratio to aim to + private static final int DEFAULT_TARGET_DIRTY_RATIO = 80; private volatile int mLifetimePercentThreshold; private volatile int mMinSegmentsThreshold; @@ -380,6 +382,7 @@ class StorageManagerService extends IStorageManager.Stub private volatile float mLowBatteryLevel; private volatile boolean mChargingRequired; private volatile int mMinGCSleepTime; + private volatile int mTargetDirtyRatio; private volatile boolean mNeedGC; private volatile boolean mPassedLifetimeThresh; @@ -2717,6 +2720,8 @@ class StorageManagerService extends IStorageManager.Stub "charging_required", DEFAULT_CHARGING_REQUIRED); mMinGCSleepTime = DeviceConfig.getInt(DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT, "min_gc_sleeptime", DEFAULT_MIN_GC_SLEEPTIME); + mTargetDirtyRatio = DeviceConfig.getInt(DeviceConfig.NAMESPACE_STORAGE_NATIVE_BOOT, + "target_dirty_ratio", DEFAULT_TARGET_DIRTY_RATIO); // If we use the smart idle maintenance, we need to turn off GC in the traditional idle // maintenance to avoid the conflict @@ -2857,10 +2862,11 @@ class StorageManagerService extends IStorageManager.Stub ", dirty reclaim rate: " + mDirtyReclaimRate + ", segment reclaim weight: " + mSegmentReclaimWeight + ", period(min): " + sSmartIdleMaintPeriod + - ", min gc sleep time(ms): " + mMinGCSleepTime); + ", min gc sleep time(ms): " + mMinGCSleepTime + + ", target dirty ratio: " + mTargetDirtyRatio); mVold.setGCUrgentPace(avgWriteAmount, mMinSegmentsThreshold, mDirtyReclaimRate, mSegmentReclaimWeight, sSmartIdleMaintPeriod, - mMinGCSleepTime); + mMinGCSleepTime, mTargetDirtyRatio); } else { Slog.i(TAG, "Skipping smart idle maintenance - block based checkpoint in progress"); }