armbian上的uas问题解决
背景
上文中用到了SSD硬盘做为N1盒子的外接磁盘。使用中会遇到卡顿的问题,即连接几十秒没有反应,然后又恢复正常的现象。
调查
通过vmstat可以看到,卡顿时,cpu的wa值为25~75,正常值为0,如下:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 167680 1258412 7088 169088 0 1 34 5 146 71 1 0 98 1 0
4 0 167680 1257908 7224 169892 0 0 0 0 2292 3621 77 4 19 0 0
3 0 167680 1256648 7348 170732 0 0 0 0 2415 3961 71 4 25 0 0
1 0 167680 1248080 7640 179308 0 0 0 0 1739 2556 79 4 16 0 0
0 0 167680 1239764 7868 186908 0 0 0 0 513 676 6 2 92 0 0
0 0 167680 1239764 7868 186908 0 0 0 0 345 538 0 0 99 0 0
0 0 167680 1239764 7880 186920 4 0 4 449 579 884 1 0 95 4 0
0 0 167680 1239764 7880 186920 0 0 0 0 468 716 2 0 98 0 0
0 0 167680 1239764 7880 186920 0 0 0 0 391 603 0 0 99 0 0
0 0 167680 1239764 7880 186920 0 0 0 363 385 582 0 0 100 0 0
0 0 167680 1239796 7880 186920 0 0 0 0 495 788 0 0 99 0 0
0 0 167680 1239732 7880 186920 0 0 0 467 425 650 0 0 99 0 0
0 0 167680 1239480 7880 186920 0 0 0 0 440 672 2 0 98 0 0
1 0 167680 1238972 7880 186924 0 0 0 457 373 535 2 0 97 0 0
0 1 167680 1238560 7880 186928 0 0 0 313 385 596 0 0 95 5 0
0 1 167680 1238560 7880 186928 0 0 0 0 510 828 0 0 75 25 0
0 1 167680 1238560 7880 186928 0 0 0 0 476 756 1 0 74 25 0
0 1 167680 1238560 7880 186928 0 0 0 0 347 543 0 0 75 25 0
0 2 167680 1238560 7880 186920 3 0 3 0 373 591 0 0 68 32 0
0 2 167680 1238560 7880 186928 0 0 0 0 338 536 0 0 50 50 0
0 2 167680 1238056 7880 186928 0 0 0 0 585 939 0 0 50 50 0
0 3 167680 1238056 7880 186924 1 0 1 0 434 680 1 0 50 50 0
0 3 167680 1238056 7880 186928 0 0 0 0 369 578 0 0 50 50 0
0 4 167680 1238056 7880 186928 1 0 1 0 346 542 0 0 29 70 0
0 4 167680 1238056 7880 186928 0 0 0 0 579 955 0 0 25 75 0
0 0 167680 1238536 7880 186904 17 0 17 5313 596 848 0 1 81 17 0
同时,在dmesg中可见:
[Apr 6 17:52] sd 0:0:0:0: [sda] tag#7 uas_eh_abort_handler 0 uas-tag 2 inflight: CMD
[ +0.000014] sd 0:0:0:0: [sda] tag#7 CDB: opcode=0x2a 2a 00 01 c9 d2 00 00 00 30 00
[ +0.023985] scsi host0: uas_eh_device_reset_handler start
[ +0.000059] usb 1-2: cmd cmplt err -2
[ +0.128099] usb 1-2: reset high-speed USB device number 2 using xhci-hcd
[ +0.151516] scsi host0: uas_eh_device_reset_handler success
初步判断出是linux内核对uas移动硬盘支持的不好。
USB驱动
确认使用了uas驱动。
# lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/0p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/2p, 480M
|__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=uas, 480M
由于N1盒子不支持USB3.0,但是还是使用了uas驱动。所以可能是这个原因,我们来禁用掉UAS。
禁用UAS
编辑文件 /boot/uEnv.ini
,修改如下:
dtb_name=/dtb/amlogic/meson-gxl-s905d-phicomm-n1-new.dtb
bootargs=root=LABEL=ROOTFS rootflags=data=writeback rw console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 usb-storage.quirks=1d6b:0003:u,152d:0578:u,1d6b:0002:u
其中末尾的 usb-storage.quirks=1d6b:0003:u,152d:0578:u,1d6b:0002:u
为新加入的,其中的A1:A2:u, A3:A4:u, A5:A6:u中的Axx系统,对应于 lsusb
中的结果
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
重启后,可以发现已经不现使用uas驱动了。
$ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/0p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/2p, 480M
|__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 480M