我们正在尝试调整我们的应用程序服务器,即 Amazon Linux 机器......
[myuser@mymachine ~]$ uname -a
Linux mymachine.myco.org 4.3.17-14.25.amzn1.x86_64 #1 SMP Wed May 10 01:58:40 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
我们的机器上只有一个 JBoss 进程在运行(即我们已经启动的进程)。该机器有 30GB 内存,Jboss 进程分配 25GB(使用“-Xmx25600m”Java 选项)。机器什么时候开始使用交换空间?当我运行“free -m”时,我没有看到任何交换空间被使用,这正是我所期望的......
[myuser@mymachine ~]$ free -m
total used free shared buffers cached
Mem: 30103 7238 22864 0 172 4438
-/+ buffers/cache: 2627 27475
Swap: 0 0 0
我认为只有当我们开始耗尽内存时才会使用交换,但我被告知这不一定是真的。机器什么时候开始使用交换空间?
答案1
Linux 通常会尝试将内容保留在 RAM 中,只有当可用 RAM 耗尽(即应用程序、缓冲区和缓存文件使用的总 RAM)时,才会开始交换。然而,何时开始交换是可配置的,因此可能会根据您的设置而变化,并由该值控制swappiness
。查看当前swappiness
设置的运行值是什么
cat /proc/sys/vm/swappiness
大多数系统默认值约为 60。该值越低,内核就越积极地将内容保留在 ram 内,并将其设置为 0 完全禁用交换(交换将用于休眠,但在运行时不会主动使用)。
仅当系统的 RAM 几乎完全充满应用程序、缓冲区和缓存时,交换性才会生效。当应用程序请求更多内存时,它会改变内核的偏好,要么丢弃缓存数据,要么将一些较少使用的内存写入磁盘。 swappiness 值控制它们之间的比率,其中 1 基本上总是丢弃缓存,而 100 将导致应用程序数据在大部分时间进行交换。
您可以使用以下命令动态配置系统的交换性
sysctl vm.swappiness=10
并通过编辑将其永久设置/etc/sysctl.conf
为包含
vm.swappiness = 10
对于您的情况,您的服务器具有相当数量的 ram 且 JVM 使用其中的大部分,您可能不想进行太多交换(如果有的话),因此将此值降低到 10 甚至 1 可能会有所帮助。对于大多数拥有大量内存的现代系统来说,将其降低到 10 通常是有益的。
答案2
从实际角度来看,由于 Java 处理内存的方式,这可以简化为:
“我的服务器有 5GB RAM,什么时候开始交换?”
这就变成了是否使用 tmpfs 来存储临时文件的问题,因为这是系统的另一个方面,可能会使用交换空间(tmpfs 驻留在常规页面缓存中,直到系统需要更多内存,然后它就得到了推出交换空间)。不过,您的应用程序很可能不使用此功能,在这种情况下,您可以假设在正常操作期间可能不需要交换空间(如果您在运行维护时关闭主应用程序,则可能不需要交换空间根本没有)。
也就是说,您可能需要考虑一些万一。特别是,由于您可能希望节省一些钱(我假设您运行的是 Amazon Linux,因此您在 EC2 上,因此每单位时间的磁盘空间会花费金钱),因此我建议使用压缩内存使用 zram 驱动程序交换空间(我不能 100% 确定 Amazon Linux 是否包含此驱动程序,但如果他们至少没有将其作为模块,我会感到惊讶)。
答案3
交换分区还用于休眠(即挂起到磁盘)。您可以交换一些文件(使用 0 填充新的交换文件dd
,使用 使其成为交换mkswap
,使用 .... 将其用作交换swapon
)。
当然,如果您的机器使用内存运行大量程序,并且某些进程处于非活动状态,则它可能会被交换,这也将使用交换。