我正在尝试使用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
,没有变化