多路云游戏同时启动概率失败和卡死问题案例分享
一 问题背景
项目组中遇到在多路游戏并发测试时,启动多路游戏的容器,CPU sys 态占用率飙高,严重的时候该现象不能自动恢复,导致容器或者游戏启动失败,系统卡死,通过htop观察的现象如下:
二 原因分析
1在容器启动过程中,通过strace观察发现在容器中的安卓系统启动过程中会按照1024个字节去read /proc/vmallocinfo这个文件;在启动20路容器的情况下,在命令行通过dd命令模拟读取操作,耗时需要90s,怀疑是安卓镜像打开了debug功能,在启动过程中dump系统信息如下
2. 在实验室并行启动多路游戏的场景复现到问题,通过 perf 工具获取异常情况下系统的热点函数,显卡使用__iommu_alloc_attrs 函数分配虚拟内存,虚拟内存分配函数耗时占比55.27%,确定为该类函数性能低导致,perf 热点函数信息如下
三 解决方案
1. 针对容器中安卓系统访问/proc/vmallocinfo文件慢问题,同步anbox社区补丁给客户,在安卓9.0系统中./frameworks/base/core/jni/android_os_Debug.cpp:611注释掉对于/proc/vmallocinfo文件的访问,同时建议客户在测试多路游戏时不要在命令行cat该文件。
2、Linux 内核社区针对该问题发布了相应的补丁,解决该问题需要合入三个内核补丁,按照步骤逐步合入三个补丁的信息如下:
步骤 1 [v4,0/3] improve vmap allocation
补丁的链接为:https://patchwork.kernel.org/cover/10888243/,该补丁为 vmalloc 性能提升的补丁集合。
步骤 2 2c92923 mm/vmalloc.c: avoid bogus -Wmaybe-uninitialized warning
补丁的链接为:https://lore.kernel.org/linux-mm/20190618092650.2943749-1arnd@arndb.de/,该补丁解决了 vmalloc 编译的告警问题,对应的内核主线 commit id 为 2c92923。
步骤 3 5336e52 mm/vmalloc.c: fix percpu free VM area search criteria
补丁链接地址:https://salsa-test.debian.net/waldi/linux/commit/5336e52c9e46afa69b7a85a0a091f0e4daa2
3d6e,该补丁修复了第一个补丁可能引起的 panic,对应的内核主线 commit id 为 5336e52。
合入上述两个修改后,多路容器在同时启动时,未出现CPU占用飙升的情况,容器启动速度满足要求
四 总结
该问题为虚拟内存的分配使用问题,需要对内核虚拟内存分配效率进行优化,并且避免容器中的安卓系统对/proc/vmallocinfo文件不必要的访问。
- 点赞
- 收藏
- 关注作者
评论(0)