为什么在剩余大量可用内存时使用 Swap?

mah*_*n3d 36 mysql linux php

我有很好的网络(专用)服务器,具有良好的内存资源:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   
Run Code Online (Sandbox Code Playgroud)

如您所见,当有大量可用内存时,我的服务器正在使用交换。

这是正常的还是配置或编码有问题?

注意
,由于某种原因,我的 MySQL 进程使用了​​超过 160% 的 CPU 功率;我不知道为什么,但我没有超过 70 个同时用户......

Dav*_*rtz 63

这是完全正常的。

在系统启动时,会启动许多服务。这些服务会自行初始化、读入配置文件、创建数据结构等。他们使用一些内存。在系统启动的整个过程中,这些服务中的许多将永远不会再次运行,因为您没有使用它们。其中一些可能会在几小时、几天或几周内运行。然而,所有这些数据都在物理内存中。

当然,系统不能把这些数据扔掉。它无法证明它实际上永远不会被访问。例如,这些服务之一可能是为您提供对盒子的远程访问的服务。您可能一周内没有使用过它,但如果您确实使用过它,效果会更好。

但是系统知道它可能希望将物理内存用于磁盘缓存或其他可以提高性能的方式。所以它会进行机会交换。当它无事可做时,它会使用交换空间将很长时间未使用的数据写入磁盘。但是,它仍然将页面保留在物理内存中。所以它们仍然可以被访问而无需交换它们。

现在,如果系统稍后需要该物理内存用于其他用途,它可以简单地丢弃这些页面,因为它已经将它们写入交换。这为系统提供了两全其美的优势。数据仍保存在内存中,因此无需从磁盘读取即可访问。但是如果系统需要该内存用于其他目的,则不必先将其写出。大赢。

  • @ananthan:可能有很多原因。最有可能的情况是系统根本没有承受任何内存压力,即使是由于缓冲写入,所以可能永远不会触发机会交换代码。也可能是有人认为任何交换使用都是不好的,因此错误地调整了系统,使其不机会性地交换(通过减少 *swappiness*)。 (4认同)

bra*_*n99 6

如果在过去的某个时候您需要比机器中的物理 RAM 多的内存,就会发生这种情况。那时一些数据将被写入交换空间。

当稍后的内存被释放时,swap 中的数据不会自动读回 RAM:这仅在某些进程实际需要 swap 中的数据时才会发生。这是完全正常的。

至于您的 mysql 进程:这一切都取决于您运行的查询类型。理论上 2 个非常复杂的查询可能足以获得这样的负载,无论您的用户数量如何。您可以启用慢查询日志以更深入地了解哪些查询是负载密集型的。