我的服务器上出现了一些奇怪的 I/O 活动,我不知道它来自哪里。
先介绍一下背景情况,由于磨损,我不得不更换服务器上的 NVMe(三星 PM81)。我没有注意到任何性能问题,但 SMART 报告说是时候更换了。我确实注意到设备上有一些不寻常的 IO 活动,但我认为这可能是由于设备磨损造成的,所以没多想。
现在,使用全新的 NVMe(三星 980 Pro)和从头安装的操作系统(Debian 10),IO 活动问题仍然存在。
/proc/diskstats
以下是1 分钟内的内容:
$ cat /proc/diskstats; sleep 1m; cat /proc/diskstats
259 0 nvme0n1 2323590 271 213032732 285413 43708052 69809516 16770577066 269903507 0 901057472 1159862364 0 0 0 0
259 1 nvme0n1p1 2006 0 7264 3665 2 0 2 0 0 44 3080 0 0 0 0
259 2 nvme0n1p2 74879 0 5283682 9424 2001773 386508 28620456 971285 0 455348 825152 0 0 0 0
259 3 nvme0n1p3 2246597 271 207737634 272318 40382341 69423008 16741956608 266611966 0 12038708 266043996 0 0 0 0
259 0 nvme0n1 2323590 271 213032732 285413 43710868 69817259 16771166530 269907653 0 901114568 1159920624 0 0 0 0
259 1 nvme0n1p1 2006 0 7264 3665 2 0 2 0 0 44 3080 0 0 0 0
259 2 nvme0n1p2 74879 0 5283682 9424 2002019 386548 28623272 971330 0 455376 825180 0 0 0 0
259 3 nvme0n1p3 2246597 271 207737634 272318 40384852 69430711 16742543256 266615967 0 12041324 266047732 0 0 0 0
如您所见,它报告nvme0n1
95% 以上的时间用于执行 IO ((901114568-901057472)/60000*100)... 但分区上的 IO 使用率几乎为零。那么 IO 在哪里进行呢?在分区表上吗?此外,读取所花费的时间 (0 毫秒) 加上写入所花费的时间 (4146 毫秒) 加起来不等于执行 I/O 所花费的时间 (57096 毫秒)。除了读取和写入,还有什么可做的?
设备上不再有任何分区或未分配的空间:
$ echo p | sudo fdisk /dev/nvme0n1
Welcome to fdisk (util-linux 2.33.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): Disk /dev/nvme0n1: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: Samsung SSD 980 PRO 2TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 0B698EB9-DD2E-4131-9730-4193DD9D5FB5
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 1953791 1951744 953M EFI System
/dev/nvme0n1p2 1953792 197265407 195311616 93.1G Linux filesystem
/dev/nvme0n1p3 197265408 3907028991 3709763584 1.7T Linux filesystem
Command (m for help):
SMART 也报告了错误,但如果我理解正确的话,它只是报告设备缺少某个功能,而不是功能问题:
$ sudo smartctl -a /dev/nvme0n1
smartctl 6.6 2017-11-05 r4594 [x86_64-linux-4.19.0-21-amd64] (local build)
Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Number: Samsung SSD 980 PRO 2TB
Serial Number: S69ENL0T610188X
Firmware Version: 5B2QGXA7
PCI Vendor/Subsystem ID: 0x144d
IEEE OUI Identifier: 0x002538
Total NVM Capacity: 2,000,398,934,016 [2.00 TB]
Unallocated NVM Capacity: 0
Controller ID: 6
Number of Namespaces: 1
Namespace 1 Size/Capacity: 2,000,398,934,016 [2.00 TB]
Namespace 1 Utilization: 1,736,883,855,360 [1.73 TB]
Namespace 1 Formatted LBA Size: 512
Namespace 1 IEEE EUI-64: 002538 b621a0ae58
Local Time is: Tue Sep 27 10:47:54 2022 CEST
Firmware Updates (0x16): 3 Slots, no Reset required
Optional Admin Commands (0x0017): Security Format Frmw_DL Self_Test
Optional NVM Commands (0x0057): Comp Wr_Unc DS_Mngmt Sav/Sel_Feat Timestmp
Maximum Data Transfer Size: 128 Pages
Warning Comp. Temp. Threshold: 82 Celsius
Critical Comp. Temp. Threshold: 85 Celsius
Supported Power States
St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat
0 + 8.49W - - 0 0 0 0 0 0
1 + 4.48W - - 1 1 1 1 0 200
2 + 3.18W - - 2 2 2 2 0 1000
3 - 0.0400W - - 3 3 3 3 2000 1200
4 - 0.0050W - - 4 4 4 4 500 9500
Supported LBA Sizes (NSID 0x1)
Id Fmt Data Metadt Rel_Perf
0 + 512 0 0
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02, NSID 0x1)
Critical Warning: 0x00
Temperature: 40 Celsius
Available Spare: 100%
Available Spare Threshold: 10%
Percentage Used: 0%
Data Units Read: 214,200 [109 GB]
Data Units Written: 16,891,230 [8.64 TB]
Host Read Commands: 2,350,427
Host Write Commands: 42,643,472
Controller Busy Time: 238
Power Cycles: 1
Power On Hours: 262
Unsafe Shutdowns: 0
Media and Data Integrity Errors: 0
Error Information Log Entries: 0
Warning Comp. Temperature Time: 0
Critical Comp. Temperature Time: 0
Temperature Sensor 1: 40 Celsius
Temperature Sensor 2: 55 Celsius
Read Error Information Log failed: NVMe Status 0x02
我也检查过了iotop
,但没有看到任何相关内容:
$ sudo iotop -aoPb -n 2 -d 60
unable to set locale, falling back to the default locale
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
Total DISK READ: 0.00 B/s | Total DISK WRITE: 36.82 K/s
Current DISK READ: 0.00 B/s | Current DISK WRITE: 46.88 K/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
649 be/3 root 0.00 B 84.00 K 0.00 % 0.07 % [jbd2/nvme0n1p3-]
396 be/3 root 0.00 B 40.00 K 0.00 % 0.05 % [jbd2/nvme0n1p2-]
31590 be/4 root 0.00 B 0.00 B 0.00 % 0.00 % [kworker/u48:0-flush-259:0]
4761 be/4 root 0.00 B 2.02 M 0.00 % 0.00 % minio server /data
733 be/4 root 0.00 B 12.00 K 0.00 % 0.00 % dcgm-exporter
737 be/4 root 0.00 B 8.00 K 0.00 % 0.00 % nscd
我猜这意味着 IO 是由内核本身执行的?
有人能帮我找出导致此 IO 活动的原因以及如何避免它吗?我不希望这个 NVMe 很快磨损并需要再次更换。
答案1
终于解开了谜团!
Linux 内核似乎存在错误。它会导致diskstats
报告某些存储设备的错误指标。
我将内核升级到 5.10.0( 上可用的版本buster-backports
),现在指标是正确的。
如果有人感兴趣的话,可以使用装有 Debian 10 的 t2.micro 和 t3.micro 实例在 AWS 上复制该问题。