記憶體壓力及IO壓力調整方法

yooooooo發表於2024-10-24
adb shell stop thermald
adb shell stop thermal-engine
adb shell "echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus"
adb shell "echo 4 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus"
adb shell "echo 1 > /sys/devices/system/cpu/cpu1/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu2/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu3/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu4/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu5/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu6/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu7/online"
adb shell "echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu5/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu6/cpufreq/scaling_governor"
adb shell "echo performance > /sys/devices/system/cpu/cpu7/cpufreq/scaling_governor"
adb shell "echo 1 > /sys/module/lpm_levels/parameters/sleep_disabled"

效能拉滿。

EMMC

echo 0 > /sys/class/mmc_host/mmcX/clk_scaling/enable

UFS

echo 0 > /sys/class/scsi_host/host0/../../../clkscale_enable

如何避免page cache過多及memfree過少的方法

在 Linux 系統中,避免出現記憶體不足 (memfree 過小) 和快取 (cache) 過多從而引發的 I/O 壓力,可以採取以下幾種措施:

1. 調整 vm.swappiness

swappiness 決定了系統將記憶體頁交換到磁碟的頻率。值越高,系統越傾向於使用交換空間,而不是清理快取。降低 swappiness 可以減少系統使用交換空間的頻率,使更多的記憶體用於快取,但需要在 I/O 壓力較小時謹慎調整。

透過 sysctl 設定:

sysctl -w vm.swappiness=10

或透過修改 /etc/sysctl.conf 持久化:

echo "vm.swappiness = 10" >> /etc/sysctl.conf

2. 調整 vm.vfs_cache_pressure

vfs_cache_pressure 引數控制系統回收 inode 和 dentry 快取的力度。較大的值會導致系統更頻繁地回收快取,減小該值可以保留更多的快取,降低 I/O 壓力。

調整方式:

sysctl -w vm.vfs_cache_pressure=50

3. 設定 vm.min_free_kbytes

min_free_kbytes 決定系統為避免記憶體過度分配而保留的最小可用記憶體量。將此值設定為一個合適的值,可以保證系統在發生記憶體短缺前採取措施。

例如:

sysctl -w vm.min_free_kbytes=65536

4. 使用 cgroup 限制 I/O 和記憶體

透過 cgroup,可以為特定的程序組設定記憶體和 I/O 限制,防止某些程序佔用過多的快取或記憶體資源,進而影響系統的整體效能。

限制記憶體使用

echo "<memory_limit_in_bytes>" > /sys/fs/cgroup/memory/<group_name>/memory.limit_in_bytes

限制塊裝置 I/O

echo "<read/write limit>" > /sys/fs/cgroup/blkio/<group_name>/blkio.throttle.read_bps_device

5. 最佳化快取回收機制

可以透過調整 drop_caches 來手動釋放快取,不過這通常只作為應急處理方案。

sync && echo 3 > /proc/sys/vm/drop_caches

6. 調整 dirty_ratio 和 dirty_background_ratio

dirty_ratio 和 dirty_background_ratio 控制系統將髒頁寫入磁碟的時機。較高的 dirty_ratio 可能導致更多的資料快取在記憶體中,延遲了寫入磁碟的操作。在 I/O 壓力較大時,減小這些值可以減少系統寫入突發的情況。

sysctl -w vm.dirty_ratio=20

sysctl -w vm.dirty_background_ratio=5

透過這些方法可以較好地平衡記憶體和快取的使用,避免出現因為快取過多和記憶體不足導致的 I/O 壓力。

相關文章