如何处理阻塞 I/O 导致性能下降的问题?

如何处理阻塞 I/O 导致性能下降的问题?

我的计算机遇到一些严重的 I/O 问题。

软件:Kali-rolling、Linux x86-desktop-1 4.12.0-kali2-amd64 #1 SMP Debian 4.12.13-1kali2 (2017-10-03) x86_64 GNU/Linux。但我有各种内核,有库存的,也有定制的。

硬件:相关硬件如下。 Ryzen 1800X CPU、16 GiB RAM、配备最新 BIOS 的 MSI X370 SLI PLUS(版本 3.6,但我也尝试过其他三个)、M.2:Crucial® MX300 525GB M.2 SSD 和 256 GB Samsung SSD 840 PRO。

问题:首先从用户的角度来描述这个问题也许是最好的:

我正在复制很多小文件,例如 Linux 内核源代码树。这会导致速度大幅减慢,甚至像“ls”二进制文件或“dmesg”这样的简单命令也可能需要 15 秒或更长时间才能运行。整个系统在 I/O 方面冻结,任何需要任何形式 I/O 的事物都会阻塞,直到阻塞的事物允许它通过 I/O 队列。

我在执行以下操作时注意到了问题:

  • 通过网络播放来自 CIFS 资源的视频文件。这种形式的 I/O 可能会在视频流中引入一两秒的延迟。
  • 使用网络浏览器通过网络播放 MP3 文件可能会导致音频断断续续。
  • 在 SSD 或 M.2 设备上本地复制某些内容,尤其是当涉及许多小文件时。

这个问题自从我安装操作系统以来就开始出现并且一直存在。

我的推理以及我如何尝试解决这个问题:硬件应该能够同时处理多个 I/O 请求。认为这一切都是由有故障的 SSD/M.2 引起的想法似乎不合理,因为我尝试过 SSD 和物理上独立的 M.2 设备,它们都有相同的问题。此外,库存 kali 内核出现这个特定的 I/O 问题似乎也是不合理的,特别是因为我尝试了多个内核:4.9、4.12、4.13.2、4.13.10。我考虑过也许有些 BIOS 选项会影响此性能,但我找不到任何东西,无论如何,我正在运行设置默认值并尝试了多个 BIOS 版本,包括版本 3.4、3.5 和 3.6。

我检查了 dmesg 是否有任何 I/O 错误,没有。

我还考虑过 Linux 有多个 I/O 调度程序:

$ cat /sys/block/sda/queue/scheduler 
noop deadline [cfq] 

可以通过发出例如来更改调度程序

echo "noop" > /sys/block/sda/queue/scheduler

请参阅此问题以获取更多信息:https://stackoverflow.com/questions/1009577/selecting-a-linux-io-scheduler

但是,我尝试过 noop、deadline 和 CFQ,它们似乎根本不影响问题。

我还想检查非易失性设备的性能:

hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads: 1112 MB in  3.01 seconds = 369.69 MB/sec
hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads: 1122 MB in  3.00 seconds = 373.53 MB/sec

表现并没有什么惊人的,我实际上应该拥有更多。但即使具有这种类型的性能,这些问题也应该不存在。我不确定我遇到的问题是否与较差的 I/O 性能有关。

当我在同一系统上运行 Gentoo 时,我在 840 PRO 设备上得到了以下信息 ( hdparm -t):

510.82 MB/sec
524.05 MB/sec

我应该如何调试这个问题?任何人都清楚问题所在吗?

答案1

它没有解释发生了什么,但您可以尝试通过使用ionice驱动器操作和tc(流量整形)网络操作来解决问题。

相关内容