开发者
资源
[ExaGear] 二进制翻译结果的性能提升之:限制内存强序范围的黑名单、白名单机制
[ExaGear] 二进制翻译结果的性能提升之:限制内存强序范围的黑名单、白名单机制
发表于2024/04/28
5172

对ExaGear有一定了解的同学可能知道,ExaGear运行环境的默认配置是“性能优先”的模式。

也就是说,只要被翻译的x86程序能正确运行,ExaGear各项配置就是以性能为优先考虑因素。

但是呢,有些x86应用程序比较特殊,它们依赖一种叫做TSO的内存一致性模型,或者通俗地叫做“强序模型”。而ExaGear的运行底座是ARM架构的鲲鹏CPU,不是TSO模型。

内存序模型的原理我们在这里不展开,只是这个差异的存在,给ExaGear提出了一个任务:在ARM的底座上,得实现一个功能, 把x86程序对TSO模型的需求给满足了。

所以,在ExaGear的配置文件/opt/exagear/shared/exagear-x86_*.conf里,我们看到这么两个配置项:

    EXAGEAR_SMO_MODE="fbase"

    EXAGEAR_SMO_SEVERITY="smart"

前一个是使能内存强序的范围,后一个是使能内存强序的方式。对于我们普通的用户,重点关注前一项EXAGEAR_SMO_MODE。

这里“fbase”出现的地方,可以是none/fbase/all三者中的任意一个值,默认是fbase。 (如果翻看用户手册,会发现还有个abase,这个目前不使能,暂时忽略)

这三者的差别在于:

    none: x86程序运行时的所有部分不使能强序;(这种方式大概率程序运行不起来)

    fbase: x86程序运行时的某些动态运行库文件被使能强序,具体是哪些文件是在ExaGear引擎里面预定义的。字母f表示以文件为处理单元。

    all: x86程序运行时的所有部分使能强序。

所以,如果某一款x86软件用fbase没法跑起来,那么就应该试试“all”,把x86程序的所有部分都加上强序,确保功能正常。

到目前为止,我们解决了第一个问题:即当x86程序依赖TSO强内存序模型时,如何改变ExaGear配置,从“性能优先”切换到“功能优先”。

但这个办法是有性能影响的,而且实际情况往往是只有若干个二进制(库或者可执行程序本身)需要使能强序,其它部分完全可以用原来“性能优先”的方式运行。

只不过,我们不知道具体是哪些个部分需要使能强序,所以第一步用“all”对x86程序运行时的所有部分使能强序,首先确认这个办法管用。

在功能正常的情况下,我们自然希望能够缩小强序的使能范围,达到功能和性能平衡的效果。所以,ExaGear的配置文件里还有这两项:

    EXAGEAR_SMO_PATTERNS=""

    EXAGEAR_SMO_PATTERNS_EXCL=""

前者表示双引号中的文件列表使能强序,其它部分用“性能优先”方式运行;

后者表示双引号中的文件列表用“性能优先”方式运行,其它部分使能强序;

这双引号括起来的内容,是以逗号分隔的字符串列表,中间无空格,如"abc,jkl,xyz"。名称中包含这些字符串的文件均会被匹配,libabc.so、libabcmm.so均是成功匹配的文件。

至于,双引号里面的内容从哪里来,可以参考x86程序运行时,该进程的内存映射信息/proc/PID/maps,相关的各类二进制名称都在这里。

另外强调一下,这两个配置项是“两选一”的关系,需要和之前的EXAGEAR_SMO_MODE配合使用,具体对应关系如下:

“fbase”情况下,使能EXAGEAR_SMO_PATTERNS;

“all”情况下,使能EXAGEAR_SMO_PATTERNS_EXCL。

<end>

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