在Linux系统中,swap是为了
减少内存压力
而设立的一种临时存储空间
,当系统内存不足时,会将一部分内存交换到swap分区中。但是,当系统运行多个程序或进程时,swap会频繁的写入和读取数据
,对硬盘进行频繁的访问,从而导致系统变慢
。
如果你的系统内存足够并且感觉swap对系统性能没有多大帮助,可以考虑将swap关闭。
建议禁止使用swap,除非你内存吃紧,或者调整vm.swappiness参数为10
查看主配置文件是否包含该参数
grep "vm.swappiness" /etc/sysctl.conf
检查自定义配置文件是否包含该参数
grep "vm.swappiness" /etc/sysctl.d/*.conf
临时调整vm.swappiness参数为10, 重启失效
sysctl -w vm.swappiness=10
查看当前生效值
cat /proc/sys/vm/swappiness
或者
sysctl vm.swappiness
1.持久化配置(推荐)
若要确保重启后 vm.swappiness=1 仍然生效,需手动写入配置文件:
echo "vm.swappiness = 1" | sudo tee /etc/sysctl.d/99-swap.conf
立即加载配置(无需重启)
sudo sysctl -p /etc/sysctl.d/99-swap.conf
2.验证配置生效
cat /etc/sysctl.d/99-swap.conf
确认当前值(应为 1)
cat /proc/sys/vm/swappiness
统一设置
# 1. 备份 sysctl.conf
cp /etc/sysctl.conf /etc/sysctl.conf.bak
# 2. 查找并显示所有包含 vm.swappiness 的文件
find /etc/sysctl.d/ /etc/sysctl.conf -type f -exec grep -l "vm.swappiness" {} \;
# 3. 从所有相关文件中删除 vm.swappiness 设置
sudo sed -i '/^vm.swappiness/d' /etc/sysctl.conf
sudo find /etc/sysctl.d/ -type f -name "*.conf" -exec sed -i '/^vm.swappiness/d' {} \;
# 4. 添加新的配置
echo "vm.swappiness = 10" | sudo tee /etc/sysctl.d/99-swap.conf
# 5. 重新加载所有配置
sudo sysctl --system
查看 Swap 使用情况
free -h | grep -i swap
swapon --show
或者
echo -e "\n\033[1;34m[Swap Usage]\033[0m"
free -h | awk '/^Swap:/ {printf "Total: %s | Used: %s | Free: %s\n", $2, $3, $4}'
echo -e "\n\033[1;34m[Active Swap Partitions]\033[0m"
swapon --show | column -t
一键添加删除swap脚本
1G或者2G内存,可以设置swap为1G,即1024Mb
curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/swap.sh && chmod +x swap.sh && ./swap.sh
永久调整 vm.swappiness参数为1(优先使用物理内存,迫不得已使用swap)
curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/vm.sh && chmod +x vm.sh && ./vm.sh
使用free命令查看swap的使用情况
sudo free -m
查询当前系统中启用了哪些交换分区
sudo swapon -s
禁用命令
sudo swapoff -a
启用命令
sudo swapon -a
验证
free -m
swapon --show
永久关闭swap分区
备份原文件(可选)
cp /etc/fstab /etc/fstab.bak
注释或删除 fstab 中所有 swap 条目
sed -i '/swap/s/^/#/' /etc/fstab
或者
sed -ri 's/.*swap.*/#&/' /etc/fstab
或手动编辑文件,找到 swap 行添加 # 注释
nano /etc/fstab
删除 Swap 文件/分区(可选)
rm -f /swapfile
重启系统验证
reboot
# 重启后检查
swapon --show # 应无输出
free -h | grep -i swap # Swap 行显示 0
恢复 Swap 的命令
恢复 fstab 中的 swap 条目
sed -i '/swap/s/^#//' /etc/fstab
重新激活 Swap
swapon -a
验证恢复
swapon --show
free -h | grep -i swap
调优
- vm.dirty_ratio:当内存中待保存的数据超过这个比例时,系统会强制暂停所有新操作,先把数据写入硬盘,可能导致卡顿。
- vm.dirty_background_ratio:当数据达到这个更低比例时,系统会在后台偷偷开始保存,不影响你正常使用。
vm.dirty_background_ratio(后台刷盘阈值): 像城市早高峰时,交警在车流达到主路容量的 5% 时,悄悄引导部分车辆绕行辅路,避免主路拥堵,司机甚至没察觉绕行。
vm.dirty_ratio(强制刷盘阈值): 当车流冲上主路容量的 15%,交警直接封路,所有车辆原地熄火等清场,司机骂娘但路终于通了。 为何必须配合? 如果只有绕行(后台刷盘),车流可能冲爆主路(内存耗尽)。 如果只有封路(强制刷盘),早晚高峰直接瘫痪(卡顿频繁)。 最佳实践:绕行提前减压,封路兜底保命,交通(系统)才能丝滑! 🚗💨
查看实时脏页大小(单位:KB)
watch -n 1 'cat /proc/meminfo | grep Dirty'
统计脏页刷盘频率
vmstat 1 5
临时生效(重启后失效)
sudo sysctl -w vm.dirty_ratio=15
sudo sysctl -w vm.dirty_background_ratio=5
持久化设置
echo "vm.dirty_ratio = 15" | sudo tee -a /etc/sysctl.conf
echo "vm.dirty_background_ratio = 5" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
验证
sysctl vm.dirty_ratio
sysctl vm.dirty_background_ratio
移除参数
# 1. 从 sysctl.conf 中移除
sudo sed -i '/^vm.dirty_ratio/d' /etc/sysctl.conf
sudo sed -i '/^vm.dirty_background_ratio/d' /etc/sysctl.conf
# 2. 从 sysctl.d 目录中移除
sudo sed -i '/^vm.dirty_ratio/d' /etc/sysctl.d/*.conf
sudo sed -i '/^vm.dirty_background_ratio/d' /etc/sysctl.d/*.conf
# 3. 重新加载配置使其生效
sudo sysctl --system
# 4. 验证参数是否已恢复默认值
sysctl vm.dirty_ratio
sysctl vm.dirty_background_ratio
oom设置
OOM(内存耗尽)是系统内存不足时强制终止最耗内存的进程以自救的“保命”机制。
查看哪些进程在使用交换空间
for file in /proc/*/status ; do
awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file;
done | sort -k 2 -n -r | head -n 10
查看id,例如
pgrep -x clickhouse-serv
设置为 -900 来保护 clickhouse-serv
echo -900 > /proc/2335/oom_score_adj
立即验证
cat /proc/2335/oom_score_adj
cat /proc/2335/oom_score
或者
# MySQL
mysql_pid=$(pgrep -x mysqld)
echo -900 > /proc/$mysql_pid/oom_score_adj
# ClickHouse
clickhouse_pid=$(pgrep -x clickhouse-serv)
echo -900 > /proc/$clickhouse_pid/oom_score_adj