快速背景;我有一个 10Gbit 文件服务器,带有六个运行 CentOS 8 的数据 SSD,我正在努力使线路饱和。如果我将带宽限制在 5 或 6Gbps,一切都很好。以下是来自 Cockpit 的一些图表,显示一切正常(约 850 个并发用户,5Gbps 上限)。
不幸的是,当我推得更高时,带宽会以巨浪波动。通常这是磁盘饱和(或 SATA 卡)的标志,在 Windows 机器上我已经解决了这样的问题:
- 打开“资源监视器”。
- 选择“磁盘”选项卡。
- 观看“队列长度”图表。任何队列长度稳定在 1 以上的磁盘/RAID 都是瓶颈。升级它或减少它的负载。
现在我在 CentOS 8 服务器上看到了这些症状,但我该如何找出罪魁祸首呢?我的 SATA SSD 分为三个软件 RAID0 阵列,如下所示:
# cat /proc/mdstat
Personalities : [raid0]
md2 : active raid0 sdg[1] sdf[0]
7813772288 blocks super 1.2 512k chunks
md0 : active raid0 sdb[0] sdc[1]
3906764800 blocks super 1.2 512k chunks
md1 : active raid0 sdd[0] sde[1]
4000532480 blocks super 1.2 512k chunks`
iostat
波动很大,通常有很高的 %iowait。如果我没看错,这似乎表明 md0 (sdb+sdc) 的负载最大。但这是瓶颈吗?毕竟,%util 远不及 100。
# iostat -xm 5
avg-cpu: %user %nice %system %iowait %steal %idle
7.85 0.00 35.18 50.02 0.00 6.96
Device r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 106.20 57.20 0.89 0.22 3.20 0.00 2.93 0.00 136.87 216.02 26.82 8.56 3.99 0.92 14.96
sde 551.20 0.00 153.80 0.00 65.80 0.00 10.66 0.00 6.75 0.00 3.44 285.73 0.00 0.64 35.52
sdd 571.60 0.00 153.77 0.00 45.80 0.00 7.42 0.00 6.45 0.00 3.40 275.48 0.00 0.63 35.98
sdc 486.60 0.00 208.93 0.00 305.40 0.00 38.56 0.00 20.60 0.00 9.78 439.67 0.00 1.01 49.10
sdb 518.60 0.00 214.49 0.00 291.60 0.00 35.99 0.00 81.25 0.00 41.88 423.52 0.00 0.92 47.88
sdf 567.40 0.00 178.34 0.00 133.60 0.00 19.06 0.00 17.55 0.00 9.68 321.86 0.00 0.28 16.08
sdg 572.00 0.00 178.55 0.00 133.20 0.00 18.89 0.00 17.63 0.00 9.81 319.64 0.00 0.28 16.00
dm-0 5.80 0.80 0.42 0.00 0.00 0.00 0.00 0.00 519.90 844.75 3.69 74.62 4.00 1.21 0.80
dm-1 103.20 61.40 0.40 0.24 0.00 0.00 0.00 0.00 112.66 359.15 33.68 4.00 4.00 0.96 15.86
md1 1235.20 0.00 438.93 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 363.88 0.00 0.00 0.00
md0 1652.60 0.00 603.88 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 374.18 0.00 0.00 0.00
md2 1422.60 0.00 530.31 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 381.72 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
avg-cpu: %user %nice %system %iowait %steal %idle
5.14 0.00 22.00 72.86 0.00 0.00
Device r/s w/s rMB/s wMB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 34.00 37.40 0.15 0.15 5.20 0.00 13.27 0.00 934.56 871.59 64.34 4.61 4.15 0.94 6.74
sde 130.80 0.00 36.14 0.00 15.00 0.00 10.29 0.00 5.31 0.00 0.63 282.97 0.00 0.66 8.64
sdd 132.20 0.00 36.35 0.00 14.40 0.00 9.82 0.00 5.15 0.00 0.61 281.57 0.00 0.65 8.62
sdc 271.00 0.00 118.27 0.00 176.80 0.00 39.48 0.00 9.52 0.00 2.44 446.91 0.00 1.01 27.44
sdb 321.20 0.00 116.97 0.00 143.80 0.00 30.92 0.00 12.91 0.00 3.99 372.90 0.00 0.91 29.18
sdf 340.20 0.00 103.83 0.00 71.80 0.00 17.43 0.00 12.17 0.00 3.97 312.54 0.00 0.29 9.90
sdg 349.20 0.00 104.06 0.00 66.60 0.00 16.02 0.00 11.77 0.00 3.94 305.14 0.00 0.29 10.04
dm-0 0.00 0.80 0.00 0.01 0.00 0.00 0.00 0.00 0.00 1661.50 1.71 0.00 12.00 1.25 0.10
dm-1 38.80 42.20 0.15 0.16 0.00 0.00 0.00 0.00 936.60 2801.86 154.58 4.00 4.00 1.10 8.88
md1 292.60 0.00 111.79 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 391.22 0.00 0.00 0.00
md0 951.80 0.00 382.39 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 411.40 0.00 0.00 0.00
md2 844.80 0.00 333.06 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 403.71 0.00 0.00 0.00
dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
同时服务器性能很差。SSH 上的每次击键都需要几秒钟的时间来注册,GNOME 桌面几乎没有响应,并且用户报告连接断开。我会显示 Cockpit 图表,但登录超时。限制带宽效果很好,但我想解锁其余的。那么如何识别瓶颈呢?我喜欢一些建议!
罪魁祸首是 sda,即 CentOS 磁性磁盘。大多数证据都指向那里。正如有人评论(并且似乎已删除),sda、dm-0 和 dm-1 上的等待时间看起来很可疑。果然,dm-0(root)和dm-1(swap)也在sda上。观察 iotop 运行,瓶颈似乎是由 Gnome 活动的快速闪现引发的,随后 kswapd (swap) 阻塞了工作。用“init 3”关闭 Gnome 取得了明显的进步,但如此强大的机器绝不会因空闲的登录屏幕而瘫痪。SMART 还在 sda 上报告了 8000 多个坏扇区。我的猜测是其中许多都在交换空间中,导致交换削弱了系统。
一个想法是将交换移动到另一个磁盘,但替换 sda 似乎更实用。我使用 CloneZilla 开始了磁盘克隆,但估计需要 3 个小时,并且全新安装会更快,所以我就这样做了。现在服务器运行良好!这是一个屏幕截图,显示了 1300 多个文件同时以 8Gbps 的速度传输,既美观又稳定。问题解决了!