什么是交换内存?


26

我正在使用RAM存储一些数据库表,而其他存储在硬盘中。

今天,我知道我的进程正在使用交换内存。现在什么是交换内存,我如何才能检测到哪个进程正在使用交换内存,如何阻止他们使用交换内存?


没有任何办法找出哪个进程正在使用交换内存???

在Windows任务管理器(或类似工具)中查看使用的页面文件量和页面错误。

交换不是每个进程的事情,而是整个操作系统的事情。“ vmstat”将显示有关正在使用多少交换的信息。
jrockway

我在Linux上而不在wimdows上工作

有这种交换使用的原因.....有人试图解析我的网站,这就是为什么整个事情都在我们这边发生而没有任何原因的原因。感谢您的回答,它对我的​​帮助一如既往:-)

Answers:


41

如果物理内存用完,则使用虚拟内存,它将数据存储在磁盘上的内存中。从磁盘读取比从内存读取慢几个数量级,因此这会减慢一切。(在实内存和虚拟内存之间交换数据是“交换”。磁盘上的空间是“交换空间”。)

如果您的应用程序正在“使用交换”,则您需要使用更少的内存或购买更多的RAM。

(交换很有用,因为未使用的应用程序可以在使用之前存储在磁盘上。然后可以将它们“分页”并再次正常运行。尽管它不在内存中,但是操作系统可以使用该内存。因此,这是一个非常有用的功能,但是,如果您没有足够的物理内存来运行程序,则肯定需要更多的内存。幸运的是,这些天的内存确实很便宜。)


1
为了正确起见:虚拟内存表示使用虚拟内存地址(无论您有多少可用RAM,现代CPU始终启用该地址),并且与交换没有直接关系(尽管它们组合使用,但它们是基本上是不同的概念)。
fortran 2012年

@fortran,出于双重正确性,虚拟内存是Windows在引用分页(交换)文件时使用的术语
sleblanc '16

7

一台计算机具有一定数量的物理内存。但是大多数时候我们想要更多。因此,我们交换了磁盘上的一些内存。

每次我们需要该内存时,都需要将其换回内存(将其他部分交换出去)。有一些非常智能的算法可以最大程度地减少延迟,但是有时候我们还是要等待。

在Windows上,如果您查看任务管理器,则可以显示列页面错误。这显示了应用程序请求磁盘上一块需要交换的内存的时间。大量页面错误=应用缓慢。

此过程在多个级别上使用。从快到慢的摘要:

  • 在CPU级别上,有寄存器。这些是最快的内存,但是数量有限。
  • 同样在CPU上有一个小的内存缓存。这里存储了一小部分正在运行的程序,以便快速访问。如果您想了解更多信息,请搜索分支预测算法。
  • 有时,CPU和主内存之间存在2级缓存。
  • 下一级是主存储器(RAM)。
  • 最后一级,也是最慢的是磁盘,有时您可以使用USB记忆棒作为额外的内存。

3
cat /proc/pid/smaps

如果您不希望使用swap,则不要使用swap分区(在中注释掉行/etc/fstab),但这将阻止启动新进程,并且如果物理内存用尽,malloc将会失败。一般来说,这不是一个好主意……不是很安全,也不是很有用,因为操作系统会将热门页面保留在内存中,并将那些近期未使用的页面交换到磁盘上。

另一个解决方案可能是黑客入侵数据库,以便将页面锁定到内存中(我知道可以做到,但是现在我不能确切告诉您如何操作),但是无论如何,数据库很可能会使用它自己的交换和缓存机制。

要知道什么是交换以及虚拟内存是如何工作的...我建议您看一下一些操作系统讲座,也许MIT Open Courseware会有所帮助。


由于许多Linux发行版上的默认配置是过度使用内存,因此,最糟糕的是OOM杀手将开始进行狙击进程,最有可能从DBMS(以及“存储在RAM”中的表)开始事情)。
symcbean

1

我找到了部分答案。交换内存是计算机硬盘上的空间,操作系统将使用该空间将RAM中实际存储的信息释放给其他应用程序。当系统需要用于新进程的内存而没有内存时,应该执行此操作,因此我们可以看到,如果我们的系统具有大量RAM,则可能不需要SWAP内存。

更新

要找出交换空间(或虚拟内存)的位置,可以转到任务管理器(CTRL + ALT + DEL),然后从“视图”->“列”->“虚拟内存”中打开。现在,只需计算内存使用量和虚拟内存之间的差异即可。另外,这里还提供了有关如何在运行Vista的情况下进行查看的说明:http : //www.ehow.com/how_5067693_increase-swap-space.html


-1

交换是用作RAM的硬盘空间。(相对而言)它非常慢,但是当计算机尝试处理其RAM无法处理的更多数据时,它可以防止计算机崩溃。

要停止使用交换的进程-安装更多的RAM。


1
如果您不希望进行任何交换,请停止使用页面文件。但是期待其他问题。

1
不是。交换是将数据块硬盘移动到物理内存。一次读取,通常足够快。

@xtofl的答案没有提到交换,只是交换分区,而gamecat的评论与您所说的没有任何关系?:P
RapidWebs 2014年

-1

如果您不希望您的进程使用交换内存,则只需完全禁用交换内存。不幸的是,如果内存用完了,Linux内核将杀死一些正在运行的进程,以释放一些内存供使用。

如果您有足够的RAM用于系统,则实际上可以不使用交换内存。

我有一台不带交换内存的768Mb RAM的笔记本电脑。足以满足我的需求。我有一台具有256Mb RAM的服务器,并且不使用交换内存。它使用OpenVZ虚拟化运行8台虚拟服务器,也没有问题。

因此,是否需要交换内存取决于您。


如何在只有256 MB RAM 的计算机上运行8个 VM ?!
沃伦

VZ可能会出现这种情况,因为RAM并未完全分区,因为公共库在VM之间共享,或者会产生影响。因此,8 x 64M不一定是512M。:)
sybreon

尽管如此-底层设备如何稳定运行?
沃伦

通过换出不活动的程序,您有更多的内存用于文件缓存。这样可以加快速度。这一次阅读通常相当快,总体效果可忽略不计。当您超出可用RAM范围时,它不仅会使用。我已经看到具有16GB RAM的计算机有时会使用SWAP。
RapidWebs

此外,我不建议在数据库服务器上禁用SWAP。当OOM在一个简单的每晚备份操作或类似的操作中杀死后端时,他的客户或Web应用程序将不会很高兴?相对于应用程序使用情况和可用内存来调整数据库缓存将更加明智。如果他已经在交换,则他需要更多的内存或更好地配置他的数据库服务器。否则,禁用SWAP将迫使OOM在每次交换时杀死DB服务器。根据他的问题判断,通常是
RapidWebs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.