当前位置: 首页 > news >正文

清除系统缓存提高写盘速度的tips

sync; echo 3 > /proc/sys/vm/drop_caches

上面是一个常用于 Linux 系统的命令组合,主要用于清理内存中的缓存。下面是对这条命令的详细解释:

  1. sync
    sync 命令用于将所有未写入磁盘的缓存数据写入磁盘。Linux 操作系统会将一些数据保存在内存中(例如文件系统的缓冲区),以提高性能。执行 sync 命令后,系统会将所有这些缓存数据写入磁盘,从而确保所有文件系统的数据都处于一致状态。这是为了防止在清理缓存时丢失数据。

  2. echo 3 > /proc/sys/vm/drop_caches
    这个命令部分的作用是通过向 /proc/sys/vm/drop_caches 文件写入一个值,来指示内核清理特定的内存缓存。不同的值有不同的作用:

echo 1 > /proc/sys/vm/drop_caches:清理页缓存(page cache)。
echo 2 > /proc/sys/vm/drop_caches:清理目录项缓存(dentries)和 inode 缓存。
echo 3 > /proc/sys/vm/drop_caches:清理页缓存、目录项缓存和 inode 缓存。
其中,3 是 1 和 2 的组合,因此 echo 3 会同时清理页缓存、目录项缓存和 inode 缓存。

  1. 总结
    组合起来看,sync; echo 3 > /proc/sys/vm/drop_caches 命令执行以下操作:

sync 确保所有数据都写入磁盘,避免数据丢失。
echo 3 > /proc/sys/vm/drop_caches 清理内存中的所有缓存,以释放内存空间。
通常,这个命令在需要释放系统内存或进行性能测试时使用。不过,这种操作会导致系统性能暂时下降,因为缓存被清理后,下一次访问数据时可能会需要重新加载到缓存中。

当内存中存储了大量数据缓存时,系统的可用内存会减少。在内存资源紧张的情况下,执行 echo 3 > /proc/sys/vm/drop_caches 可以清理内存中的页缓存、目录项缓存(dentries)和 inode 缓存,从而释放出更多的内存空间供程序使用。
如果系统即将进行新的数据缓存或处理操作,尤其是涉及大量数据的处理任务时,清理缓存可以释放内存,为后续操作提供更多的可用内存。这对于大规模数据处理、批处理任务或内存密集型应用尤其有用。
当系统使用大量内存来缓存数据,然后写入磁盘后,缓存数据通常仍然会保留在内存中,以提高读取性能。然而,这些缓存可能会占用大量内存,使得其他需要内存的操作无法顺利进行。通过清理缓存,系统可以将这些内存资源重新分配给其他任务,提高系统整体的内存利用效率。

posix_fadvise

posix_fadvise 是 POSIX 标准中的一个系统调用,用于向操作系统提供文件访问的建议,以帮助优化文件的读写性能。它允许程序明确告诉操作系统它即将如何使用文件,从而使操作系统可以调整其缓存或内存管理策略,以提高性能。

函数原型

#include <fcntl.h>int posix_fadvise(int fd, off_t offset, off_t len, int advice);

参数说明
fd: 打开的文件描述符。
offset: 起始的字节偏移量,表示从文件的哪个位置开始应用建议。
len: 需要应用建议的长度(字节数)。如果为 0,则表示应用到文件的结尾。
advice: 访问模式建议,它是一个整数,取值如下:
常见的 advice 参数
POSIX_FADV_NORMAL:默认访问模式,表示不作特别优化。
POSIX_FADV_SEQUENTIAL:表示应用程序将按顺序访问文件,操作系统可能会进行预读以加速顺序读取。
POSIX_FADV_RANDOM:表示应用程序将以随机顺序访问文件,操作系统可能会减少预读以避免浪费内存。
POSIX_FADV_NOREUSE:表示应用程序将访问某一文件区域一次,之后不会再访问,因此操作系统可以避免将这部分内容缓存。
POSIX_FADV_WILLNEED:表示应用程序即将需要访问某一文件区域,操作系统可以开始预读这部分数据。
POSIX_FADV_DONTNEED:表示应用程序不再需要某一文件区域的内容,操作系统可以将其从缓存中移除。
返回值
posix_fadvise 的返回值为 0 表示调用成功。失败时,返回一个负值,表示出现错误,并设置相应的 errno。

使用场景
提升性能:通过 posix_fadvise,程序可以帮助操作系统更好地管理文件缓存,从而提升 I/O 性能。例如,数据库管理系统可以使用 POSIX_FADV_SEQUENTIAL 提供顺序读取建议,来减少磁盘 I/O。
降低内存使用:如果知道某些数据不需要缓存,可以使用 POSIX_FADV_DONTNEED 来减少内存的占用。
示例代码
以下是一个简单的示例,使用 posix_fadvise 来告诉操作系统我们将以顺序的方式读取一个文件:

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("Failed to open file");return 1;}// 提供顺序读取建议if (posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL) != 0) {perror("posix_fadvise failed");}// 继续执行文件操作...close(fd);return 0;
}posix_fadvise 提供了一种方式,让开发者能够与操作系统进行交互,优化文件 I/O 操作的性能。通过适当的使用这个系统调用,可以显著改善某些场景下的程序表现

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 并发容器简介
  • 图形零散知识点整理
  • 【STM32】FMC
  • 大模型企业应用落地系列》基于大模型的对话式推荐系统》对话推荐系统技术架构
  • 【数学建模】层次分析法
  • 【pyhton】python如何实现将word等文档中的文字转换成语音
  • 旅游行业怎么利用C#接口发送短信
  • Kafka日志及常见问题
  • 嵌入式开发高频面试题——第二章 C/C++高频面试题(上)
  • 数据仓库系列15:数据集成的常见挑战有哪些,如何应对?
  • Leetcode Hot 100刷题记录 -Day3(双指针)
  • hive中datediff函数介绍
  • Golang | Leetcode Golang题解之第372题超级次方
  • Git之1.0版本重要特性及用法实例(五十二)
  • 嵌入式开发高频面试题——第二章 C/C++高频面试题(下)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • dva中组件的懒加载
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React 快速上手 - 07 前端路由 react-router
  • SegmentFault 2015 Top Rank
  • Webpack 4x 之路 ( 四 )
  • 服务器从安装到部署全过程(二)
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 聊聊flink的BlobWriter
  • ​ArcGIS Pro 如何批量删除字段
  • # Redis 入门到精通(一)数据类型(4)
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #if #elif #endif
  • #include
  • (1)Nginx简介和安装教程
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (第30天)二叉树阶段总结
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (过滤器)Filter和(监听器)listener
  • (接口自动化)Python3操作MySQL数据库
  • (十一)手动添加用户和文件的特殊权限
  • (一)基于IDEA的JAVA基础12
  • (转)C#调用WebService 基础
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ***检测工具之RKHunter AIDE
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .net快速开发框架源码分享
  • .NET企业级应用架构设计系列之开场白
  • .NET中的Exception处理(C#)
  • .net中的Queue和Stack