使用preload的缺点是什么?为什么它不是默认包含在内的呢?

我想知道使用preload有什么缺点?如果没有任何不利之处,那么preload应该默认启用,所以我猜肯定存在一些问题。
好吧,你需要更多的内存,但大多数人的RAM远远超过Ubuntu所需的 - 那么使用preload有什么不利之处呢?

8谢谢你的有用问题。我想知道,这是一个神话吗? - Saeed Zarinfam
1CPU使用率和电池寿命可能对某些人来说是一个缺点... https://bugs.launchpad.net/ubuntu/+source/preload/+bug/481861 - Mateo
1好问题。有些发行版确实预装了preload,比如elementary OS(这是我在笔记本上使用的系统,因为gala比Ubuntu的unity要快得多)。 - user69659
1或许有一个猜测:默认情况下不包含它的原因之一是它在所有系统上都不可用(其硬件要求可能与标准要求不同)。 - don.joey
2这篇帖子建议"它以root权限作为守护进程运行"。这可能存在安全问题,还有这个想法希望将其默认包含在内。 - Mateo
6个回答

简单来说,预加载并不适合所有人。如果你经常打开应用程序或库文件,那么它非常有用。但是如果你只偶尔加载应用程序或库文件,那么它就会带来一些负面影响。我将从我的实际使用中举两个例子(是的,我使用预加载)。
首先,谷歌浏览器。一个浏览器在每次启动时只会打开一次,也许两次(对于我来说,我是一个网页开发者)。由于我经常使用Chrome及其相关的库文件,它们一直保持在内存中。即使我关闭了所有的Chrome窗口,它仍然在后台运行。因此,为了保存Chrome的预加载副本所分配的内存完全是一种浪费。它几乎从不被卸载(或很少被卸载)。对于普通用户来说,这对很多应用程序都是适用的。办公软件用户几乎总是会保持他们的邮件应用程序打开。因此,启动时间上的小幅节省完全是浪费的,因为他们一天只打开邮件应用程序一次,并且保持它一直打开着。
第二个例子是rake。作为一个相信测试的Ruby开发者,我经常运行rake。rake运行一段时间后就会退出。预加载帮助我加快日常工作速度,因为它提前加载了rake及其所需的库(可能非常庞大)。所以在运行rake时会有很多启动和停止。在几个小时内加速400或500次rake的运行所使用的额外内存是完全值得的。
之所以默认情况下未启用预加载,是因为它实际上改善性能的能力在很大程度上取决于您如何使用系统。对某些人来说,它可能是负面的,而对其他人来说则是正面的。
最后,即使您没有使用预加载,它也会消耗内存。因此,如果您不经常启动应用程序,没有将该内存用于其他类型的缓存可能会使整个系统稍微变慢。请记住,即使您有32GB的内存,Linux也会尽可能地使用它来缓存数据,以加快交互速度。通过使用预加载,您会减少一些可用的空闲内存。即使只是一点点,您节省的2秒钟启动Chrome的时间在一个月内可能会花费您60秒钟。

