Hugo博客公告弹窗

Linux系统Swap调优

   
文章摘要
摘要小助理今天溜号啦……😜

在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
CC BY-NC-SA 4.0 转载请注明
最后更新于 2025-03-10 04:33
clarity统计