【发布时间】:2012-04-23 17:09:03
【问题描述】:
基本情况:
我正在复制openSUSE 中的一些 NTFS 磁盘。每个都是 2 TB。当我这样做时,系统运行缓慢。
我的猜测:
我相信这可能是由于缓存。 Linux 决定丢弃有用的缓存(例如,KDE 4 膨胀、虚拟机磁盘、LibreOffice 二进制文件、Thunderbird 二进制文件等),而是用复制磁盘中的内容填充所有可用内存(总共 24 GB),这将只能读取一次,然后写入,不再使用。因此,每当我使用这些应用程序(或 KDE 4)时,都需要再次读取磁盘,并且再次从磁盘读取膨胀会导致事情冻结/打嗝。
由于缓存消失了,而且这些臃肿的应用程序需要大量缓存,这使得系统非常缓慢。
由于是USB,磁盘和磁盘控制器都不是瓶颈,所以使用ionice并不能让它更快。
我相信这是缓存,而不仅仅是主板太慢了,因为如果我停止复制所有内容,它仍然会运行一段时间不稳定,直到重新缓存所有内容。
如果我重新开始复制,它需要一分钟才能再次波涛汹涌。而且,我可以将它限制在 40 MB/s 左右,并且它再次运行得更快(不是因为它缓存了正确的东西,而是因为主板总线为系统磁盘提供了很多额外的带宽)。我可以完全接受主板的 I/O 能力被完全消耗(这是 100% 使用,这意味着 0% 的功率浪费这让我很高兴)而导致的性能损失,但我不能接受这种缓存机制在这方面表现得如此糟糕具体用例。
# free
total used free shared buffers cached
Mem: 24731556 24531876 199680 0 8834056 12998916
-/+ buffers/cache: 2698904 22032652
Swap: 4194300 24764 4169536
我也在 Ubuntu 上尝试过同样的事情,这反而会导致整个系统挂起。 ;)
澄清一下,我不是在问如何为“系统”腾出内存,而是为“缓存”腾出内存。我知道缓存内存会在需要时自动返回给系统,但我的问题是它没有保留用于缓存特定事物。
有没有办法告诉这些复制操作来限制内存使用,以便一些重要的东西保持缓存,因此任何减速都是正常磁盘使用的结果,而不是重新读取相同的常用文件?例如,是否有允许将每个进程/用户/文件系统的最大内存用作缓存/缓冲区的设置?
【问题讨论】:
-
顺便说一句,我正在使用 rsync,并且有很多磁盘(目前一次 8 个)。有些是在本地传输的,有些是使用 USB 3.0 传输的。有些是通过 1Gbps 网络传输的。
-
什么都不复制时:#free total used free shared buffers cached Mem: 24731556 24474096 257460 0 16478072 6342668 -/+ 缓冲区/缓存:1653356 23078200 交换:4194300 22564 4171736 .
标签: linux caching filesystems usb file-copying