Fork me on GitHub

内存压力及IO压力调整方法

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 压力。

7. dirty_expire_centisecs 和 dirty_writeback_centisecs

  • dirty_writeback_centisecs 是一个用于控制 Linux 内核中脏数据回写频率的参数。

    • 默认值:通常为 500 centisecs,即 5 秒。
  • dirty_expire_centisecs 控制脏数据在内存中的存活时间,确保数据不会在内存中停留过久。

posted @ 2024-10-24 10:47  yooooooo  阅读(55)  评论(0编辑  收藏  举报