通过增加虚拟内存来提高内存使用
本文解决的实际问题:
当我们物理内存小的时候,会出现OOM,然后服务自动死掉的情况。因为物理内存大小是固定的,有没有其他好的办法来解决呢?这里我们可以适当调整Linux的虚拟内存来协作。
问题描述:
最近遇到一个情况,物理内存不够,导致项目一两天就自动死掉了。服务器物理内存就2GB,上面有好多服务,但是,又不能停,导致一个新上的项目,总是过一两天就自己死掉了。查看启动情况:
添加虚拟内存前,服务重启情况
从上图中,我们可以看到服务重启的频率,是不是相当的高了。解决这种情况,可以有以下两种方案:
一、使用脚本定时查询,如果指定服务没有启动,就执行重启动作;
二、能否使用虚拟内存解决呢?
其实第一种方案,凯哥(凯哥Java:kaigejava)也尝试过了。最后还是选择试试第二种方案:提高虚拟内存大小,来解决物理内存捉襟见肘的情况呢?
在使用虚拟内存前,我们先来看看,当前服务器默认的虚拟内存的使用情况,使用top命令查看:
添加虚拟内存前Swap使用情况
从上图中,我们可以看到,swap区域的默认大小是1GB的,可用空间为0.这说明,交换区域已经被占满了,看来是需要提高swap区大小了。
在使用方案二之前,我们先来介绍以下基础知识:什么是虚拟内存?虚拟内存有什么作用?
虚拟内存是什么?
虚拟内存是一种计算机内存管理技术,它通过将磁盘空间作为辅助存储器来扩展物理内存(RAM),从而提供更大的可用内存空间。其主要作用包括:
有什么作用?
1.扩展可用内存空间: 当物理内存不足以同时容纳运行的所有程序和操作系统所需的数据时,虚拟内存允许操作系统将部分数据移到硬盘上,从而释放物理内存。
2.提供内存抽象: 虚拟内存为每个进程提供了一个独立的、连续的地址空间,使得每个进程感觉自己独占了整个内存。实际上,这些地址可能对应于物理内存中的不同位置,也可能在硬盘上的交换文件中。
3.方便内存共享: 多个进程可以共享相同的虚拟内存地址,而不必实际共享物理内存。这使得进程之间的通信和数据共享更为灵活。
需要注意事项:
对于物理内存较小的实体机,提高虚拟内存空间的确可以对程序运行产生一些帮助,但也有一些注意事项:
a.性能开销 使用虚拟内存会引入性能开销,因为从硬盘读写数据比从物理内存读写数据慢得多。过多地依赖虚拟内存可能会导致性能下降。
b.交换空间 当系统需要释放物理内存时,它会将不常用的数据移到交换文件(虚拟内存)中。如果过度使用交换空间,可能导致硬盘I/O过多,进而影响性能。
总结:
总体而言,虚拟内存是一种在有限物理内存情况下提供更大内存空间的有效手段,但过度使用虚拟内存可能会导致性能问题。在真实的环境中,合理配置虚拟内存大小,结合物理内存和系统负载进行调优,是确保系统平稳运行的关键。
好了,通过上面介绍,我们知道了,虚拟内存是什么了,那么接下来我们,需要思考的是,Linux操作系统下怎么扩大交换区呢?
在Linux系统下怎么创建和启用一个swap file,来提供额外的虚拟内存空间呢?
步骤如下:
- 在指定目录中创建指定大小的文件,这个文件将被用作交换文件。命令:
sudo fallocate -l 2G /home/swapfile
上面这条命令解读:
用于通过fallocate命令在/home目录下创建一个2GB大小的文件,这个文件将被用作交换文件。
2. 设置第一步文件的权限。命令:
sudo chmod 600 /home/swapfile
命令解读:
设置刚创建的交换文件的权限,将其设置为只有拥有者(owner)有读写权限,没有其他用户或组的权限。
3.将第一步创建的文件设置为Linux交换空间(swap)格式的文件。命令:
sudo mkswap /home/swapfile
解读:
使用mkswap命令将指定文件格式化为Linux交换空间(swap)。
4.将文件设置成系统一部分,用以提供额外虚拟内存。命令:
sudo swapon /home/swapfile
解读:
启用刚刚创建的交换文件,使其成为系统的一部分,以提供额外的虚拟内存。
5.设置系统启动时候自动启用交换文件。命令:
echo '/home/to/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
命令解读:
将一行配置添加到/etc/fstab文件中,该配置用于在系统启动时自动启用交换文件。这个文件系统表(fstab)中的条目指定了系统如何挂载各个文件系统和设备。
通过上面五个步骤之后,我们就创建了一个在home文件夹下,大小为2GB的swapfile虚拟空间了。
我们先来使用top命令查看swap情况:
添加虚拟内后,Swap区使用情况
使用free -h命令,来看看,虚拟空间使用情况:
查看Swap区已经使用和未使用情况
通过free -h命令,看到,虚拟内存由1GB,变成了2GB.说明我们新增加的2GB虚拟内存添加成功了。
下面是创建虚拟文件并指定的完整命令。
sudo fallocate -l 2G /home/swapfile sudo chmod 600 /home/swapfile sudo mkswap /home/swapfile sudo swapon /home/swapfile echo '/home/to/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
说明:
请用上面命令,请修改成自己实际的路径