1此外,使用预加载会减慢启动速度。预加载的东西越多,系统启动所需时间就越长。现在,想象一下,你只是想启动系统、写一句备忘录,然后立即关机。你甚至要等待才能写备忘录,因为系统正在预加载与此任务可能无关的内容。因此,从某种程度上说,预加载(总体而言)是一把双刃剑。 - F-3000
2预加载实际上并不是以那种方式工作...它给内核一些提示,比如“嘿,在你那里把这个加载到缓存中,我很快会需要它”,然后内核就这样做了。所以实际上它并不像你描述的那样使用内存。不过可能会发生两件事情:加载到缓存中会推出你即将要使用的应用程序 - 这会导致应用程序在返回时出现短暂的冻结和硬盘活动。 - hurikhan77
2其次,如果预加载错误地预测了您的使用模式(如果您经常加载应用程序,这可能是情况),它会缓存一些稍后将被推出内存的内容,并且反过来又会将自身的缓存推出内存,而您本可以更好地利用这部分内存。但最终它只是像vfs缓存一样“消耗”内存-所以从某种意义上说,它实际上是可丢弃的内存,因此是“空闲内存”。然而,它确实与“正常缓存”竞争,就像您所写的那样。 - hurikhan77
1鉴于coteyr和@hurikhan77的回顾,您同意预加载是一种对于老旧、低内存(启动时约800 MB可用)桌面计算机来提升感知速度相对无效的方式吗?请知悉,在这样翻新过的计算机上启用预加载将给内核虚拟内存管理器带来很多工作量,但只会带来微小的改进。 - tuk0z
2如果那800 MB确实是未分配的内存,预加载可能会有所帮助...但更多的内存可能会使其效果更好。而这也意味着:预加载将与您稍后可能启动的内存需求较高的应用程序发生冲突。在这种情况下,降低交换空间可能是必要的,这可能会使预加载在您使用过多内存时变得无用。 - hurikhan77
@hurikhan77 我会采纳你的建议。请注意这些是的盒子,例如 Athlon 3000-DDR400。我们降低了 vm.swappinessvfs_cache_pressure,并设置了 zswap 作为优先处理应用程序和目录列表的响应性(也称为页面缓存的 dentry 部分)与文件缓存之间的方式。是的,他们在已安装1GB内存的情况下,使用Moksha桌面有大约910MB的可用内存,而XFCE/Plank则有大约770MB的可用内存(经过大量调整)。应用程序已根据资源稀缺的原则进行选择和配置,以保持尽可能轻量级。 - tuk0z

2012年9月5日,bountier Saeed Zarinfam提出的问题: 大家好,我想知道这是不是一个误解?[preload]真的能提高我的性能吗?使用它有哪些缺点?我有一台配备(Core i5 CPU, 4GB RAM, 128GB SSD Hard)的笔记本电脑。非常感谢。
  • 如果你拥有SSD,实际上并不需要使用[preload]
    • 这是因为SSD提供了比硬盘更快的随机访问时间,所以在内存中"预加载"二进制文件/依赖项是浪费资源,我认为
    • 基本的缺点是,[preload]占用了额外的内存资源而没有提供明显的好处。

27这并没有回答到提问者的问题,因为使用预加载有什么缺点呢?其次,你已经表达了自己的观点,对“预加载”做出了陈述,然后又引入了“SSD”。你到底打算在什么时候回答这个问题呢? - Ringtail
3更不用说这是错误的了。我有一块固态硬盘,并且一直在寻找加快 Atom 编辑器启动速度的方法,因为我几乎把它用于所有事情。预加载将 Atom 的加载时间缩短到了之前的四分之一。这是有道理的——从内存中获取数据总是比从固态硬盘(或者任何外部存储设备)中获取要快,因为即使使用固态硬盘,你仍然需要将所有内容加载到内存中,才能被处理器使用。无论是固态硬盘还是其他类型的硬盘,都不能直接从磁盘上使用数据。 - C.Rogers

