与内存优化相关的内存参数和lmkd参数调整

手机4GRAM,提高分辨率后,依次冷启动30个应用,总启动时间极剧增加。
初步分析发现kwaped0线程频繁,内存环境很差。
打算调整一下内存参数和lmkd参数,有好的建议吗?
目前调整vm参数,对与extra_free_kbytes参数不知道具体作用
/proc/sys/vm/extra_free_kbytes
/proc/sys/vm/watermark_scale_factor
/proc/sys/vm/swappiness

该回答引用GPT:
extra_free_kbytes参数是用来控制系统空闲内存的,它可以控制系统空闲内存的最小值,以便系统可以更快地响应用户的请求。watermark_scale factor参数是用来控制系统内存使用的,它可以控制系统内存使用的最大值,以便系统可以更快地响应用户的请求。swappiness参数是用来控制系统内存使用的,它可以控制系统内存使用的比例,以便系统可以更快地响应用户的请求。

为了调整内存参数和Imkd参数,可以使用以下代码:

echo "vm.extra_free_kbytes=1024" >> /etc/sysctl.conf
echo "vm.watermark_scale_factor=2" >> /etc/sysctl.conf
echo "vm.swappiness=10" >> /etc/sysctl.conf
sysctl -p

如还有疑问,可以私信帮助解决。

参考GPT和自己的思路,调整内存参数和lmkd参数可能会有所帮助。以下是一些可能有用的建议:

1.调整/proc/sys/vm/extra_free_kbytes参数
extra_free_kbytes参数指定了一个额外的可用内存池,该池的大小等于指定的值。这些内存可以用于更快地响应临时内存需求。建议将此值设置为设备可用内存的一小部分(例如1%)。

2.调整/proc/sys/vm/watermark_scale_factor参数
watermark_scale_factor参数用于控制系统内存压缩的频率。通过降低此值,您可以减少系统进行内存压缩和回收的频率。建议将此值设置为较低的值,例如0.5或更低,以避免过度压缩。

3.调整/proc/sys/vm/swappiness参数
swappiness参数用于控制系统交换内存的频率。通过降低此值,您可以减少系统将内存转移到交换分区的频率。建议将此值设置为较低的值,例如10或更低。

该回答引用ChatGPT4,希望能对你有帮助,你试试看看能不能解决问题
该问题可能与内存管理不善有关,您正在考虑调整内存和 lmkd(低内存杀手守护程序)参数。以下是优化手机性能的一些建议:

/proc/sys/vm/extra_free_kbytes:该参数用于确保系统有一些额外的空闲内存可用。当系统内存压力大时,增加它的值可以提高响应能力。由于您有 4GB RAM,您可以尝试适度增加该值(例如 32768 或 65536)以查看它是否有助于提高性能。但是,不要将它设置得太高,因为它可能会导致不必要的内存浪费。

/proc/sys/vm/watermark_scale_factor:这个参数决定了内存回收的积极性。较高的值意味着更积极的回收,而较低的值意味着更不积极的回收。您可以尝试根据手机的内存使用情况调整此值。例如,如果您经常用完内存并希望系统更积极地回收内存,您可以将它设置为更高的值(例如 200)。相反,如果您有足够的空闲内存,则可以将其设置为较低的值(例如,50)以降低内存回收的积极性。

/proc/sys/vm/swappiness:Swappiness 是一个参数,它控制内核将进程移出物理内存并移至交换空间的趋势。较高的值意味着更多的交换,而较低的值意味着更少的交换。在移动设备上,通常建议将 swappiness 设置为较低的值(例如 10 或 20)以减少交换空间的使用并提高整体性能。

调整 Low Memory Killer Daemon (lmkd) 参数:您还可以尝试调整 lmkd 参数以微调何时触发 Low Memory Killer。这可能有助于提高运行多个应用程序时的性能。考虑调整 minfree 参数,它决定低内存杀手被激活前的最小空闲内存量。

请记住,每台设备的硬件和软件配置不同,最佳设置也可能不同。您可能需要试验这些参数以找到适合您的特定设备的最佳组合。

参考GPT和自己的思路:内存优化是一个复杂的问题,需要根据具体情况进行针对性调整。根据您的描述,您可以尝试进行以下操作来优化内存:

1 调整 vm.watermark_scale_factor 参数
该参数用于控制内核何时触发回收内存的阈值,可以根据实际情况调整。较小的值会使内核更快地触发内存回收,较大的值会使内存更容易达到极限,可能会导致性能下降。建议将该参数值设置为 200 ~ 300。

