一、关键字:

窗口切换;最近任务;卡顿

二、问题描述

设备型号:黄鹂

系统版本:OpenHarmony 5.0

代码版本:OpenHarmony-5.0

问题现象:应用切换,最近任务退出,连续点击,窗口明显卡顿1.5s。

三、原因分析

3.1 正常机制

openharmony应用切换,最近任务退出,连续点击,窗口退出不卡顿。
window_manager_service线程没有明显阻塞:

img

3.2 异常机制

最近任务退出,连续点击,窗口退出卡顿1.5s.
window_manager_service线程明显阻塞:

img

3.2.1分析trace,最近任务退出卡顿,主要阻塞在窗口服务window_manager_service卡顿1.2s。

img

3.2.2 放大systrace发现,window_manager_service 线程loop被WindowVisibilityChangeCallback任务阻塞导致,RemoveWindow任务没有及时执行。

img

3.2.3 分析代码发现窗口服务端,处理RemoveWindow任务采用同步机制,会被前面任务阻塞。

img

3.2.4 分析window_manager_service 线程loop为啥被WindowVisibilityChangeCallback任务阻塞?

##通过加trace发现主要阻塞点在内存管理服务OnWindowVisibilityChanged回调耗时1.2s

img

3.3 分析log

3.3.1 分析日志发现,GetMemMgrService 服务失败导致阻塞1.2s
Memory::MemMgrClient::GetInstance().OnWindowVisibilityChanged(memMgrWindowInfos);
01-01 08:01:46.930   753   900 I C01799/MemMgr: MemMgrClient::GetMemMgrService called
01-01 08:01:47.716   912   912 E C01799/MemMgr: MemMgrClient::GetMemMgrService get service failed
01-01 08:01:47.716   912   912 E C01799/MemMgr: MemMgrClient::SubscribeAppState MemMgrService is null
3.3.2 分析开机log,发现MemMgrService启动失败,主要原因5.0升级,kernel内存还没有适配全。
01-01 08:01:44.870   439   484 E C01799/MemMgr: KernelInterface::WriteToFile file path cannot be canonicalized
01-01 08:01:44.870   439   484 E C01799/MemMgr: Memcg::WriteToFile_ failed. 300 > /dev/memcg/memory.app_score
01-01 08:01:44.870   439   484 E C01799/MemMgr: Memcg::ReadScoreAndReclaimRatiosFromKernel_ file not found. /dev/memcg/memory.zswapd_single_memcg_param
01-01 08:01:44.870   439   484 I C01799/MemMgr: MemcgMgr::SetRootMemcgPara Init rootMemcg reclaim ratios success
01-01 08:01:44.870   439   484 E C01799/MemMgr: ReclaimStrategyManager::Init init failed
01-01 08:01:44.870   439   484 E C01799/MemMgr: MemMgrService::Init ReclaimStrategyManager init failed
01-01 08:01:44.870   439   484 E C01799/MemMgr: MemMgrService::OnStart init failed

四、方案优化

MemMgrService没有起来前,先屏蔽内存管理服务OnWindowVisibilityChanged回调。

img

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