我通过google搜索过,但没有找到任何关于MD raid1的读平衡算法的信息。
几年前,我可能在某处读到它用来hashing the process id确定它使用哪个设备,但我不确定。
我在 raid1 之上安装了 KVM 虚拟化 + LVM,并且多次目睹从多个虚拟机读取数据到同一个磁盘,利用率达到 100%,而 raid1 中的另一个磁盘处于空闲状态。(通过 iostat -x)
编辑:问题还与虚拟机内的多个进程有关。即使在虚拟机内部也会发生读取平衡吗?
读数是否平衡?如果是的话通过什么算法?
我问的原因是因为我目前正在两种变体之间做出选择
第二种变体使用更多的CPU,但这不是问题。
我正在尝试在 Docker 内使用ksm_preload for 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
Run Code Online (Sandbox Code Playgroud)
我还尝试设置/etc/apache2/envvars工作进程:
export LD_DEBUG=all
export LD_PRELOAD=/usr/local/share/ksm_preload/libksm_preload.so
Run Code Online (Sandbox Code Playgroud)
父进程获取映射的库,但子工作进程则不获取。
父进程的/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
Run Code Online (Sandbox Code Playgroud)
总是出现以下结果:
/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
Run Code Online (Sandbox Code Playgroud)
LD 调试输出相当长https://pastebin.com/KRvKHXxn
apache 有某种针对 LD_PRELOAD 的保护吗?
是否可能有另一个具有更高优先级的动态库覆盖符号?
也许相关:/sf/ask/936196831/
尝试了解决方案UNSET_RTLD_DEEPBIND=1,没有变化