问题
上周六拷贝磁盘数据顺带看了下用了快一年的970 EVO Plus 500GB
,发现了一个不得了的事情。通过smartctl -a /dev/nvme0n1
看到读取数据单元为1.51 TB
, 写入数据单元为70.9 TB
。为何写入会比读取高这么多!
分析
具体看看smartctl
返回了些什么
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
root@h3:~# smartctl -a /dev/nvme0n1 smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.15.0-106-generic] (local build) Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org === START OF INFORMATION SECTION === Model Number: Samsung SSD 970 EVO Plus 500GB Serial Number: S*************P Firmware Version: 1B2QEXM7 PCI Vendor/Subsystem ID: 0x144d IEEE OUI Identifier: 0x002538 Total NVM Capacity: 500,107,862,016 [500 GB] Unallocated NVM Capacity: 0 Controller ID: 4 Number of Namespaces: 1 Namespace 1 Size/Capacity: 500,107,862,016 [500 GB] Namespace 1 Utilization: 134,237,945,856 [134 GB] Namespace 1 Formatted LBA Size: 512 Local Time is: Mon Jun 15 09:30:17 2020 CST Firmware Updates (0x16): 3 Slots, no Reset required Optional Admin Commands (0x0017): Security Format Frmw_DL *Other* Optional NVM Commands (0x005f): Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat *Other* Maximum Data Transfer Size: 512 Pages Warning Comp. Temp. Threshold: 85 Celsius Critical Comp. Temp. Threshold: 85 Celsius Supported Power States St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat 0 + 7.80W - - 0 0 0 0 0 0 1 + 6.00W - - 1 1 1 1 0 0 2 + 3.40W - - 2 2 2 2 0 0 3 - 0.0700W - - 3 3 3 3 210 1200 4 - 0.0100W - - 4 4 4 4 2000 8000 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: 50 Celsius Available Spare: 100% Available Spare Threshold: 10% Percentage Used: 5% Data Units Read: 2,961,897 [1.51 TB] Data Units Written: 138,624,034 [70.9 TB] Host Read Commands: 32,871,818 Host Write Commands: 3,360,464,283 Controller Busy Time: 3,161 Power Cycles: 47 Power On Hours: 7,880 Unsafe Shutdowns: 33 Media and Data Integrity Errors: 0 Error Information Log Entries: 87 Warning Comp. Temperature Time: 0 Critical Comp. Temperature Time: 0 Temperature Sensor 1: 50 Celsius Temperature Sensor 2: 46 Celsius Error Information (NVMe Log 0x01, max 64 entries) No Errors Logged |
这个磁盘通电7880小时,大概是328天,通断电47次,比较符合实际。机器一般都一直开着,除非遇到更新与断电的情况。那么接下来应该如何查看写入高的问题呢?
这个磁盘平时我在执行业务时并不会进行大的写入,都是日常操作,所以这样分析看来,观察一段时间实际写入的情况会比较有效。于是我打开了iotop
,关注持续写入的动作,发现大概有这么两个地方会不断的写入到磁盘
- etcd基本上每隔几秒钟就会写入大概100KB+的数据
- jbd2会每隔5s进行写入,数据量与etcd的量类似
经过搜索,jbd2其实是一个内核线程,专门给ext4分区提供已写入脏缓冲数据定期的强制同步写入的服务。这个服务默认的频率是5s一次,与我们的观察类似。而写入的数据,基本就是从etcd产生的。
我们根据已知数据估算下平均写入的IOPS大概是多少。3,360,464,283
次写入在7880
小时内完成,所以平均一下每秒钟是118
次写入。经过搜索etcd典型单连接情况下需要每秒钟50次IO,这么看量级是对的,所以基本可以确定是etcd的问题了。
解决
接下来就比较简单了。看了下etcd的启动和使用者,居然是microk8s
,一个我之前安装上用来学习k8s的组件。。。于是果断用snap
禁用掉这个microk8s
。。。然后使用iotop
观察,写入明显降低,仅剩5s一次的jbd2同步写入,但是数据量远小于之前。
延伸
这里提到了jbd2会定时的同步脏缓冲数据到磁盘,默认是5s一次。由于这个盘我平时不经常写入,由于未及时同步导致丢数据的概率不大,所以我这里可以通过延长强制同步的间隔来再次减少写入的频率。这里是通过修改/etc/fstab
,在mount options
一列加入commit=600
,即
1 2 3 4 5 6 7 8 9 10 |
# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/nvme0n1p2 during installation UUID=a0712857-****-****-****-b500cb9c009d / ext4 discard,noatime,commit=600,errors=remount-ro 0 1 |
然后保存后重启,再次通过iotop查看,jbd2的写入频率也明显降低。本次问题解决。