清除系统缓存提高写盘速度的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 操作的性能。通过适当的使用这个系统调用,可以显著改善某些场景下的程序表现
相关推荐
Ty_11061 分钟前
深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎
java·开发语言·jvm
蔚一23 分钟前
Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)
java·后端·设计模式·intellij-idea·开闭原则
cesske29 分钟前
java 学习从零到精通之历程
java
爱吃香蕉的猴哥31 分钟前
Spring AOP
java·后端·spring
Sebastian Wang1 小时前
【学习归纳自我总结版】尚硅谷学习第一天
java·学习
青灯古佛初照1 小时前
EasyExcel 动态表头+表头合并
java·excel
goldfishsky1 小时前
Gson转换
java·开发语言
小巫医初春1 小时前
【EasyExcel】@ColumnWidth(value = 20) EasyExcel设置列宽不生效
java
学Java的skyyyyyyyy1 小时前
Java面向对象
java·开发语言
SkyrimCitadelValinor1 小时前
Java【反射机制】
java