Linux添加Swap交换分区,解决内存不足问题
前言
服务器内存不够用了?MySQL 启动就报内存不足?或者运行着运行着就被 OOM Killer 杀进程了?这时候除了加内存条,还有个应急办法——加 Swap 交换分区。Swap 就是把磁盘的一部分当内存用,虽然慢,但能救急。本文就讲一下怎么在 Linux 下添加 Swap 交换分区。
什么是 Swap
Swap 交换分区,就是把磁盘的一部分空间当作内存来用。当物理内存不够的时候,系统会把不常用的内存数据换到磁盘上,腾出物理内存给正在用的进程。
注意: Swap 只是应急方案,不能当内存用。磁盘比内存慢几百倍,如果频繁使用 Swap,系统会非常卡。
第一步:查看当前 Swap 情况
先看看现在有没有 Swap,多大:
free -h
输出示例:
total used free shared buff/cache available
Mem: 1.8Gi 1.2Gi 200Mi 50Mi 400Mi 300Mi
Swap: 0B 0B 0B
上面的例子里 Swap 是 0B,说明没有配置 Swap。
也可以看:
swapon -s
第二步:创建 Swap 文件
我们用文件的方式创建 Swap,比分区方式灵活,随时可以删。
1. 创建一个 2G 的 Swap 文件
dd if=/dev/zero of=/swapfile bs=1M count=2048
参数说明:
if=/dev/zero:输入源,零设备of=/swapfile:输出文件bs=1M:块大小1Mcount=2048:2048块,也就是2G
2. 设置文件权限
chmod 600 /swapfile
必须设置成 600,不然系统不认。
3. 格式化成 Swap
mkswap /swapfile
输出会显示:
Setting up swapspace version 1, size = 2097151 KiB
no label, UUID=xxxx-xxxx
第三步:启用 Swap
swapon /swapfile
查看是否启用成功:
free -h
现在应该能看到 Swap 那行有数值了。
第四步:配置开机自动挂载
写入 /etc/fstab,重启后自动启用。
vi /etc/fstab
在最后一行添加:
/swapfile swap swap defaults 0 0
第五步:调整 Swap 使用优先级
Linux 默认是尽量用物理内存,Swap 只用在内存不够的时候。这个策略一般不用改。
如果想调整 Swap 的使用倾向,可以改 /etc/sysctl.conf:
vm.swappiness = 10
swappiness 值范围是 0~100:
0:尽量不用 Swap100:积极使用 Swap10:推荐值,内存不够才用 Swap
改完执行:
sysctl -p
常见操作
查看 Swap 使用情况
swapon -s
关闭 Swap
swapoff /swapfile
删除 Swap
swapoff /swapfile
rm /swapfile
然后把 /etc/fstab 里那行也删掉。
实际应用场景
场景1:MySQL 启动报内存不足
MySQL 启动的时候需要加载很多数据到内存,如果内存不够会直接启动失败。加个 Swap 就能启动了。
场景2:临时跑大任务
有时候要临时跑个大任务,内存不够,加个 Swap 救急。
场景3:防止 OOM Killer 杀进程
内存不够的时候,系统会用 OOM Killer 杀掉占内存最多的进程。加个 Swap 能缓冲一下,避免直接被杀。
常见坑
坑1:Swap 文件权限不对
创建完 Swap 文件之后忘了 chmod 600,结果 swapon 报错。
解决: 一定要先设置权限:
chmod 600 /swapfile
坑2:/etc/fstab 写错了
和挂载硬盘一样,/etc/fstab 写错了重启会进不去系统。
解决: 改完先执行 swapon -a 测试一下。
坑3:Swap 太大了影响性能
Swap 不是越大越好。如果 Swap 用得很频繁,系统会非常卡,因为磁盘比内存慢几百倍。
建议: Swap 大小设成物理内存的 0.5~2 倍就够了。比如 2G 内存,Swap 设 2~4G 就行。
坑4:SSD 上放 Swap 还好,机械硬盘上放 Swap 很卡
如果是机械硬盘,频繁读写 Swap 会非常卡。SSD 还好一点。
总结
添加 Swap 的完整流程:
- dd 创建 Swap 文件
- chmod 600 设置权限
- mkswap 格式化
- swapon 启用
- 写 /etc/fstab 开机自动挂载
- 调整 swappiness 优先级
Swap 只是应急方案,真正解决内存不足还是要加物理内存。但应急的时候,Swap 确实能救一命。
遇到问题加QQ23979811 协助处理
Linux查看内存使用情况,free和vmstat命令详解
前言
服务器卡了,第一反应就是看看内存够不够用。很多人一看到 free 很少就慌了,觉得内存不够要扩容。其实 Linux 的内存管理和 Windows 不一样,free 少不代表内存真的不够。本文就讲一下怎么用 free 和 vmstat 两个命令正确查看内存使用情况。
free 命令
基本用法
直接输入:
free
输出示例:
total used free shared buff/cache available
Mem: 8165036 4000000 2000000 50000 2165036 4000000
Swap: 2097148 0 2097148
输出详解
| 列 | 含义 |
|---|---|
total |
总内存大小 |
used |
已使用的内存 |
free |
完全空闲的内存 |
shared |
共享内存 |
buff/cache |
缓存和缓冲区占用的内存 |
available |
真正可用的内存(重点看这列) |
重点:available 才是真正可用的内存
很多人只看 free 列,看到只剩几百M就慌了。其实 Linux 会把空闲内存都用来做缓存(buff/cache),这些缓存是可以随时回收的。
看 available 列才是真正可用的内存。 比如上面的例子,free 只有2G,但 available 有4G,说明还有4G内存可以用。
free 常用参数
free -h
以人类可读的格式显示(自动用G/M/K单位):
total used free shared buff/cache available
Mem: 7.8Gi 3.8Gi 1.9Gi 50Mi 2.1Gi 3.8Gi
Swap: 2.0Gi 0B 2.0Gi
free -m
以MB为单位显示。
free -g
以GB为单位显示。
free -s 5
每5秒刷新一次。
free -c 3
总共显示3次后退出。
vmstat 命令
基本用法
直接输入:
vmstat
输出示例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 2000000 50000 2100000 0 0 10 20 100 50 5 2 92 1 0
输出详解
procs 进程部分:
r:等待运行的进程数b:处于不可中断睡眠的进程数
memory 内存部分:
swpd:已用的交换分区大小free:空闲内存buff:缓冲区大小cache:缓存大小
swap 交换分区部分:
si:从磁盘交换到内存的速度(KB/s)so:从内存交换到磁盘的速度(KB/s)
io 磁盘I/O部分:
bi:从磁盘读取的速度(块/s)bo:写入磁盘的速度(块/s)
cpu CPU部分:
us:用户态CPU占用sy:内核态CPU占用id:空闲CPUwa:等待I/O的CPUst:被虚拟机偷走的CPU
vmstat 常用参数
vmstat 1
每秒刷新一次,按 Ctrl+C 退出。
vmstat 1 5
每秒刷新一次,总共刷新5次。
vmstat -s
显示内存统计信息。
怎么判断内存够不够用
看 available 够不够
free -h
看 available 列,如果 available 还有几百M以上,说明内存够用。
看 swap 用了多少
free -h
如果 Swap 的 used 列有数值,说明物理内存不够用了,系统在把内存数据换到磁盘上。这时候性能会大幅下降。
看 si 和 so
vmstat 1
如果 si 和 so 列长期不为0,说明系统在频繁换页,内存不够用了。
实际排查案例
案例1:内存够不够
free -h
看 available 列,如果还有几个G,说明内存够用。
案例2:系统变慢,怀疑内存不足
vmstat 1
看 si 和 so 是不是很高,如果很高说明在频繁换页,内存不够。
案例3:哪个进程占内存最多
top
按 M 键按内存排序,看哪个进程占的内存最多。
常见坑
坑1:把 free 少当成内存不足
Linux 的内存管理机制和 Windows 不一样,空闲内存都用来做缓存了,buff/cache 那部分是可以随时回收的。看 available 列才是真正可用的内存。
坑2:看到 swap 用了就慌
如果 swap 用了一点,但 si 和 so 都是0,说明那是历史遗留的,不影响性能。只有当 si 和 so 长期不为0的时候才是问题。
坑3:内存不够就随便扩容
内存不够的原因可能有很多:
- 某个程序内存泄漏
- 数据库缓存配置太大
- 日志缓存没配置
先找出原因,再决定要不要扩容。
总结
查看内存使用情况的核心命令:
- free -h:快速看内存总览,重点看
available列 - vmstat 1:实时监控内存和换页情况,看
si和so - top 按M:看哪个进程占内存最多
记住一个原则:Linux 的 free 少不是问题,available 少才是问题。
遇到问题加QQ23979811 协助处理