如何找到由磁盘 I/O 导致的速度缓慢的(软件/硬件)瓶颈?

如何找到由磁盘 I/O 导致的速度缓慢的(软件/硬件)瓶颈?

这是一个有点模糊的问题,对此我深表歉意,但正是由于这种模糊性,我才不确定如何对其进行有用的互联网搜索。

我遇到的问题是这样的:我有一台在大约 700 GB 的硬盘(不是 SSD)上运行 Linux 的机器,该硬盘格式化为几个 ext4 分区。该硬盘目前使用率为 89%。我遇到了这个问题,我想自从我买了那个硬盘以来,I/O 似乎是我机器的一大瓶颈。我会遇到一些简单的任务,比如切换应用程序、尝试访问任务栏、在浏览器中打开选项卡,延迟几秒或几十秒。窗口管理器本身或堆栈中的某些东西似乎切换或重新绘制窗口的速度很慢。

当我注意到这种滞后并检查“顶部”时,我总是看到磁盘 I/O 处于 100% 繁忙状态。(当机器没有出现这种滞后时,它并不总是 100% 繁忙。)忙于磁盘的进程可以是任何进程(我认为是 systemd-journald、firefox、Xorg?)运行特别密集的程序(我做了很多开发工作,经常将数百 ​​MB 的日志写入磁盘)似乎使这种情况变得更糟,即使在程序退出后也是如此。重新启动计算机似乎提供帮助(很难确定)。

总的来说,我想知道为什么会出现这种情况,因为我使用的是特定的硬件和软件,但(部分原因是我认为这是更好的提问方式)我想知道如何自己确定这一点。老实说,我不知道如何找出这些瓶颈在哪里,而且我不清楚这只是硬件不足的问题。

我愿意接受我的磁盘已经老旧需要更换的事实,而且我确信 SSD 无论如何都会有所帮助,但在花钱更换之前,我想确定情况确实如此。[特别是,我确实需要相当多的存储空间,而我真的负担不起全部使用 SSD。]

令我不确定的是:(1)如果我没记错的话,自从我买了磁盘(我想大约是 16 个月前)以来,我就遇到了这种问题,(2)我已经使用进行了基本的速度测试hdparm -Tt,在正常条件下,磁盘 I/O 速度似乎并不比其他装有硬盘的机器差,而其他机器的速度也没有那么慢。

我可以使用什么样的启发式方法、工具、基准等来找出为什么我的机器这么慢?

编辑:从各种工具中提取的有关我的机器的更多信息:

zeb@terabithia:~$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 698.7G  0 disk 
├─sda1   8:1    0 689.9G  0 part /
└─sda2   8:2    0   8.8G  0 part [SWAP]
sdb      8:16   0 111.8G  0 disk 
└─sdb1   8:17   0 111.8G  0 part /bridge

zeb@terabithia:~$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda1      710941560 600381824  74376176  89% /
/dev/sdb1      114854440  25834416  83142676  24% /bridge

zeb@terabithia:~$ inxi -F
System:    Host: terabithia Kernel: 4.19.118-1-MANJARO x86_64 bits: 64 Console: tty 42 Distro: Manjaro Linux 
Machine:   Type: Desktop Mobo: ASUSTeK model: M5A97 LE R2.0 v: Rev 1.xx serial: <root required> BIOS: American Megatrends 
           v: 2301 date: 01/06/2014 
CPU:       Topology: 8-Core model: AMD FX-8350 bits: 64 type: MCP L2 cache: 2048 KiB 
           Speed: 4113 MHz min/max: 1400/4000 MHz Core speeds (MHz): 1: 4113 2: 4114 3: 4113 4: 4113 5: 4112 6: 4113 7: 4113 
           8: 4113 
Drives:    Local Storage: total: 810.43 GiB used: 600.04 GiB (74.0%) 
           ID-1: /dev/sda vendor: Seagate model: ST3750640NS size: 698.64 GiB 
           ID-2: /dev/sdb vendor: HP model: SSD S700 120GB size: 111.79 GiB 
Partition: ID-1: / size: 678.01 GiB used: 573.12 GiB (84.5%) fs: ext4 dev: /dev/sda1 
           ID-2: swap-1 size: 8.80 GiB used: 2.24 GiB (25.4%) fs: swap dev: /dev/sda2 
Info:      Processes: 294 Uptime: 10d 17h 34m Memory: 7.69 GiB used: 2.00 GiB (26.1%) Init: systemd Shell: bash inxi: 3.0.37 

答案1

我会检查 RAM 是否已满以及交换空间是否正在被使用。

尝试: free -m 检查内存使用情况;

vmstat 1 5监控各种统计数据;so 和/或 si 列中的高值意味着发生了交换,也就是说操作系统使用的内存比您实际拥有的要多。

从您的描述来看,这很可能是物理 RAM 不足的症状,在获得更多信息之前我无法确定。在我看来,Linux 内存管理可以做得更好,在某些情况下,Linux 会保留大量磁盘缓存,我认为它应该删除这些缓存以腾出应用程序内存空间。如果您有大量交换,但也有大量缓冲区缓存,您可能需要尝试内核的交换设置(参考:https://www.howtogeek.com/449691/what-is-swapiness-on-linux-and-how-to-change-it/

另一方面,对于某些 HDD 型号,HDD 固件可能是罪魁祸首。您可能需要谷歌搜索您的 HDD 型号,例如,我在这里找到了固件更新:https://www.seagate.com/id/id/support/kb/firmware-update-for-st3250310ns-st3500320ns-st3750330ns-st31000340ns-207963en/ 但是在更新固件之前,请小心备份数据。

相关内容