
我正在嘗試使用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
,沒有改變