【问题标题】:Port glibc 2.25 and test memory functions移植 glibc 2.25 并测试内存功能
【发布时间】:2017-08-17 09:25:14
【问题描述】:

我正在调查 glibc-2.25 中的一些内存函数(memcpy、memset、memmove)是否可以为我们在 Linux(glibc 2.12)中的服务器程序带来性能提升。 我的第一次尝试是下载 glibc-2.25 的 tar 球并按照此处的说明进行构建/测试 https://sourceware.org/glibc/wiki/Testing/Builds。我手动注释掉内核版本检查,一切顺利。然后使用 glibc wiki 的“针对 glibc 构建树编译”部分中列出的过程将一个测试程序与新建的 glibc 链接,“ldd test”表明它确实依赖于预期的库:

    # $GLIBC is /data8/home/wentingli/temp/glibc/build
    libm.so.6 => /data8/home/wentingli/temp/glibc/build/math/libm.so.6 (0x00007fe42f364000)
    libc.so.6 => /data8/home/wentingli/temp/glibc/build/libc.so.6 (0x00007fe42efc4000)
    /data8/home/wentingli/temp/glibc/build/elf/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fe42f787000)
    libdl.so.2 => /data8/home/wentingli/temp/glibc/build/dlfcn/libdl.so.2 (0x00007fe42edc0000)
    libpthread.so.0 => /data8/home/wentingli/temp/glibc/build/nptl/libpthread.so.0 (0x00007fe42eba2000)

我使用 gdb 来验证实际调用了哪个 memset/memcpy,但它总是显示使用了 __memset_sse2_unaligned_erms,而我期望函数的一些更高级版本(avx2,avx512)可能是in use。 我的问题是:

  1. glibc-2.25是否根据cpu/os/内存地址自动选择了最合适的内存函数版本?如果没有,我是否在 glibc 构建期间遗漏了任何配置或我的设置有问题?
  2. 还有其他替代方法可以从较新的 glibc 移植内存功能吗?

任何帮助或建议将不胜感激。

【问题讨论】:

    标签: c x86-64 glibc porting memcpy


    【解决方案1】:

    在 x86 上,glibc 会自动选择最适合系统 CPU 的实现,通常基于 Intel 的指导。 (这是否是您的场景的最佳选择可能不清楚,因为许多向量指令的性能权衡非常复杂。)只有在工具链中明确禁用 IFUNC,这不会发生,但__memset_sse2_unaligned_erms不是默认实现,所以这里不适用。 ERMS 功能是相当新的,所以这并非完全不合理。

    构建一个新的 glibc 可能是测试这些字符串函数的正确方法。理论上,你也可以使用LD_PRELOAD覆盖glibc提供的函数,但是在glibc构建系统之外构建字符串函数有点麻烦。

    如果您想针对已修补的 glibc 运行程序而不安装后者,则需要使用 glibc 构建目录中的 testrun.sh 脚本(或类似方法)。

    【讨论】:

    • glibc wiki 提供了一些测试新 glibc 的方法,但这似乎有点复杂,不适合生产环境。通常我们遵循不应该替换作为基础核心系统组件的 glibc 的建议。单独构建这些字符串函数确实有点麻烦(尤其是cache/cpu检测)
    • 非常感谢您的回复。在我看来,使用带有 LD_PRELOAD 的新 glibc 会使程序不稳定并意外崩溃,对吧?
    • 您需要使用显式动态链接器调用来针对已卸载的 glibc 运行程序,就像构建目录中的 testrun.sh 脚本一样。
    • 接受对问题最有帮助的答案。
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 2011-04-07
    相关资源
    最近更新 更多