Preload是一种“自适应预读守护程序”,在您的系统后台运行,并观察您最常使用的程序,将它们缓存起来以加快应用程序的加载时间。通过使用Preload,您可以充分利用未使用的RAM,并提高桌面系统的整体性能。
不要期望立即看到性能上的巨大变化。此外,如果您只是重复打开/关闭应用程序,您的计算机将无论如何将这些文件存储在缓存中(这称为“热”加载),因此在速度上不会有任何区别。然而,如果您间断地使用某个程序,您将会看到比没有使用Preload时更快的启动速度。
Preload可以显著改善应用程序的启动时间;由于大多数现代计算机都有很多可用内存,Preload可以充分利用这些RAM。
话虽如此,Preload似乎是一个很好的实用工具,也许确实如此。
我认为它没有与操作系统预装的原因是因为用户必须准确知道自己在做什么,并且具备足够的经验来使用它,同时系统必须具备足够的RAM。
在技术层面上,预加载通过将数据从硬盘移动到内存来实现,这使得大多数硬盘在不使用时进入待机模式,需要时则重新启动。因此,启停驱动器会导致装载/卸载周期计数和开机时间计数增加,从而缩短驱动器的使用寿命。
我们设计并实现了preload,这是一个基于马尔可夫的自适应预取方案,它在应用程序级别进行预测。此外,preload是在用户空间中实现的,并且不会以任何方式改变应用程序的运行环境。据我们所知,这是第一个在这个层次上尝试文件系统预取的工作。
我们的实验结果显示,与冷缓存相比,应用程序的启动时间有了显著的改善,并且与一个简单的预测算法相比,命中率也相当不错。
然而,由于在用户空间中存在一些困难,使得将preload作为解决启动时间问题的竞争性解决方案变得困难。特别是,由于无法获取关于应用程序I/O请求的完整信息,并且与页面缓存子系统之间缺乏强大的通信渠道,在内存紧张的情况下,preload的效果会大大降低。 preload设计中的另一个固有问题是高方差和低预测置信度,这是由于应用程序启动的相关性相对较弱。虽然我们成功构建了一个跟踪应用程序相关性的模型,但是考虑到与计算机工作时间尺度相比,应用程序启动是非常罕见的事件,应用程序级别的预取方案注定要在实际上无限的时间段内消耗大量的预取内存。这些内存可以用来改善短期缓存行为。
最后,我们提出了一套建议,供系统开发人员在不依赖于与内核中的缓存子系统集成的预取器的情况下,如何改进启动时间、登录时间和应用程序启动时间。当然,内核中的基于文件的预取器可以在此基础上进一步改进。

1来源:techthrob

2来源:Behdad Esfahbod的自适应预取守护程序Preload - 一篇符合多伦多大学计算机科学研究生部硕士学位要求的论文,版权所有(c)2006 Behdad Esfahbod。


2谢谢你的回答,Mitch。这也是我的想法。特别是在笔记本电脑上,预装可能会成为一个问题。但是,我仍然希望能找到一个官方的来源/讨论,了解Ubuntu团队为什么决定不提供预装的原因。 - Glutanimate

缺点?没有!

用户打开应用程序的性能提高了。我多年来一直在我的系统上使用它,以及“预读”功能,并没有遇到任何问题。preload的错误页面也没有提到任何缺点。

preload监视用户运行的应用程序,并通过分析这些数据,预测用户可能会运行哪些应用程序,并将这些二进制文件及其依赖项提取到内存中,以加快启动时间。

它确实会稍微增加启动时间,但是应用程序获取时间的速度减慢远远超过了这个小问题。

参见文章

如果您经常使用像FirefoxGimp这样的常见应用程序,您会注意到加载时间大大改善。preload是一个在后台静默运行的守护程序,不会对您的桌面造成任何干扰。Ubuntu用户可以使用以下命令安装preload:

sudo apt-get install preload

结果:

Graph showing difference between normal and preload start

ref


5我知道它的作用,并且我读了几篇“预加载教程”,但是我没有在任何地方看到关于它的缺点。如果没有缺点,它就会默认随许多Linux发行版一起发布 - 但据我所知 - 这并不是事实。 - Paradiesstaub
我可以轻松从我的Ubuntu中移除它吗? - Saeed Zarinfam
2性能并没有下降,而是提升。这就是使用预加载的全部意义所在。也许只是一个打字错误。 - Marco
6你的图表看起来很棒,但是缺少重要信息。它完全适合销售人员的演示文稿,但却是一个“糟糕统计”的例子。这些数据从哪里来?记录它们使用了什么协议?是单个快照吗?样本中涉及了多少台机器?硬件是什么?预装程序如何配置? - user85164
@Frank,使用“ref”这个工具吧!顺便说一句,我刚刚重新发布了这个信息。所以别杀信使。如果你觉得你能对答案进行改进,尽管编辑它。否则... - Ringtail
1@Ringtail: 你说得对。那个图表的作者不是你。但是,如果你点击文章中的所有链接,你会进入一个Techthrob.com的页面,那里应该有一篇由该程序的作者撰写的文章。但是那个页面已经消失了。所以现在只有一份来源:作者的论文。 - user85164
3如果一个Gnome终端需要超过2秒才能启动,就应该升级硬件。 - Peter and the wolf

