Linux 磁盘访问减慢系统速度

ton*_*sid 6 linux performance hard-drive swap ubuntu-10.04

即使 CPU 负载低于 100%,我的系统也会变慢,我认为这是因为它正在写入交换分区。是的,我的交换分区与我的操作系统位于不同的磁盘上。我记得使用 ATA 磁盘的 Windows 出现这种类型的减速问题。它是通过使用DMA模式解决的。我不确定我的磁盘是否使用 DMA 模式。它们是 SATA 驱动器,所以我认为它们是。这是 hdparm 的输出

/dev/sda:
 multcount     =  0 (off)
 IO_support    =  1 (32-bit)
 readonly      =  0 (off)
 readahead     = 256 (on)
 geometry      = 182401/255/63, sectors = 2930277168, start = 0

ev/sdb:
 multcount     =  0 (off)
 IO_support    =  1 (32-bit)
 readonly      =  0 (off)
 readahead     = 256 (on)
 geometry      = 30401/255/63, sectors = 488397168, start = 0
Run Code Online (Sandbox Code Playgroud)

我最后一次看到这种类型的减速行为来自 Windows 3.1!

hdparm -i /dev/sda /dev/sdb 的输出是这样的:

/dev/sda:

 Model=ST31500541AS, FwRev=CC34, SerialNo=6XW0N2LJ
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
 BuffType=unknown, BuffSize=0kB, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=2930277168
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=yes: unknown setting WriteCache=enabled
 Drive conforms to: unknown:  ATA/ATAPI-4,5,6,7

 * signifies the current active mode


/dev/sdb:

 Model=HDT722525DLA380, FwRev=V44OA96A, SerialNo=VDB41BT4EUH03C
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=52
 BuffType=DualPortCache, BuffSize=7674kB, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=488397168
 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive conforms to: ATA/ATAPI-7 T13 1532D revision 1:  ATA/ATAPI-2,3,4,5,6,7

 * signifies the current active mode
Run Code Online (Sandbox Code Playgroud)

当系统变慢时,这是 free 的输出:

             total       used       free     shared    buffers     cached
Mem:       3538356    3057180     481176          0       8588     280412
-/+ buffers/cache:    2768180     770176
Swap:      5124692    1563140    3561552
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 16

你还没有问一个问题。我想你的意思是问“为什么我的系统慢”或“我怎样才能让它更快”,这两者都太模糊而无法回答。我将部分解决一个不那么雄心勃勃的问题,“我如何调查我的性能瓶颈”。

显然,当您的系统没有响应时,有很多磁盘活动。我的回答是基于此。

RAM和交换

无论您拥有多快的磁盘,交换都会很慢。要使交换明显更快,您无能为力。如果您的系统正在交换,唯一现实的解决方法是使用更少的内存,或者购买更多的内存。

解释输出 free

您可以使用该命令获取系统正在使用的内存量的快照free。它显示了这样的东西:

             total       used       free     shared    buffers     cached
Mem:       3538356    3057180     481176          0       8588     280412
-/+ buffers/cache:    2768180     770176
Swap:      5124692    1563140    3561552
Run Code Online (Sandbox Code Playgroud)
  • Memtotal图中(这里3538356,约为3.3GB)是可用于进程RAM的数量(由视频卡或内核使用这不包括存储器)。

    (使用 64 位内核的人可以跳过这一段。)由于 x86 架构的复杂性,内核有多种方式访问​​ RAM。现在,在实践中,您可以在两种模式之间进行选择:PAE模式,它允许内核使用高达 64GB 的 RAM;和非 PAE 模式,它只允许内核使用大约 3GB。非 PAE 模式存在的原因是 PAE 模式有内存使用开销,只有当您拥有超过 3GB 的 RAM 时才值得付出代价。有关 Ubuntu 用户应该阅读Ubuntu wiki 中PAE 页面

  • Memfree不使用数字显示多少内存的任何东西。它通常相当小(例如,在多 GB-RAM 系统上为 10-50MB),除非 RAM 未得到充分利用或系统刚刚启动。这里的数字相当高(450MB),这可能是因为最近关闭了一个使用大约那么多内存的应用程序。别着急,很快就会满的。

  • 标题行-/+ buffers/cache显示进程使用了​​多少内存,而不是磁盘缓存。在这里,我们看到只有大约 730MB 可用于缓存。那只是 RAM 的 20%,并不多。将大量 RAM 用于磁盘缓存对于保持系统响应非常重要。

  • 最后一行表示正在使用多少交换。即使 RAM 未满,使用一些交换也是正常的。Linux 会在磁盘空闲时预防性地复制内存以进行交换,以防在稍后磁盘可能不空闲时需要内存。

    Linux 经常将进程内存移动到交换区,以便为磁盘缓存腾出空间。这是正常的系统行为,试图调低它可能会导致您的系统变慢。有一个关于 Linux 应该交换多少的可调设置,称为vm.swapiness; 如果您尝试使用它,请务必尝试增加和减少交换性

    在我们的示例free输出中,我们看到大约 40% 的进程内存在交换中。这是否会损害性能取决于该内存的用途。如果它是一个当前未使用的大型应用程序,它不会受到伤害。如果正在使用的部分进程被交换,系统可能会非常无响应。

