我正在使用f3
自定义 Bash 脚本来大量测试 USB 闪存。
我遇到的一个常见问题是,一些有故障的驱动器会使所有健康驱动器的 IO 饿死,从而有效地拖延测试过程。
例如 - 当留下 50 个 USB 驱动器进行测试时,我经常在一小时后发现 48 个什么都不做,而 2 个在闪烁 LED。删除这两个驱动器突然恢复所有其他驱动器测试。
有时会出现更复杂的情况,其中 24 个驱动器停止运行,而其余驱动器似乎工作正常。除了一些驱动器在 20 分钟后没有任何进展。你把它们拔掉,剩下的就会恢复生机,测试继续进行。
但是 - 我还发现停止测试故障驱动器足以使其余驱动器恢复正常。
我正在寻找一种方法来找出哪些驱动器导致其他驱动器出现此文件操作阻塞,以便我可以在我的脚本中自动停止它们。
我一直在观察atop
, iostat
,htop
并dmesg
试图找到一个区分因素,但我看不到任何东西。我发现有所谓的usbmon
内核调试接口,虽然它太底层了,我真的不知道如何使用它。原始 USB 数据包没有告诉我任何信息。
我可以使用任何其他工具来判断哪些驱动器运行异常吗?
我使用f3write
和f3read
程序来测试驱动器。该f3write
程序创建 1GB 的文件,f3read
然后程序读取这些文件以识别过程中发生的任何数据损坏。
此外 - 这很奇怪,但是当存在行为不当的驱动器时,其余“健康”驱动器将完成对当前文件的工作。假设 - 写入或读取 1GB 大小的文件 - 但在移除异常驱动器之前不会创建新文件。这就像在存在“IO hog”驱动器的情况下无法打开新文件一样。
我能做些什么来区分它们?
我终于找到了一种方法来做到这一点。
这是一个 Bash 脚本,它将列出驱动器及其每秒的总读/写 IO 速率。如果一个驱动器或多个驱动器使其他驱动器的 IO 处于饥饿状态 - 它们可以被识别为此处具有最高数字的驱动器:
该脚本使用 /sys/block/sd*/stat 文件来显示系统中存在的每个块设备的 IO/sec。我不确定这些是什么单位,但该死的是否有效,这就是我所关心的。
这真是一场噩梦。使用 4 个 USB 集线器以 f3 对 40 个驱动器进行成像测试。然后一切都停止了,你不知道为什么。如果驱动器有 LED,通常那些让其余的 IO 挨饿的驱动器会闪烁,而其余的则不会——但许多闪存模块没有。所以在我发现这个之前,没有办法找出导致问题的原因。
请注意,这不是 atop 报告的驱动器读/写速率 - 这些读数对于此类行为不当的驱动器是不正确的。通常所有读数都为零,但使用上面的脚本,您可以区分讨厌的猪并将它们移除,以便其余的可以继续。
最后!
这是指示问题的典型输出:
这是一个相对健康的情况:
分布越均匀越好。也许计算平均值也会有所帮助。最大值和平均值之间的差异可能表明存在问题。
请注意,屏幕截图未显示 sda,因为我是从另一个版本的脚本中截取的,该脚本仅列出了我的大规模测试工具运行的驱动器。