2 调整 vm.extra_free_kbytes 参数
该参数表示为了避免系统出现内存短缺而额外保留的内存量,可以根据实际情况进行调整。较小的值会减少额外保留的内存量,可能会导致系统出现内存短缺,较大的值会增加额外保留的内存量,可能会浪费内存资源。建议将该参数值设置为 51200 ~ 102400。

3 调整 vm.swappiness 参数
该参数用于控制内核何时将内存页面交换到交换分区。可以根据实际情况进行调整。较小的值会减少交换的次数,可能会导致性能提高,较大的值会增加交换的次数,可能会降低性能。建议将该参数值设置为 10 ~ 20。

4 调整 lmkd 参数
lmkd 是 Android 8.0 引入的一个新特性,可以用于控制低内存情况下系统进程和应用进程的 OOM(Out of Memory)情况。您可以使用以下命令来查看当前系统的 lmkd 参数:

adb shell getprop | grep lmk


可以根据实际情况进行调整,以提高系统的性能。

需要注意的是,在进行内存参数和 lmkd 参数的调整时,请务必谨慎,不要过度调整,以免导致系统稳定性降低。建议先备份原有的参数设置,再进行调整。

参考GPT和自己的思路:

针对这个问题,我们需要先了解一些内存相关的参数和概念。extra_free_kbytes是指系统预留出的额外空闲内存,用于处理瞬时的内存需求。watermark_scale_factor是指水位线的缩放因子,用于控制内存紧张时的释放阈值。而swappiness则是用来调整系统对内存和交换空间的使用偏好。

在这个情况下,我们可以尝试增加extra_free_kbytes参数的值,以增加系统预留的额外空闲内存,从而处理瞬时的内存需求。同时,我们可以调整watermark_scale_factor参数的值,以控制内存紧张时的释放阈值,避免出现频繁的内存回收和swapping现象。为了更好地调整lmkd参数,你可以使用profiler工具来分析和监测线程和进程的内存使用情况,并相应调整lmkd参数。

总之,在调整内存和lmkd参数时,需要结合具体情况,综合考虑系统配置、应用特性以及用户需求等方面,以达到最优的内存优化效果。

你的系统应该精简精简了,合理安排进程的启动顺序

/proc/sys/vm 下可用于调整watermark的参数有:min_free_kbytes, watermark_boost_factor , watermark_scale_factor。
这几个重要的参数解决直接内存回收导致性能抖动问题,核心是让low与min之间留有足够的缓冲,使得kswapd能够有时间回收足够的内存。根据我的经验通常调整watermark_scale_factor效果较优。 这个参数默认值为10,对应内存占比0.1%(10/10000),可通过”/proc/ sys/vm/watermark_scale_factor"设置,最大为1000。当它的值被设定为1000时,意味着"low"与"min"之间的差值,以及"high"与"low"之间的差值都将是内存大小的10%(1000/10000),我建议你4G的设置成1024。

接着来继续说你的疑问,min_free_kbytes这个参数挺有意思的,它不仅仅影响Linux内存回收中的water_mark(尤其是direct reclaim回收方式,Linux有两种内存回收方式——一种是kswapd后台回收,在早期的内核版本kswapd是周期性唤醒,因此又叫周期回收,但是没有必要,真的没有必要,所以在现代Linux内核版本中已经不再是周期唤醒,而是在分配内存的时候会基于zone的water_mark来唤醒做后台回收内存;另一种就是direct reclaim,这种又叫同步回收,因为此时系统可用内存到了water_mark_min,意味着系统内存非常非常紧张,所以allocate page申请内存的进程会被阻塞直到回收可用内存。当然,如果经历了内存回收流程仍旧没有回收到足够的内存,那么在allocate page函数中会走out_of_memory函数的oom流程),还会影响系统的可用内存available memory。 所以根据你4G的内存,你可以尝试下设置成65536或者90K。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,提高分辨率会导致更多的图像数据需要被加载到内存中,这可能会导致内存不足的问题。因此,可以考虑调整一些内存参数和lmkd参数,以优化内存管理。

  1. extra_free_kbytes参数

extra_free_kbytes参数表示内核需要额外保留的空闲内存,以应对突发的内存需求。可以考虑调高该参数的值,以增加系统的内存储备能力,具体可以根据实际情况来确定该参数的值。一般来说,建议将其设置在100MB到200MB之间。

可以使用以下命令修改该参数的值:

echo 100000 > /proc/sys/vm/extra_free_kbytes
  1. watermark_scale_factor参数

