清理缓存和内存 【sync; echo 3 > /proc/sys/vm/drop_caches && swapoff -a && swapon -a】

本文详细介绍了如何在Linux系统中安全地清理页面缓存和交换空间,包括单独清除页面缓存、目录项和inode,以及通过shell脚本实现定时清理。讨论了清理缓存对系统性能的影响,并警告在生产环境中自动清理缓存可能导致的风险。

如何在 Linux 中清除缓存(Cache)?

每个 Linux 系统有三种选项来清除缓存而不需要中断任何进程或服务。

(LCTT 译注:Cache,译作“缓存”,指 CPU 和内存之间高速缓存。Buffer,译作“缓冲区”,指在写入磁盘前的存储再内存中的内容。在本文中,Buffer 和 Cache 有时候会通指。)

  1. 仅清除页面缓存(PageCache)

    1. # sync; echo 1 > /proc/sys/vm/drop_caches
  2. 清除目录项和inode

    1. # sync; echo 2 > /proc/sys/vm/drop_caches
  3. 清除页面缓存,目录项和inode

    1. # sync; echo 3 > /proc/sys/vm/drop_caches

上述命令的说明:

sync 将刷新文件系统缓冲区(buffer),命令通过“;”分隔,顺序执行,shell在执行序列中的下一个命令之前会等待命令的终止。正如内核文档中提到的,写入到drop_cache将清空缓存而不会杀死任何应用程序/服务,echo命令做写入文件的工作。

如果你必须清除磁盘高速缓存,第一个命令在企业和生产环境中是最安全,"...echo 1> ..."只会清除页面缓存。 在生产环境中不建议使用上面的第三个选项"...echo 3 > ..." ,除非你明确自己在做什么,因为它会清除缓存页,目录项和inodes。

在Linux上释放也许被内核所使用的缓冲区(Buffer)和缓存(Cache)是否是个好主意?

当你设置许多设定想要检查效果时,如果它实际上是专门针对 I/O 范围的基准测试,那么你可能需要清除缓冲区和缓存。你可以如上所示删除缓存,无需重新启动系统(即无需停机)。

Linux被设计成它在寻找磁盘之前到磁盘缓存寻找的方式。如果它发现该资源在缓存中,则该请求不会发送到磁盘。如果我们清理缓存,磁盘缓存就起不到作用了,系统会到磁盘上寻找资源。

此外,当清除缓存后它也将减慢系统运行速度,系统会将每一个被请求的资源再次加载到磁盘缓存中。

现在,我们将创建一个 shell 脚本,通过一个 cron 调度任务在每天下午2点自动清除RAM缓存。如下创建一个 shell 脚本 clearcache.sh 并在其中添加以下行:

  1. #!/bin/bash
  2. # 注意,我们这里使用了 "echo 3",但是不推荐使用在产品环境中,应该使用 "echo 1"
  3. echo "echo 3 > /proc/sys/vm/drop_caches"

给clearcache.sh文件设置执行权限

  1. # chmod 755 clearcache.sh

现在,当你需要清除内存缓存时只需要调用脚本。

现在设置一个每天下午2点的定时任务来清除RAM缓存,打开crontab进行编辑。

  1. # crontab -e

添加以下行,保存并退出。

  1. 0 3 * * * /path/to/clearcache.sh

 

有关如何创建一个定时任务,crontab -{e/l/r} 编辑/查看/删除,更新:crontab crontabFileName,服务:service crond start/stop/status

系统文件路径是 /etc/crontab;个人存放路径建议:/var/spool/cron/ 或者 /var/cron/tabs/

 

在生产环境的服务器上自动清除RAM是否是一个好主意?

不!它不是。想想一个情况,当你已经预定脚本在每天下午2点来清除内存缓存。那么其时该脚本会执行并刷新你的内存缓存。在某一天由于某些原因,可能您的网站的在线用户会超过预期地从你的服务器请求资源。

而在这时,按计划调度的脚本运行了,并清除了缓存中的一切。当所有的用户都从磁盘读取数据时,这将导致服务器崩溃并损坏数据库。因此,清除缓存仅在必要时并且在你的预料之中,否则你就是个呆瓜系统管理员。

如何清除Linux的交换空间?

如果你想清除掉的空间,你可以运行下面的命令:

  1. # swapoff -a && swapon -a

此外,了解有关风险后,您可以将上面的命令添加到cron中。

现在,我们将上面两种命令结合成一个命令,写成正确的脚本来同时清除RAM缓存和交换空间。

  1. # echo 3 > /proc/sys/vm/drop_caches && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'

  1. su -c 'echo 3 > /proc/sys/vm/drop_caches' && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'

在测试上面的命令之前,我们在执行脚本前后运行“free -m” 来检查缓存。

转载于:https://www.cnblogs.com/getFive101/p/11422052.html

<think>我们正在解决交换分区操作失败的问题,包括`swapoff`失败(无法分配内存`swapon`失败(文件或目录不存在)。根据用户提供的错误信息之前的分析,我们将深入探讨原因并提供解决方案。###1.`swapoff`失败:无法分配内存####原因分析当执行`swapoff`命令时,系统需要将交换分区中的数据全部读回物理内存。如果交换分区中已使用的数据量大于当前可用的物理内存,系统将无法分配足够的内存空间,导致操作失败。具体表现为:$$\text{可用物理内存}< \text{交换空间已用数据量}$$####解决方案**方案一:释放现有内存**-释放页缓存(不影响运行中的应用程序):```bashsudosysctlvm.drop_caches=1#释放页缓存sudosysctlvm.drop_caches=2#释放目录项inode缓存sudosysctlvm.drop_caches=3#释放所有缓存(页缓存+目录项缓存+inode缓存)```建议先尝试`vm.drop_caches=1`,因为它对系统性能影响最小[^1]。-停止非关键服务:```bashsudosystemctlstop<service_name>#如cups,unattended-upgrades等非必需服务```-手动终止占用大量内存的进程(通过`top`或`htop`查看)。**方案二:分步关闭交换分区**如果系统中有多个交换分区(例如`/dev/sda1`、`/dev/sda2`),可以逐个关闭:1.查看各交换分区使用量:```bashswapon--show```2.优先关闭使用量最小的交换分区:```bashsudoswapoff/dev/sda2#假设sda2使用量最小```3.重复直到目标交换分区(如`/dev/sda5`)被关闭。**方案三:创建临时交换空间**在关闭原交换分区前,先创建一个临时交换文件:1.计算需要创建的临时交换文件大小(建议为原交换分区已用量的1.2倍):```bashswap_used=$(grepSwapUsed/proc/meminfo|awk&#39;{print$2}&#39;)swap_needed=$((swap_used*120/100))#单位:KB```2.创建并启用临时交换文件:```bashsudofallocate-l${swap_needed}K/tmp/swap_tempsudomkswap/tmp/swap_tempsudoswapon/tmp/swap_temp```3.关闭原交换分区:```bashsudoswapoff/dev/sda5```4.清理临时交换文件:```bashsudoswapoff/tmp/swap_temp&&sudorm/tmp/swap_temp```**方案四:强制关闭(风险高)**允许内存过载,触发OOMKiller:```bashecho1|sudotee/proc/sys/vm/overcommit_memorysudoswapoff/dev/sda5```此操作可能导致关键进程被终止[^2]。---###2.`swapon`失败:文件或目录不存在####原因分析-**路径错误**:指定的交换分区或文件路径不存在(如`/dev/sda5`已被删除或未格式化)。-**未初始化**:未使用`mkswap`初始化交换分区。-**挂载点变更**:重启后设备名变化(如`/dev/sda5`变为`/dev/sdb5`)。####解决方案**方案一:检查路径有效性**-确认设备或文件存在:```bashsudofdisk-l|grepswap#检查交换分区ls-lh/swapfile#检查交换文件```如果设备名改变,使用新设备名(如`/dev/sdb5`)或文件路径。**方案二:初始化交换分区**对新的或未格式化的分区执行初始化:```bashsudomkswap/dev/sda5#针对分区sudomkswap/swapfile#针对文件```**方案三:更新`/etc/fstab`配置**1.获取正确分区UUID:```bashsudoblkid|grepswap```2.在`/etc/fstab`中使用UUID替代设备路径:```原有错误配置/dev/sda5swapswapdefaults00```修改为:```bashUUID=123e4567-e89b-12d3-a456-426614174000swapswapdefaults00```3.重新激活:```bashsudoswapoff-asudoswapon-a```**方案四:重建交换文件**如果交换文件损坏或路径错误:```bashsudoddif=/dev/zeroof=/swapfilebs=1Mcount=4096#创建4GB文件sudochmod600/swapfilesudomkswap/swapfilesudoswapon/swapfile```---###诊断命令-**查看内存交换使用情况**:```bashfree-hgrep-iswap/proc/meminfo```-**检查活动交换区**:```bashswapon--show```-**定位占用交换空间的进程**:```bashsudosmem-t-k|grep-iswap```---###预防措施1.**合理配置交换空间大小**:-当物理内存(RAM)小于4GB时:$$\text{交换空间大小}\geq2\times\text{物理内存大小}$$-当物理内存大于8GB时:$$\text{交换空间大小}\geq\text{物理内存大小}$$2.**优先使用交换文件而非分区**:```bash#创建交换文件(示例:8GB)sudofallocate-l8G/swapfilesudomkswap/swapfilesudoswapon/swapfile```§§相关问题§§1.如何永久关闭交换空间?2.系统没有交换分区会有什么影响?3.如何调整进程的OOMKiller优先级?4.`vm.drop_caches`的不同参数(1,2,3)有何具体区别?</think> ### 一、`swapoff`失败(无法分配内存)的终极解决方案 #### 根本原因分析 当执行`swapoff /dev/sda5`时,系统需要将交换分区中的数据全部加载到物理内存。若满足: $$ \text{可用物理内存} < \text{交换空间已用数据量} $$ 则操作失败(如图示),触发内核内存分配限制机制[^2]。 ```mermaid graph LR A[swapoff /dev/sda5] --> B{内存是否足够?} B ----> C[成功] B ----> D[OOM Killer介入] D --> E{终止进程释放内存?} E -- 成功 --> C E -- 失败 --> F[swapoff失败] ``` #### 四级解决方案(按优先级) 1. **安全释放内存(推荐)** ```bash # 释放页缓存(安全) sudo sync && echo 3 | sudo tee /proc/sys/vm/drop_caches # 停止非核心服务 sudo systemctl stop unattended-upgrades cups bluetooth # 重试关闭交换分区 sudo swapoff -v /dev/sda5 ``` > 📌 `drop_caches=3` 清除页缓存、目录项inode缓存[^1] 2. **分阶段关闭交换** ```bash # 1. 查看所有交换分区 swapon --show # 2. 按使用量从小到大的顺序关闭 sudo swapoff /dev/sda3 # 先关最小的 sudo swapoff /dev/sda2 # 再关中等 sudo swapoff /dev/sda5 # 最后关最大的 ``` 3. **临时交换空间法** ```bash # 计算需临时交换空间(单位:MB) SWAP_NEEDED=$(($(grep SwapUsed /proc/meminfo | awk &#39;{print $2}&#39;)/1024 + 100)) # 创建临时交换文件 sudo fallocate -l ${SWAP_NEEDED}M /swap_temp sudo mkswap /swap_temp && sudo swapon /swap_temp # 关闭原交换分区 sudo swapoff /dev/sda5 # 清理临时文件 sudo swapoff /swap_temp && sudo rm /swap_temp ``` 4. **强制模式(危险)** ```bash # 启用内存过载分配 echo 1 | sudo tee /proc/sys/vm/overcommit_memory # 强制关闭(可能触发OOM Killer) sudo swapoff -f /dev/sda5 ``` ⚠️ 此操作可能导致关键进程被终止 --- ### 二、`swapon`失败(文件或目录不存在)解决方案 #### 原因诊断矩阵 | 现象 | 可能原因 | 检测命令 | |------|----------|----------| | `/dev/sda5` 不存在 | 磁盘重新分区 | `sudo fdisk -l` | | 文件路径错误 | 配置错误 | `ls -l /swapfile` | | 未初始化 | 缺少 `mkswap` | `sudo blkid` | | 文件系统损坏 | 数据损坏 | `sudo fsck /dev/sda5` | #### 分步修复方案 1. **确认设备存在** ```bash sudo fdisk -l | grep sda5 sudo lsblk -f | grep swap ``` 2. **重新初始化交换空间** ```bash # 使用UUID方式更可靠 UUID=$(sudo blkid -s UUID -o value /dev/sda5) sudo mkswap -U $UUID /dev/sda5 ``` 3. **修复文件系统** ```bash # 卸载后检查 sudo umount /dev/sda5 2>/dev/null sudo fsck -y /dev/sda5 ``` 4. **更新/etc/fstab** ```bash # 获取正确UUID sudo blkid /dev/sda5 # 修改fstab(示例) echo "UUID=123e4567-e89b-12d3 swap swap defaults 0 0" | sudo tee -a /etc/fstab sudo mount -a ``` 5. **创建新交换文件** ```bash sudo fallocate -l 4G /swapfile_new sudo chmod 600 /swapfile_new sudo mkswap /swapfile_new sudo swapon /swapfile_new ``` --- ### 三、预防性维护 #### 1. 内存优化配置 ```bash # 限制进程内存使用 sudo systemctl set-property mysql.service MemoryMax=2G # 优化交换倾向性(0-100) echo &#39;vm.swappiness=10&#39; | sudo tee /etc/sysctl.d/99-swap.conf ``` > ✅ 推荐 `swappiness` 值: > - SSD存储:10 > - HDD存储:30 #### 2. 交换空间监控脚本 ```bash #!/bin/bash THRESHOLD=80 # 内存使用阈值% while sleep 300; do MEM_USE=$(free | awk &#39;/Mem/{print $3/$2*100}&#39;) if (( $(echo "$MEM_USE > $THRESHOLD" | bc -l) )); then logger "内存告警:自动释放缓存" sync && echo 3 > /proc/sys/vm/drop_caches fi done ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值