在 Docker 中使用 ksm_preload 来管理 Apache

在 Docker 中使用 ksm_preload 来管理 Apache

我正在尝试使用ksm_预加载对于 Docker 中的 Apache。问题是在 Docker 内部运行时库不会被映射。在外部它可以工作,我看到的是共享/易失性页面。我认为问题出在 apache 的某个地方,因为在同一容器中运行且具有相同 LD_PRELOAD 参数的其他应用程序(如 apt)在 KSM 中显示活动。

运行 make install 后,我在 docker 容器内尝试了以下内容

LD_PRELOAD=/usr/local/share/ksm_preload/libksm_preload.so apache2ctl -k start -D FOREGROUND

我也尝试设置/etc/apache2/envvars工作进程:

export LD_DEBUG=all
export LD_PRELOAD=/usr/local/share/ksm_preload/libksm_preload.so

父进程获得了映射的库,但子工作进程却没有。

父进程的 /proc/pid/map_files:

7f2e13aef000-7f2e13af1000 -> /usr/local/share/ksm_preload/libksm_preload.so
7f2e13af1000-7f2e13cf0000 -> /usr/local/share/ksm_preload/libksm_preload.so
7f2e13cf0000-7f2e13cf1000 -> /usr/local/share/ksm_preload/libksm_preload.so

总是以下结果:

/sys/kernel/mm/ksm/pages_shared:0
/sys/kernel/mm/ksm/pages_sharing:0
/sys/kernel/mm/ksm/pages_to_scan:100
/sys/kernel/mm/ksm/pages_unshared:0
/sys/kernel/mm/ksm/pages_volatile:0
/sys/kernel/mm/ksm/run:1

LD 调试输出相当长https://pastebin.com/KRvKHXxn

apache 是否有某种针对 LD_PRELOAD 的保护?

是否有另一个优先级更高的动态库可以覆盖符号?

可能相关:https://stackoverflow.com/questions/13374240/why-ld-preload-doesnt-work-for-one-of-loaded-shared-libraries 尝试了解决方案UNSET_RTLD_DEEPBIND=1,没有变化

相关内容