Linux内核采用多层缓冲机制优化文件I/O性能,减少磁盘访问次数,提高系统吞吐量。
# 查看内存使用和缓存统计 free -h cat /proc/meminfo | grep -E "(Cached|Dirty|Writeback)" # 查看脏页回写配置 sysctl vm.dirty_ratio vm.dirty_background_ratio
MySQL等数据库需要平衡缓冲与一致性:
# MySQL配置示例 innodb_flush_method = O_DIRECT innodb_buffer_pool_size = 4G innodb_flush_log_at_trx_commit = 2
大文件处理建议使用直接I/O:
# 使用dd工具绕过缓存 dd if=input.raw of=/dev/sdb bs=1M oflag=direct
#include <fcntl.h> #include <stdio.h> #include <unistd.h> int main() { int fd; // 方式1:使用O_SYNC强制同步写入 fd = open("data.txt", O_WRONLY | O_SYNC | O_CREAT); if (fd == -1) { perror("open O_SYNC"); return 1; } write(fd, "sync data\n", 10); close(fd); // 方式2:使用O_DIRECT绕过页缓存 fd = open("data.bin", O_RDWR | O_DIRECT | O_CREAT, 0644); if (fd == -1) { perror("open O_DIRECT"); return 1; } // 注意:O_DIRECT要求内存对齐 void *buffer; posix_memalign(&buffer, 4096, 8192); // 4K对齐 write(fd, buffer, 8192); free(buffer); close(fd); return 0; }
#include <fcntl.h> #include <stdio.h> #include <unistd.h> int main() { int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND); if (fd == -1) { perror("open"); return 1; } write(fd, "important log\n", 14); // 强制刷新到磁盘 fsync(fd); // 同步数据和元数据 // fdatasync(fd); // 仅同步数据 close(fd); printf("Data flushed to disk\n"); return 0; }
#include <fcntl.h> #include <stdio.h> int main() { int fd = open("large_file.bin", O_RDONLY); if (fd == -1) { perror("open"); return 1; } // 告诉内核这是顺序访问,启用预读 posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); // 或告知随机访问,禁用预读 // posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM); // 或告知文件不再需要,可释放缓存 // posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); char buffer[4096]; while (read(fd, buffer, 4096) > 0) { // 处理数据 } close(fd); return 0; }
# 增大脏页缓冲区 sysctl -w vm.dirty_ratio=20 sysctl -w vm.dirty_background_ratio=5 # 调整vfs_cache_pressure sysctl -w vm.vfs_cache_pressure=100 # 优化脏页回写间隔 sysctl -w vm.dirty_expire_centisecs=3000 sysctl -w vm.dirty_writeback_centisecs=500
# 使用iostat监控I/O性能 iostat -x 1 # 使用iotop找出I/O密集进程 iotop -o # 使用strace分析I/O调用 strace -c -p <pid>
通过合理配置和使用缓冲机制,可以显著提升文件I/O性能,适用于数据库、日志系统、文件服务器等场景。理解缓冲区工作原理是Linux系统编程的关键技能之一。