关于 Linux swap 的一切

一个问题

51放假前的时候,一个以前的同事说他们的系统出现 物理空闲内存为 0, swap 分区使用增长,增长到 3G 左右就会引起应用异常退出。但是 JVM 监控看到堆还是有大量空闲空间的。昨天又看到他在朋友圈求助这个问题,决定研究下。

按以前的理解,物理内存不够时,就会把一些不常用的内存页交换到 swap 空间,以释放内存。他碰到物理内存耗尽、swap 空间增长,这是很正常的。只是这些增长的内存干嘛用了。

free -m 命令能只看到物理内存、交换空间各使用了多少,但看不到是每个进程具体用了多少。

还是得靠 top 命令,进入 top 命令的显示界面后,按下 Shift+m 就可以按内存使用排序,如下图:
top demo

假如排在第一的是个 Java 进程,占用了 6G 内存,而JVM配置的最大堆内存是 4G,说明非堆内存(本地内存、线程栈等)占用了 2G。

后面跟那个同事求证,是他们最近上线的一个组件用了 Netty,使用不当导致本地内存泄漏。

关于 swap 的一切

原文: https://www.linux.com/news/all-about-linux-swap-space

Linux 把物理内存(RAM)分为一块一块,称为 页(page)。
交换是把内存页拷贝到提前配置在硬盘上的空间(称为交换空间)的过程,以释放页的内存。
物理内存和交互空间的组合就是可用的虚拟内存。

交互有两个重大意义:
* 首先,系统需要的内存比物理内存更大时,内核交换出较少使用的页,给当前应用(进程)立即需要的内存。
* 其次,应用启动阶段需要大量页可能只用于初始化,然后就再也没有使用。系统可以交换这些页并释放内存用于给其他进程或磁盘缓存。

交换的负面作用:
* 硬盘比内存慢了数个数量级,内存是以微秒衡量的,硬盘是以毫秒衡量;
* 频繁的交换入、交换出将导致性能瓶颈。

Linux 有两种形式的交换空间:
* 交换分区:硬盘上独立的区域,其他文件不能存放。
* 交换文件:文件系统里的一个特定文件。

查看 swap 空间信息: swapon -s

Filename                Type        Size    Used    Priority
/dev/sda5                                  partition    1046524    54244    -1

如果有两个交换空间且优先级相同,Linux swapping 系统将交换使用这两个空间,这样可以提升性能。

交换空间应该多大?

如果有足够的内存,可以把交换空间禁用了。

对于桌面系统,交换空间大小可以是内存的两倍;
对于服务器,使用小的交换空间(比如是物理内存的一般),要监控交换空间的使用情况,如果需要,升级内存。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据