我认为预加载几乎没有什么作用。它似乎是将所有经常访问的页面加载到内存中,并将它们锁定在那里,以便保持在那里。 内核几乎做了同样的事情。它保留了被程序使用过的文件(或者是程序本身)的"脏页"。如果程序不再需要这些页面,它会关闭文件... python:
file=open('file.txt') # open the file
....
file.close            # close the file

......然后内核仍将它们保留在RAM中,只有在RAM使用率达到...%时才会覆盖那些“脏页”。

预加载只是增强了这个过程,但可能会减慢系统速度。它将应用程序加载到RAM中,但将它们锁定,以防内核在RAM已满时释放它们。预加载也会自动释放它们,但必须在被预加载锁定的页面被释放之前,内核先释放“脏页”。预加载必须决定何时释放已锁定的页面,因此可能会造成浪费,因为如果您始终打开浏览器,预加载将锁定它。现在您关闭了浏览器 - 预加载仍将锁定它。当您使用全部RAM时 - 预加载仍将锁定它 - 内核必须释放当前所需的页面。因为您不再想浏览网页,而是想玩游戏。游戏文件必须一直重新加载,因为内核必须释放其“脏页”。

我不知道预加载的工作原理,它是如何“学习”和效率如何,但它会使系统变得臃肿而没有实质性的好处。预加载可能会浪费内存。它可能会浪费硬盘资源(尤其是减慢启动速度)。用户应该决定是否需要它。如果您经常重新启动系统,预加载可以帮助很多,但如果经常处于挂起到内存状态,您就不需要它。没有明显的区别。
有一点需要注意: 当达到阈值时,内核会释放最旧的页面 预加载会释放最不必要的文件/页面。
但正如我所说:如果你不做通常做的事情,预加载会大量浪费你的内存。比如..你不怎么玩游戏,但经常编码。当你玩游戏时,预加载会是一种浪费,但在编码时并不是真的浪费。
这是我的观点。它可能是对的也可能是错的,请保留您认为好的部分,忽略您不喜欢的部分。

以下是Preload的一些缺点,以及为什么它对每个人都不那么有效:
我有一个配置不错的系统,配备了8GB的RAM。所以我的系统通常很快。此外,我每天会打开一两次内存消耗较大的应用程序,比如Firefox、Chrome、VirtualBox和Gimp等。它们始终保持打开状态,因此它们的二进制文件和库被预加载到内存中,并占用着RAM。我很少关闭和打开这些应用程序,所以RAM的使用实际上是浪费的。
如果你使用的是带有SSD的现代系统,Preload显然是无用的。因为SSD的访问时间比普通硬盘要快得多,所以使用Preload是没有意义的。
Preload会显著影响启动时间。因为预加载更多的应用程序到RAM中,系统启动所需的时间就越长。
只有当你每天频繁地重新加载应用程序时,你才能看到真正的差别。所以Preload对于开发人员和测试人员来说是理想的选择,他们每天多次打开和关闭应用程序。

只有当您频繁重新加载应用程序时,才能真正看到差异。这并不正确,预加载或不预加载,应用程序在加载和关闭后仍保留在暖缓存中。预加载通过在系统启动时加载常用应用程序来加快冷启动速度。 - Lutosław