那么这些内存有什么用呢?

分析内存使用情况很困难。对于每个进程,您可以衡量它分配了多少地址空间;您可以(尝试)测量它在给定时间主动使用的内存量;您必须跟踪文件支持的内存(例如,从进程可执行文件和库加载的代码)和非文件支持的内存(进程的堆栈和堆)。当然,进程之间共享大量内存,因此谈论给定进程使用了​​多少内存并没有多大意义。

你可以使用命令行工具,如内存使用的图片tophtop,或任意数量的图形化系统监控和性能米。对于htop,如果您对内存使用感兴趣,请打开“设置/显示”选项中的“隐藏内核线程”和“隐藏用户线程”选项。

top或的显示中htop,相关的列是VIRTRESVIRT指示进程分配了多少地址空间,包括共享和已分配但未使用的内存;不要太担心。RES表示进程当前使用了多少 RAM(即,不计算交换)。

查看您的系统是否正在积极交换的一种方法是top在您工作时观看显示。如果您看到RES某些进程的数字上升而其他进程的数字下降,则意味着正在交换后一个进程以为前一个进程腾出空间。如果这种情况经常发生,您需要更多 RAM 才能适应您的使用模式。

磁盘速度

根据过去的经验,您怀疑您的磁盘没有使用最快的可用访问模式。但是 Linux 不是 Windows(尤其是在过去常常需要第三方驱动程序)。安装 Linux 发行版几乎总是为您提供所有外围设备的最快访问模式,这些外围设备不会导致崩溃或数据丢失。(视频驱动程序有点例外。)

您可以使用 确认系统正在使用的DMA 模式hdparm -i。例如,您的磁盘都显示UDMA modes: … *udma6,这意味着它们正在使用最快的可用模式。(一般来说,UDMA 比 DMA 快,比 PIO 快;对于数字部分,越高越快。)

您可以使用 来衡量磁盘的原始吞吐量hdparm -t。该数字本身并不直接提供有关系统响应速度的信息,但比较两个磁盘或同一磁盘上两种访问模式的速度可能很有用。

有时,计算机的BIOS允许您为磁盘选择不同的操作模式。当第一批 SATA 磁盘问世时,许多操作系统(如 Windows 和 Linux)都没有配备合适的驱动程序。因此,BIOS 提供了使用 PATA 仿真模式的选项,该模式原则上更慢但更兼容。当时,无论如何,磁盘的速度都不足以使 SATA 连接饱和,但现在它们可能会饱和。兼容设置通常称为“IDE”或“ATAPI”,而更快的设置通常称为“AHCI”。

磁盘错误

与磁盘相关的速度减慢的一种可能来源是磁盘出现故障并且系统需要多次重试访问它。有时,速度变慢是第一个表现,而以不可读文件形式出现的实际错误会在稍后出现。

要查看是否是这种情况,请查看内核日志,通常在/var/log/kern.log. 如果你看到像这样的线条

end_request: I/O error, dev sda, sector 123456789
ata3.00: error: { UNC }
Run Code Online (Sandbox Code Playgroud)

确保您的备份是最新的并立即更换您的磁盘。请注意,上面的几行只是示例,错误消息有很多种。

您可以使用SMART 监控工具获取有关磁盘健康状况的报告。