如何在Docker容器内使用FIO时绕过内存缓存?[关闭]

taor4pac  于 2023-11-17  发布在  Docker
关注(0)|答案(2)|浏览(137)

**已关闭。**此问题为not about programming or software development。目前不接受回答。

此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site的主题相关,可以发表评论,说明在何处可以回答此问题。
5天前关闭。
Improve this question
我正在尝试使用灵活的IO工具在我的主机和Docker容器上对I/O性能进行基准测试。直接启用,以绕过内存缓存。结果是非常可疑的。docker的性能几乎比我的主机好50倍,这是不可能的。看起来docker根本没有绕过缓存。即使我用--privileged模式运行它。这是我在一个集装箱,有什么建议吗?

fio --name=seqread --rw=read --direct=1 --ioengine=libaio --bs=4k --numjobs=1 --size=10G --runtime=600  --group_reporting --output-format=json >/home/docker/docker_seqread_4k.json

字符串

o2g1uqev

o2g1uqev1#

结果非常可疑。docker的性能几乎比我的主机好50倍,这是不可能的。看起来docker根本没有绕过缓存。
如果你最好的情况下的延迟与最坏的情况下的延迟相比小得令人怀疑,那么你的怀疑很可能是有根据的,内核缓存仍然在发生。Asking for O_DIRECT is a hint not an order and the filesystem can choose to ignore it and use the cache anyway(请参阅“你要求直接I/O到文件系统中的文件,但是...”)。
如果你有选择并且对磁盘速度感兴趣,最好在容器外进行任何此类测试,当您不能/不想禁用缓存时,另一个选择是确保您执行的I/O至少是大小的两到三倍(在数量和使用的区域方面)RAM,因此大多数I/O不能通过缓冲区/缓存来满足(如果您正在执行写I/O,那么也可以执行类似end_fsync=1的操作)。
总之,docker使用的文件系统可能无法准确地完成您的请求(通过绕过缓存来测量磁盘速度,同时使用默认的docker文件系统)。

vql8enpb

vql8enpb2#

为什么Docker基准测试可能给予您期望的结果

默认情况下,Docker引擎使用OverlayFS [1][2]驱动程序在容器中存储数据。它从镜像中组装所有不同的层并使其可读。写入始终在“顶部”层完成,这是容器存储。
当对容器的文件系统执行读写操作时,您将通过Docker的overlay2驱动程序,通过OverlayFS内核驱动程序,通过您的文件系统驱动程序(例如ext4)并到达您的块设备。此外,作为Anon mentionedDIRECT/O_DIRECT只是一个提示,可能不会被您正在通过的任何层所遵守。

获取更准确的结果

要在Docker容器中获得准确的基准测试,您应该将卷挂载或change your storage driver写入未覆盖的卷挂载,例如Device Mapper driverZFS driver。Device Mapper驱动程序和P2P驱动程序都需要专用的块设备(您可能需要单独的硬盘驱动器),因此使用卷挂载可能是最简单的方法。

使用卷挂载

-v选项与位于主机上的块设备上的目录一起使用。

docker run -v /absolute/host/directory:/container_mount_point alpine

字符串

使用不同的Docker存储驱动

请注意,存储驱动程序必须在Docker守护程序(dockerd)上更改,并且不能针对每个容器进行设置。从文档中可以看到:
重要提示:当您更改存储驱动程序时,任何现有的映像和容器都将变得不可访问。这是因为新的存储驱动程序无法使用它们的图层。如果您还原更改,则可以再次访问旧的映像和容器,但使用新驱动程序提取或创建的任何映像和容器都将不可访问。
有了这个免责声明,您可以通过编辑daemon.json并重新启动dockerd来更改存储驱动程序。

{
  "storage-driver": "devicemapper",
  "storage-opts": [
    "dm.directlvm_device=/dev/sd_",
    "dm.thinp_percent=95",
    "dm.thinp_metapercent=1",
    "dm.thinp_autoextend_threshold=80",
    "dm.thinp_autoextend_percent=20",
    "dm.directlvm_device_force=false"
  ]
}

容器基准测试附加说明-内核

如果您试图比较不同风格的Linux,请记住Docker仍然在您的主机内核上运行。

相关问题