遇到swap free memory为0怎么办?

本文介绍了一种在实时系统中监控swap空间减少的方法,通过一个脚本来监测前20个vsz使用大的进程变化,结合free命令结果,定位swap空间减少的罪魁祸首。

转载地址:https://blog.youkuaiyun.com/licanhua/article/details/7057143
遇到swap free memory为0怎么办?
在实时系统中,一般swap都使用比较少,最佳状态就是used一直为0,但是 在工作中,我们遇到一个问题,swap的free空间正在不断变小。如果从top结果来看,我们能找出哪些process使用VSZ和RSS比较多,但是并不能确定到底是谁被更多swap。

host:/root-# free

         total       used       free     shared    buffers     cached

Mem: 8050416 8007984 42432 0 1237124 229692

-/+ buffers/cache: 6541168 1509248

Swap: 4200988 4098364 102624 <–蓝色的数字在不断变小。

使用以下脚本,我们就能监测前面20个vsz使用大的进程vsz/rss的变化情况,通过与free结果结合比较,就能确定到底谁被swap了。

while true
do
date
ps -aeo “pid vsz rss comm” | sort -n -k2 | tail -20
free
sleep 10
done >/tmp/monitor.log

作者:licanhua
来源:优快云
原文:https://blog.youkuaiyun.com/licanhua/article/details/7057143
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>好的,我需要帮助用户解决swap activity warning的问题。首先,我得理解swap活动警告的原因。根据引用[1],swap pageins和pageouts过多通常表示内存不足,系统不得不使用交换空间,导致性能下降。接下来,我需要整理解决步骤。 第一步应该是检查当前内存使用情况。用户可以使用free -h或者vmstat来查看内存和交换分区的使用情况。如果发现swap使用率高,说明内存不足。然后,分析具体进程的内存消耗,可以用top或ps命令,找出占用内存大的进程,考虑是否优化或关闭。 接下来,调整内存分配策略。根据引用[4],vm.overcommit的设置可能会影响内存分配。用户需要检查/proc/sys/vm/overcommit_memory的值,适当调整overcommit_ratio,确保系统不会过度承诺内存,从而减少swap使用。 然后,优化应用程序的内存使用。这可能包括代码优化,减少内存泄漏,或者调整数据库的配置。比如引用[3]提到维护操作如VACUUM需要maintence_work_mem,适当增加这个参数可能提升性能,减少临时内存需求。 系统资源隔离也是一个方法,引用[2]提到用cpuset将进程绑定到特定CPU,可能优化资源使用,但需要评估是否适用当前场景。此外,增加物理内存或调整交换空间大小也是根本解决办法。如果内存确实不足,添加更多RAM或创建更大的swap分区会有帮助。 最后,监控和测试。持续使用工具如sar监控内存和swap变化,调整后观察警告是否减少。同时,确保所有配置修改后系统稳定,性能提升。 需要确保每个步骤都有对应的命令或配置方法,用户能逐步操作。同时,引用相关文献支持建议,比如调整overcommit_ratio引用[4],cpuset引用[2]等。最后生成相关问题,帮助用户深入理解。</think>### 解决 Swap Activity Warning 的步骤 #### 1. **确认 Swap 使用情况与内存状态** - **查看内存与交换分区使用率**: ```bash free -h # 查看内存和交换分区的总量、使用量及剩余量 vmstat 1 5 # 观察内存、交换分区的实时变化(每秒1次,共5次) ``` - 如果 `si`(swap-in)和 `so`(swap-out)持续大于0,说明系统频繁使用交换分区[^1]。 - **识别高内存进程**: ```bash top # 按内存使用排序(Shift+M) ps aux --sort=-%mem | head -n 10 # 列出前10个内存占用最高的进程 ``` #### 2. **调整内存分配策略** - **修改 `vm.overcommit` 参数**(需 root 权限): ```bash # 查看当前配置 cat /proc/sys/vm/overcommit_memory # 临时设置为1(允许超量分配,但需结合overcommit_ratio) sysctl vm.overcommit_memory=1 # 永久生效:在/etc/sysctl.conf中添加 vm.overcommit_memory=1 ``` - **计算 `vm.overcommit_ratio`**(引用[4]): $$ \text{overcommit\_ratio} = \frac{\text{物理内存} - (0.026 \times \text{gp\_vmem\_rq})}{\text{物理内存}} $$ 示例:若物理内存为 256GB,计算结果为 98,则设置: ```bash sysctl vm.overcommit_ratio=98 ``` #### 3. **优化应用程序内存使用** - **数据库类优化**(如 PostgreSQL): - 调整 `maintence_work_mem`(引用[3]): ```sql ALTER SYSTEM SET maintence_work_mem = '2GB'; # 根据实际内存调整 ``` - **代码层优化**: - 检查内存泄漏(使用 `valgrind` 或 `gdb`)。 - 减少大对象缓存,改用流式处理。 #### 4. **系统资源隔离(可选)** - 使用 **cpuset** 绑定关键进程到特定 CPU(引用[2]): ```bash # 示例:将进程绑定到 CPU0-7 echo 0-7 > /dev/cpuset/top-app/cpus echo <PID> > /dev/cpuset/top-app/tasks ``` #### 5. **物理内存与交换空间扩展** - **增加物理内存**:直接升级硬件。 - **调整交换分区**: ```bash # 创建新交换文件(示例:4GB) fallocate -l 4G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 永久生效:在/etc/fstab中添加 /swapfile swap swap defaults 0 0 ``` #### 6. **持续监控与验证** - **长期监控工具**: ```bash sar -r 60 # 每60秒报告一次内存/交换分区使用率 sar -B # 查看分页活动详情 ``` - **验证优化效果**:观察 `vmstat` 输出中 `si/so` 是否降低。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值