基本情况:
我在openSuSE中复制一些NTFS磁盘.每个都是2TB.当我这样做时,系统运行缓慢.
我的猜测:
我相信这可能是由于缓存.Linux决定丢弃有用的缓存(例如kde4膨胀,虚拟机磁盘,LibreOffice二进制文件,Thunderbird二进制文件等),而是用复制磁盘中的东西填充所有可用内存(总共24 GB),这些内容只读一次,然后写,再也没用过.因此,每当我使用这些应用程序(或kde4)时,需要再次读取磁盘,并再次读取磁盘上的膨胀使得事情冻结/打嗝.
由于缓存消失以及这些膨胀的应用程序需要大量缓存的事实,这使得系统非常慢.
由于它是USB,磁盘和磁盘控制器不是瓶颈,因此使用ionice不会使它更快.
我相信这是缓存,而不仅仅是主板太慢,因为如果我停止一切复制,它仍会运行一段时间,直到它重新读取所有内容.如果我重新启动复制,它需要一分钟才能再次出现波动.但是,我可以将它限制在大约40 MB/s,并且它再次运行得更快(不是因为它具有正确的缓存,而是因为主板总线为系统磁盘提供了大量额外带宽).我可以完全接受主板的IO功能被完全消耗的性能损失(100%使用,意味着0%的浪费功率让我开心),但我不能接受这种缓存机制在这个特定用途中表现如此糟糕案件.
# free
total used free shared buffers cached
Mem: 24731556 24531876 199680 0 8834056 12998916
-/+ buffers/cache: 2698904 22032652
Swap: 4194300 24764 4169536
Run Code Online (Sandbox Code Playgroud)
我也在Ubuntu上做了同样的事情,这导致整个系统挂起.;)
为了澄清,我不是要求如何为"系统"留出内存,而是为了"缓存".我知道缓存内存会在需要时自动返回给系统,但我的问题是它不会保留用于缓存特定的东西.
题:
有没有办法告诉这些复制操作限制内存使用,所以一些重要的事情仍然被缓存,因此任何减速是由于正常的磁盘使用而不重读相同的常用文件?例如,是否允许将每个进程/用户/文件系统的最大内存设置用作缓存/缓冲区?
我正在使用gdb和一些共享库.我可以让gdb进入我自己的共享库,但不是第三方库.
当使用gdb时,我希望"s"(步骤)进入第三方库并向我展示它在这些opj_*函数中执行的行,而不是仅仅转到我自己的共享库代码中的下一行.
我很确定我在编译期间只是遗漏了一些东西,与链接有关(让gcc将一些调试标志传递给ld),但我不知道它是什么,或者在运行gdb时告诉它在哪里调试符号是.
以下是详细信息:
我安装了openjpeg库,调试信息和开发包.
# zypper search -si openjpeg
Loading repository data...
Reading installed packages...
S | Name | Type | Version | Arch | Repository
--+--------------------------+---------+-----------+--------+-----------
i | libopenjpeg2_0 | package | 2.0.0-1.4 | x86_64 | packman
i | libopenjpeg2_0-debuginfo | package | 2.0.0-1.4 | x86_64 | packman
i | openjpeg2-devel | package | 2.0.0-1.4 | x86_64 | packman
# rpm -ql libopenjpeg2_0
/usr/lib64/libopenjpeg.so.2.0
/usr/lib64/libopenjpeg.so.2.0.0
# rpm -ql openjpeg2-devel
/usr/include/openjpeg-2.0
/usr/include/openjpeg-2.0/openjpeg.h
/usr/lib64/libopenjpeg.so
/usr/lib64/openjpeg-2.0
/usr/lib64/openjpeg-2.0/OpenJPEGConfig.cmake
/usr/lib64/openjpeg-2.0/OpenJPEGTargets-release.cmake
/usr/lib64/openjpeg-2.0/OpenJPEGTargets.cmake
# rpm …Run Code Online (Sandbox Code Playgroud)