清除系统缓存提高写盘速度的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 标准中的一个系统调用,用于向操作系统提供文件访问的建议,以帮助优化文件的读写性能。它允许程序明确告诉操作系统它即将如何使用文件,从而使操作系统可以调整其缓存或内存管理策略,以提高性能。

函数原型

c 复制代码
#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 来告诉操作系统我们将以顺序的方式读取一个文件:

c 复制代码
#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 操作的性能。通过适当的使用这个系统调用,可以显著改善某些场景下的程序表现
相关推荐
TDengine (老段)2 分钟前
TDengine 数学函数 CRC32 用户手册
java·大数据·数据库·sql·时序数据库·tdengine·1024程序员节
心随雨下21 分钟前
Tomcat日志配置与优化指南
java·服务器·tomcat
Kapaseker27 分钟前
Java 25 中值得关注的新特性
java
wljt31 分钟前
Linux 常用命令速查手册(Java开发版)
java·linux·python
撩得Android一次心动34 分钟前
Android 四大组件——BroadcastReceiver(广播)
android·java·android 四大组件
canonical_entropy37 分钟前
Nop平台到底有什么独特之处,它能用在什么场景?
java·后端·领域驱动设计
chilavert31840 分钟前
技术演进中的开发沉思-174 java-EJB:分布式通信
java·分布式
不是株1 小时前
JavaWeb(后端进阶)
java·开发语言·后端
编程火箭车1 小时前
【Java SE 基础学习打卡】02 计算机硬件与软件
java·电脑选购·计算机基础·编程入门·计算机硬件·软件系统·编程学习路线