AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 484900
Accepted
unfa
unfa
Asked: 2018-11-30 04:24:24 +0800 CST2018-11-30 04:24:24 +0800 CST 2018-11-30 04:24:24 +0800 CST

检测行为不端的 USB 闪存设备,阻止其他设备的 IO

  • 772

我正在使用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”驱动器的情况下无法打开新文件一样。

我能做些什么来区分它们?

linux usb
  • 1 1 个回答
  • 113 Views

1 个回答

  • Voted
  1. Best Answer
    unfa
    2019-02-15T01:45:47+08:002019-02-15T01:45:47+08:00

    我终于找到了一种方法来做到这一点。

    这是一个 Bash 脚本,它将列出驱动器及其每秒的总读/写 IO 速率。如果一个驱动器或多个驱动器使其他驱动器的 IO 处于饥饿状态 - 它们可以被识别为此处具有最高数字的驱动器:

    #!/bin/bash
    # hogs.sh - by Tobiasz 'unfa' Karoń - identify IO hogs in the system
    
    rm hogs.a hogs.b 2>/dev/null
    
    while [ 1=1 ]; do
        mv hogs.a hogs.b 2>/dev/null # store old data and make room for new data
    
        for i in /sys/block/sd*; do # cycle through all block devices
                    # sum two last fields of the stat data and put that into a file along with the drive handle
                    echo $(echo -n "$i" | cut -d'/' -f4; cat "$i/stat" | xargs| cut -d' ' -f 10-11 | tr ' ' '+' | bc) >> hogs.a
        done
    
        # sort files
        sort hogs.a > hogs.a2
        sort hogs.b > hogs.b2
        join hogs.a2 hogs.b2 > hogs.c # combine previous and current data into one file so we can calculate a difference
    
        rm hogs.d 2>/dev/null
        while read line; do
        echo "$(echo "$line" | cut -d' ' -f1) $(echo "$line" | cut -d' ' -f 2- | tr ' ' '-' | bc)" >> hogs.d
        done < hogs.c
    
        sort hogs.d > hogs # sort for the final output
    
        echo "max $(cat hogs | cut -d' ' -f2 | sort -n | tail -n1)" >> hogs # add the highest value
        echo "min $(cat hogs | cut -d' ' -f2 | sort -n | head -n1)" >> hogs # add the lowest value
    
        clear
        cat hogs # print the final output
        sleep 1
    
    done
    

    该脚本使用 /sys/block/sd*/stat 文件来显示系统中存在的每个块设备的 IO/sec。我不确定这些是什么单位,但该死的是否有效,这就是我所关心的。

    这真是一场噩梦。使用 4 个 USB 集线器以 f3 对 40 个驱动器进行成像测试。然后一切都停止了,你不知道为什么。如果驱动器有 LED,通常那些让其余的 IO 挨饿的驱动器会闪烁,而其余的则不会——但许多闪存模块没有。所以在我发现这个之前,没有办法找出导致问题的原因。

    请注意,这不是 atop 报告的驱动器读/写速率 - 这些读数对于此类行为不当的驱动器是不正确的。通常所有读数都为零,但使用上面的脚本,您可以区分讨厌的猪并将它们移除,以便其余的可以继续。

    最后!

    这是指示问题的典型输出:

    在此处输入图像描述

    这是一个相对健康的情况:

    在此处输入图像描述

    分布越均匀越好。也许计算平均值也会有所帮助。最大值和平均值之间的差异可能表明存在问题。

    请注意,屏幕截图未显示 sda,因为我是从另一个版本的脚本中截取的,该脚本仅列出了我的大规模测试工具运行的驱动器。

    • 1

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve