多路云游戏同时启动概率失败和卡死问题案例分享

举报
阿刚 发表于 2020/02/13 15:49:02 2020/02/13
【摘要】 在多路容器启动时,存在虚拟内存分配问题,应避免gest os对文件进行不必要的访问

一 问题背景

项目组中遇到在多路游戏并发测试时,启动多路游戏的容器,CPU sys 态占用率飙高,严重的时候该现象不能自动恢复,导致容器或者游戏启动失败,系统卡死,通过htop观察的现象如下:

1581579827103989.jpg



二 原因分析

1在容器启动过程中,通过strace观察发现在容器中的安卓系统启动过程中会按照1024个字节去read /proc/vmallocinfo这个文件;在启动20路容器的情况下,在命令行通过dd命令模拟读取操作,耗时需要90s,怀疑是安卓镜像打开了debug功能,在启动过程中dump系统信息如下

1581579879241190.jpg


2. 在实验室并行启动多路游戏的场景复现到问题,通过 perf 工具获取异常情况下系统的热点函数,显卡使用__iommu_alloc_attrs 函数分配虚拟内存,虚拟内存分配函数耗时占比55.27%,确定为该类函数性能低导致,perf 热点函数信息如下

1581579901884906.jpg


三 解决方案


1. 针对容器中安卓系统访问/proc/vmallocinfo文件慢问题,同步anbox社区补丁给客户,在安卓9.0系统中./frameworks/base/core/jni/android_os_Debug.cpp:611注释掉对于/proc/vmallocinfo文件的访问,同时建议客户在测试多路游戏时不要在命令行cat该文件


1581579940758382.png

2Linux 内核社区针对该问题发布了相应的补丁,解决该问题需要合入三个内核补丁,按照步骤逐步合入三个补丁的信息如下:

步骤 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文件不必要的访问。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。