如果您打开 的defragment部分btrfs-filesystem(8),您将看到以下开发人员留下的不祥铭文:
警告:使用 Linux 内核版本 < 3.9 或 ? 3.14-rc2 以及 Linux 稳定内核版本?3.10.31,?3.12.12 还是?3.13.4 将打破 COW 数据的 ref-links(例如使用 复制的文件
cp --reflink、快照或去重数据)。根据断开的引用链接,这可能会导致空间使用量的显着增加。
这听起来很可怕。一个卖点btrfs是它能够在不复制所有内容的情况下创建快照。我主要创建只读快照。
只读快照的文件是否也算作“COW-data”,或者父子卷重复数据删除会在不使磁盘空间膨胀的情况下继续存在吗?
我在跑步Fedora 26。
这是我的算法教授给的一个非常奇怪的作业。作业说:
C 中的内存碎片:
设计、实现和执行执行以下操作的 C 程序: 为3m每个数组大小为 800,000 个元素的序列分配内存;然后它显式地释放所有偶数数组并分配一个m大小为 900,000 个元素的数组序列。测量您的程序分配第一个序列和第二个序列所需的时间。选择m耗尽程序可用的几乎所有主内存。”
这样做的总体目标是对内存进行分段,然后请求比作为连续块可用的内存稍多的内存,从而迫使操作系统压缩或整理内存。
在课堂上我问我们应该如何做这件事,因为记忆是可视化的,实际上并不是连续的,他回答说:“好吧,你必须关闭 [虚拟记忆]。” 有同学在课堂上问我们怎么知道什么时候打到了这个“垃圾收集”,他说:“因为垃圾收集需要时间,所以第二次分配的时间应该比第一次大”
在四处搜索之后,我能找到的最接近禁用虚拟内存的方法是使用swapoff -a. 我禁用了我的桌面环境,并从本机终端编译并运行了我的程序(以避免可能受到其他进程的干扰,尤其是像桌面环境这样的繁重进程)。我这样做并以递增的方式运行我的程序,m直到达到第二次分配的时间大于第一次的时间点。
我用递增的方式运行程序,m最终发现第二次分配的时间比第一次分配的时间多。然而,在此过程中,我遇到了在第二次分配之前进程被终止的情况。我检查了一下dmesg,发现它是被oom-killer杀死的。我发现并阅读了几篇关于oom-killer 的文章,并发现您可以禁用内核过度分配内存。
我这样做并再次运行我的程序,只是这次我无法找到m第二个时间高于第一个的时间。最终,随着 m 越来越大(虽然比启用过度分配时小得多),malloc 将失败,我的程序将终止。
我有三个问题,其中第一个问题并不那么重要:
垃圾收集是正确的术语吗?我的教授非常坚定地说这是垃圾收集,但我假设垃圾收集是由编程语言完成的,并且这会被认为是更多的碎片整理。
在 linux 系统上是否可以像他想要的那样进行压缩?
当我禁用交换但仍然启用内存过度分配时,为什么我能够达到第二次分配的时间高于第一次分配的时间?压实真的发生了吗?如果是这样,为什么在禁用内存过度分配后我无法达到压缩发生的程度?
我有一个 XBian 服务器(Debian 的 Raspberry Pi 版本)通过 inetd(不是本机守护程序)运行rsync。我在ext4文件系统(在 USB 磁盘上)上提供几个目录作为单独的模块(有问题的模块有 100-500 GB 的数据和 1000-10000 个文件)。我最近注意到,当我更改文件系统的其他部分(即上传、副本等,不一定在上述目录中)时,对这些模块的 rsync 调用将超时。
对于像 那样的例行 rsync 命令rsync -vrt rsync://host:port/module ./,我不希望需要任何文件传输(即服务器和客户端位置都具有相同的数据),在 rsync 服务器日志文件中,我看到如下日志:
2014/12/15 22:59:59 [###] connect from UNKNOWN (1.1.1.1)
2014/12/15 22:59:59 [###] rsync on share/ from UNKNOWN (1.1.1.1)
2014/12/15 22:59:59 [###] building file list
2014/12/15 23:16:23 [###] rsync: read error: Connection timed out (110)
2014/12/15 23:16:23 [###] rsync error: error in socket IO (code 10) at io.c(785) [sender=3.1.1]
Run Code Online (Sandbox Code Playgroud)
在客户端日志中,我看到这样的日志(是的,相同的传输 - …
正如您在此处阅读的那样,ext4 文件系统具有将块分组为范围的范围功能。它们中的每一个最多可以有 128MiB 的连续空间。在 中e4defrag,有类似于以下内容的行:
[325842/327069]/file: 100% extents: 100 -> 10 [ OK ]
Run Code Online (Sandbox Code Playgroud)
该文件的大小约为 150MiB。所以根据wiki页面,应该有2个范围而不是10个。
我有一台用于一般用途的机器,我也用来运行 QEMU 虚拟机。因为虚拟机应该尽可能提高性能,所以我想用大页面来支持 VM 内存,最好是 1GB 大页面。这台机器有 32GB 的内存,我想为 VM 提供 16GB。问题是,在我正常使用机器的过程中,我可能需要使用所有 32GB,因此在启动时分配 16G 的大页面不是一种选择。
为了解决这个问题,我有一个钩子脚本,它在 VM 启动时分配 16G 的大页面。正如您可能预期的那样,对于 1GB 大页面,如果主机已经使用了任何时间,这将失败(它似乎可以可靠地处理 2M 大页面,尽管这并不理想)。
我不明白的是为什么会发生这种情况。例如,我可以打开多个应用程序(浏览器窗口、代码编辑器等,只是为了强制进行一些碎片化测试),然后关闭它们以便只有我的桌面处于打开状态。在这种情况下,我的内存使用量约为 2.5G/32G。
内核真的没有办法在剩余的 30G RAM 中找到 16 个 1G 页的连续对齐内存,这似乎是非常高的碎片。此外,我可以运行
$ sudo tee /proc/sys/vm/compact_memory <<<1
Run Code Online (Sandbox Code Playgroud)
尝试对 RAM 进行碎片整理,但即便如此,我也从未成功为 VM 分配 16 个 1G 大页面。这对我来说尤其令人震惊,因为在仅对 2.5G 的 RAM 进行碎片整理后,剩余的 30G仍然不连续或对齐。
我对这个过程有什么误解?这看起来像预期的行为吗?另外,有没有办法检查是否compact_memory真的做了什么?dmesg运行该命令后,我没有看到任何输出或类似的输出。
有一个很好的问题,遗憾的是在我写一个相当广泛的答案时被删除了:(
\n不想让这种努力白费,让我从问题文本和评论中解释一下这个问题:
\n\n\n我观察到使用
\ndd覆盖文件确实会增加碎片。我正在寻找一种dd不会导致碎片化的替代方案。作为碎片如何发生的示例:想象一个占据整个文件系统的文件。开始覆盖它,您将立即看到该分区如何变得完全“空闲”,同时您将能够向其中写入另一个文件。块是动态分配的,并且当文件被覆盖时,零保证旧块将被重用。
\n我在多个文件系统(ext2、3 和 4、XFS、以及 FAT32 和 NTFS)和多个操作系统(win95 到现代 Fedora)\xc2\xb2 上观察到这种行为。
\n我确信这与文件系统和操作系统无关。
\n我的主文件系统是 Bog 标准 ext4。FedoraROOT:103874/1310720 个文件(0.2% 不连续),1754833/5242880 个块。最小的整体碎片。
\n
请注意,我自己无法观察到这一点,我相信这些碎片声明的原始提问者!
\n我有以下设备,笔记本电脑上装有Linux Mint 18.1,服务器上装有GNU/Linux Debian 9。
(所有都是 64 位和 Cinnamon 桌面。)
所有驱动器设备都使用ext4 文件系统进行格式化;RAID 1是使用mdadm.
带 1 个SSHD 的笔记本电脑(不要与 HDD 混淆)。
带 3 个驱动器的笔记本电脑:RAID 1 中的2 个消费级 HDD和 1 个 SSD。
具有 5 个驱动器的服务器:4 个企业级 HDD,采用RAID 1和 1 个 SSD 的两倍。
我在这些 SSD 上安装了系统,我永远不会对 SSD 进行碎片整理。
问题是关于 HHD 和 SSHD。
我发现了一个旧的 PDF,其中概述了e4defrag.
尝试对未挂载的文件系统进行碎片整理时,为什么必须按照此错误消息挂载文件系统?我想了解这是为什么:
Run Code Online (Sandbox Code Playgroud)Filesystem is not mounted
我想实施可用空间碎片整理。AFAIK 现在正在审查中。我是否可以e4defrag使用这些可用选项或无论如何从源代码编译?
e4defrag …Run Code Online (Sandbox Code Playgroud)我在桌面上安装了 Linux Mint 来代替 Windows 10。
我习惯使用病毒/恶意软件扫描程序、碎片整理程序、磁盘清理工具等。
我想知道这里的人们是否能够为 Linux 操作系统推荐类似的工具。
关于病毒,我采取了比后悔更安全的方法,因为我从我的研究中看到,在 Linux 上并不完全需要病毒扫描程序,但是,我使用我的计算机来运行我的在线业务,并且不想冒险。
我希望我的计算机尽可能长时间地以良好的性能运行
添加
我的另一个查询是基于Wine此作为虚拟环境运行,旨在模拟 Windows 机器的环境。我应该担心那里的病毒吗?它会感染与 Windows 设备相同的病毒吗?
碎片整理似乎有两种含义:
碎片整理是减少碎片量的过程。当文件系统不能或不会分配足够的连续空间来存储作为一个单元的完整文件,而是将它的一部分放在其他文件之间的间隙中时,就会发生碎片。
在 Windows 下,如果我们尝试从 NTFS 分区释放现有的可用空间(以便稍后创建一个新分区,尤其是在 Ubuntu 的双引导安装期间,除了现有的 Windows 操作系统),我们将不得不使用 Windows 工具将所有文件移动到分区的一端,尽可能在分区的另一端留出空闲空间。我听说这也称为碎片整理。
或者,Linux 工具例如gparted可以从 ntfs 分区释放可用空间,而无需先对 NTFS 分区进行碎片整理(在上一段的意义上,而不是在第一段的意义上)。
我想知道上面的两种“碎片整理”是否总是一起发生?
文件系统(例如 NTFS)是否需要碎片整理取决于
2 中问题的答案是否因碎片整理的不同含义而异(如前所述)?例如,我听说,
gparted,在第二种意义上不需要对NTFS分区进行碎片整理,是不是因为Linux总是尽可能地自动将所有文件移动到分区的一端?ext4 ×3
filesystems ×3
memory ×2
btrfs ×1
dd ×1
disk-cleanup ×1
huge-pages ×1
linux-mint ×1
malware ×1
qemu ×1
raspberry-pi ×1
rsync ×1
security ×1
swap ×1
terminology ×1