watermark_scale_factor参数表示内核在进行内存回收时,需要保留的一定比例的空闲内存。可以考虑适当降低该参数的值,以增加内存回收的速度和效率,具体可以根据实际情况来确定该参数的值。一般来说,建议将其设置在0.1到0.3之间。

可以使用以下命令修改该参数的值:

echo 0.2 > /proc/sys/vm/watermark_scale_factor
  1. swappiness参数

swappiness参数表示内核在进行内存回收时,选择是清理缓存内存,还是清理进程内存。可以考虑调整该参数的值,以让内核更倾向于清理缓存内存,从而为进程留下更多的空间。一般来说,建议将其设置在60到80之间。

可以使用以下命令修改该参数的值:

echo 70 > /proc/sys/vm/swappiness

除了上述参数调整,还可以考虑通过lmkd(Low Memory Killer Daemon)来优化内存管理。lmkd是一个用户空间进程,可以监控内存使用情况,并根据内存压力情况自动杀死部分进程,以释放更多的内存空间。

可以使用以下命令修改lmkd的参数:

echo 1 > /sys/module/lowmemorykiller/parameters/enable_adaptive_lmk
echo 1 > /sys/module/lowmemorykiller/parameters/use_minimal_adaptive_lmk
echo 18000,24000,30000,36000,42000,48000 > /sys/module/lowmemorykiller/parameters/minfree

其中:

  • enable_adaptive_lmk参数表示启用自适应lmk算法。
  • use_minimal_adaptive_lmk参数表示启用最小自适应lmk算法。
  • minfree参数表示在不同内存压力下,lmkd需要释放的内存阀值,单位为KB。以上述命令中的参数为例,表示当内存压力分别为20%,30%,40%,50%,60%,70%时,lmkd需要分别释放18000KB,24000KB,30000KB,36000KB,42000KB和48000KB的内存空间。

除了上面提到的参数和lmkd优化,还可以考虑使用内存优化工具,如Android Studio中的Memory Profiler,来分析应用程序的内存使用情况,以便进一步优化内存管理。

总结一下,推荐的参数配置为:

echo 100000 > /proc/sys/vm/extra_free_kbytes
echo 0.2 > /proc/sys/vm/watermark_scale_factor
echo 70 > /proc/sys/vm/swappiness

echo 1 > /sys/module/lowmemorykiller/parameters/enable_adaptive_lmk
echo 1 > /sys/module/lowmemorykiller/parameters/use_minimal_adaptive_lmk
echo 18000,24000,30000,36000,42000,48000 > /sys/module/lowmemorykiller/parameters/minfree

以上配置仅供参考,具体的配置需要根据实际情况进行调整。建议在配置变更之前备份当前的系统配置文件,以便恢复到原始设置。
如果我的回答解决了您的问题,请采纳!

引用chatgpt回答:
调整内存参数
a. extra_free_kbytes 参数表示系统在没有其他空闲内存可用时要保留的额外空闲内存(以 KB 为单位)。默认情况下,这个值通常较低,如果系统有可用的内存,就不会增加系统的空闲内存。您可以尝试适当增加这个值,例如增加到 2048,以增加系统保留的额外空闲内存,减少内存不足导致的问题。

b. watermark_scale_factor 参数表示在OOM(Out of Memory)情况下,LMK(Low Memory Killer)的触发比例。默认情况下,该参数为 10,意味着当内存使用量达到可用内存的 10% 时,LMK 将会开始杀死进程来释放内存。如果您的应用需要更多的内存,可以考虑适当增加这个值,例如增加到 20 或更高。

c. swappiness 参数表示系统在使用交换分区(swap)时的倾向性,值范围为 0 到 100,数值越高,系统越倾向于使用交换分区。如果您的应用需要更多的内存,可以适当减小这个值,例如减小到 10 或更低。

调整 LMKD 参数
a. adj_retries 参数表示在 LMKD 检测到内存不足时,为了尝试避免杀死优先级较高的进程,它将等待多少次调整后再执行 OOM 操作。默认情况下,该值为 3。如果您的应用在冷启动时需要大量内存,可以适当增加这个值,例如增加到 5 或更高。

b. min_free_kbytes 参数表示 LMKD 会尝试保留多少内存(以 KB 为单位)来防止内存不足的情况发生。默认情况下,该值通常较低,如果系统有可用的内存,就不会增加系统的空闲内存。您可以尝试适当增加这个值,例如增加到 8192,以增加系统保留的额外空闲内存,减少内存不足导致的问题。

需要注意的是,不同的系统和设备可能会有不同的默认参数值和调整方式。建议您在调整参数时先备份原始值,逐步调整并测试,以避免出现意外情况