当应用程序在生产中运行时,“交换”安全吗?

Min*_*ime 3 performance swap optimization memory-usage jvm

我的应用程序有多个 JVM 在 Linux 中运行,并且交换使用率几乎为零。但是,有时由于数据库的高流量或缓慢,JVM 会消耗交换内存,这是不推荐的。如果发生这种情况,我的计划是通过“关闭/打开”来回收交换,而无需在夜间窗口关闭应用程序。

当我在 OS 上交换时,消耗交换内存的进程会发生什么?他们是否丢失了分配的内存块?或者操作系统是否将交换内存块移回物理内存?我在假设物理内存有足够的可用空间来占用所有交换空间的情况下询问。

我搜索回收交换的原因是交换使用行为;当交换使用率为零时,进程不消耗交换,但是当交换使用率不为零时,即使有足够的物理内存可用,它们也会越来越多地使用交换。

我的问题是处理当服务器遇到大量需求并使用交换内存时的实际实践,并且在大量需求消失后永远不会返回。

van*_*ium 7

我只是相信 GNU/Linux 来管理内存。

当内存需求很高时,GNU/Linux 确实会将不活动的进程交换到交换内存,以增加用于运行进程和文件缓存的可用物理内存 (RAM)。即使当内存需求减少时,如果不需要,该交换内存也可能不会释放回 RAM。这样,对于实际需要它的进程和文件缓冲区,可用内存最大。不活动的进程一直坐在交换中。

当应用程序在生产中运行时,“交换”安全吗?

是的,即使没有足够的 RAM 来处理所有交换使用。如果当前需求旁边有足够的 RAM,则关闭交换将成功。如果没有足够的物理内存,swapoff将不会成功并发出swapoff failed: Cannot allocate memory错误。因此,由于系统设计,它仍然安全。

但是,再次强调:不建议以这种方式进行:它不会提供任何性能提升。相比之下,它会暂时导致用于运行进程和文件缓存的可用 RAM 减少,因为它的一部分实际上被浪费在将部分重新分配到无论如何都未处于活动使用/需要的 RAM 中。