【问题标题】:MongoDB Readahead warningMongoDB 预读警告
【发布时间】:2020-11-28 00:09:58
【问题描述】:

我在启动 MongoDB shell 时收到此警告:

3 月 20 日星期三 22:40:49.850 [initandlisten]

3 月 20 日星期三 22:40:49.850 [initandlisten] ** 警告:预读 /data 设置为 2048KB

3 月 20 日星期三 22:40:49.850 [initandlisten] ** 我们建议将其设置为 256KB(512 个扇区)或更少

3 月 20 日星期三 22:40:49.850 [initandlisten] ** http://dochub.mongodb.org/core/readahead

我用过:

df /数据

要查找我的数据安装并随后使用的驱动器所在的位置:

sudo blockdev --setra 256 /dev/mapper/vg0-data

将预读设置为指定的 256。我已经确认这适用于:

sudo blockdev --getra /dev/mapper/vg0-data

但是,我在启动 shell 时仍然遇到同样的错误?

更新

我已经重新启动了 mongodb 服务器实例,但仍然收到此错误。

更新 2

我的 linux 服务器托管在 AWS 上,因此使用虚拟卷。我已将所有这些卷的预读值设置为 256,但仍然收到此错误。

更新 3

这是 MongoDB 主实例的 blockdev --report

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0      8589934592   /dev/xvda1
rw   256   512  4096          0     10737418240   /dev/xvdh8
rw   256   512  4096          0     10737418240   /dev/xvdh7
rw   256   512  4096          0     10737418240   /dev/xvdh6
rw   256   512  4096          0     10737418240   /dev/xvdh5
rw   256   512  4096          0     10737418240   /dev/xvdh4
rw   256   512  4096          0     10737418240   /dev/xvdh3
rw   256   512  4096          0     10737418240   /dev/xvdh2
rw   256   512  4096          0     10737418240   /dev/xvdh1
rw  4096   512  4096          0     42944430080   /dev/md127
rw  4096   512  4096          0     38646317056   /dev/dm-0
rw  4096   512  4096          0      2143289344   /dev/dm-1
rw  4096   512  4096          0      2143289344   /dev/dm-2

这是 MongoDB 的辅助实例的 blockdev --report

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0      8589934592   /dev/xvda1
rw   256   512  4096          0     10737418240   /dev/xvdh8
rw   256   512  4096          0     10737418240   /dev/xvdh7
rw   256   512  4096          0     10737418240   /dev/xvdh6
rw   256   512  4096          0     10737418240   /dev/xvdh5
rw   256   512  4096          0     10737418240   /dev/xvdh4
rw   256   512  4096          0     10737418240   /dev/xvdh3
rw   256   512  4096          0     10737418240   /dev/xvdh2
rw   256   512  4096          0     10737418240   /dev/xvdh1
rw  4096   512  4096          0     42944430080   /dev/md127
rw  4096   512  4096          0     38646317056   /dev/dm-0
rw  4096   512  4096          0      2143289344   /dev/dm-1
rw  4096   512  4096          0      2143289344   /dev/dm-2

这是 MongoDB 仲裁实例的 blockdev --report

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0      8589934592   /dev/xvda1

【问题讨论】:

    标签: linux mongodb


    【解决方案1】:

    答案是在启动脚本中运行blockdev --setra。每次系统重新启动时,预读值都会恢复为默认值。

    在我的例子中,我刚刚弄清楚了 blockdev --report 的逻辑驱动器是什么,然后我在 init.d 中 MongoDB 启动脚本的“开始”部分中的每个驱动器上运行 blockdev --setra

    希望这可以帮助遇到类似问题的其他人。

    【讨论】:

    • 它是否必须在启动脚本中...如果我停止 mongo 会起作用吗...然后 blockdev --setra 和重新启动 mongo ........那会不会起作用?请告诉我为什么?
    • 直到您重新启动系统。我想你会同意,每次重新启动系统后都必须运行 blockdev --setra 并不理想。
    【解决方案2】:

    你可以这样做:

    echo 'ACTION=="add", KERNEL=="xvdb", ATTR{bdi/read_ahead_kb}="64"' | sudo tee -a /etc/udev/rules.d/85-ebs.rules
    echo 'ACTION=="add", KERNEL=="xvdc", ATTR{bdi/read_ahead_kb}="64"' | sudo tee -a  /etc/udev/rules.d/85-ebs.rules
    echo 'ACTION=="add", KERNEL=="xvdd", ATTR{bdi/read_ahead_kb}="64"' | sudo tee -a /etc/udev/rules.d/85-ebs.rules
    echo 'ACTION=="add", KERNEL=="xvde", ATTR{bdi/read_ahead_kb}="64"' | sudo tee -a   /etc/udev/rules.d/85-ebs.rules
    echo 'ACTION=="add", KERNEL=="dm-0", ATTR{bdi/read_ahead_kb}="64"' | sudo tee -a /etc/udev/rules.d/85-ebs.rules
    echo 'ACTION=="add", KERNEL=="dm-1", ATTR{bdi/read_ahead_kb}="64"' | sudo tee -a /etc/udev/rules.d/85-ebs.rules
    echo 'ACTION=="add", KERNEL=="dm-2", ATTR{bdi/read_ahead_kb}="64"' | sudo tee -a /etc/udev/rules.d/85-ebs.rules
    echo 'ACTION=="add", KERNEL=="md127", ATTR{bdi/read_ahead_kb}="64"' | sudo tee -a /etc/udev/rules.d/85-ebs.rules
    

    其中 KERNEL=="" 是您的 HDD 设备

    然后在重新启动时,一切都会正确设置

    rw   256   512  4096          0     42949672960   /dev/xvda1
    rw   128   512  4096          0    214748364800   /dev/xvdc
    rw   128   512  4096          0    214748364800   /dev/xvde
    rw   128   512  4096          0    214748364800   /dev/xvdd
    rw   128   512  4096          0    214748364800   /dev/xvdb
    rw   128   512  4096          0    429227769856   /dev/md127
    rw   128   512  4096          0    343379279872   /dev/dm-0
    rw   128   512  4096          0     42920312832   /dev/dm-1
    rw   128   512  4096          0     42920312832   /dev/dm-2
    

    【讨论】:

    • 请记住 ATTR{bdi/read_ahead_kb} - 是以 Kb 为单位的值,因此您需要将 RAH 所需的块数除以 2
    【解决方案3】:

    /usr/lib/tuned/throughput-performance/tuned.conf上将内部预读值修改为128

    在centos7上

    【讨论】:

    • 之后你应该运行:tuned-adm profile no-thp
    【解决方案4】:

    如果数据文件在/data 中,但这些文件不在指定的设备上,则在/dev/mapper/vg0-data 上设置正确的预读将无效。

    blockdev 命令应该针对设备运行/数据安装自:sudo blockdev --setra 256 /dev/<dev where data lives>

    【讨论】:

    • 因此数据所在的位置将是对 /dev/ 中驱动器的引用。在我的情况下 /dev/sd1-8。我已将所有驱动器的预读值设置为 256,但仍然没有运气。
    • 你能用blockdev --report的输出更新你的问题吗?
    【解决方案5】:

    我已经编写了一个初始化脚本来为我设置/取消设置:

    readahead initscript

    【讨论】:

    • 您回答的链接已不存在
    • 断开的仅链接答案
    • 已修复,对此感到抱歉
    猜你喜欢
    • 2019-10-31
    • 2021-07-12
    • 1970-01-01
    • 2018-05-13
    • 2020-11-11
    • 2019-01-25
    • 2019-02-12
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多