【星海出品】Linux大文件处理

在未生成大文件之前最好使用专门的日志管理工具(如logrotate)来管理日志文件的滚动和备份。这些工具通常具有更好的性能和更高的可靠性。

文件可以同时被写入和读取,在并发读写同一个文件时,可能会遇到性能瓶颈或竞争条件

用户 -> 内存 -> 缓存 -> 文件

用户态于内核态的转换可以参考:
https://blog.csdn.net/weixin_41997073/article/details/135266386


在大文件的处理前,最好先进行大的 I/O 处理。

bash 复制代码
测试写入性能:
time dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
测试读取性能:
time dd if=testfile of=/dev/null bs=1G count=1 iflag=direct

dd命令完成后会显示所用的时间和传输速率(如MB/s)。


dd 命令可以用来备份大的文件,但最好是没有程序在持续写入。

bash 复制代码
dd if=<source_file> of=<target_file>

如果没有空间的话,可以先通过 mount 挂载过来一个空间区域,进行备份。

dd命令理论上可以备份正在被写入的日志文件的前半部分

dd命令是一个底层工具,用于直接复制数据块。在备份正在被写入的文件时,由于文件内容的变化,dd命令可能需要多次尝试读取同一个数据块,这会降低备份的效率和性能。


然而如果想要只拷贝一半文件,需要进行前置操作比较多

1.首先查看磁盘的字节数

bash 复制代码
ls -l filename | awk '{print $5}'
du -b filename

注意:此处最好以 du 查看为准,因为 du 是以占据的 block 为基础进行计算的,和 dd 以 block 为单位备份一致。

bash 复制代码
total_bytes=1000000  # 文件的总字节数  
bytes_to_backup=500000  # 要备份的字节数  
block_size=4096  # 块大小,例如4k  
count=$((bytes_to_backup / block_size + (bytes_to_backup % block_size > 0 ? 1 : 0)))  
dd if=filename of=filename_half.backup bs=$block_size count=$count

备份后要使用 md5sum 进行验证

bash 复制代码
md5sum <file>

head -c 500000 filename | md5sum  
md5sum filename_half.backup  

假设你有一个名为 logfile.log 的正在写入的日志文件,你想要备份它到另一个目录 /backup/:

可以使用另一个工具进行备份

bash 复制代码
rsync -avz /path/to/logfile.log /backup/

该工具的优点是支持增量备份。

bash 复制代码
rsync -avz --delete --ignore-errors /var/log/ /backup/

如果你想要定期运行备份,并且只备份自上次备份以来更改过的文件,你可以使用 --delete 选项(小心使用,因为它会删除目标目录中源目录中不存在的文件)和 --ignore-errors 选项(防止由于某些文件无法读取而导致的整个备份失败):


正在被写入的大文件可以使用 logrotate 进行处理

如果日志文件正在被写入,logrotate 会使用 copytruncate 选项(或类似的机制)来确保数据的一致性。

这通常意味着它会先复制日志文件到一个新的位置,然后清空原始文件以开始新的日志记录。由于复制和清空之间有一个时间差,可能会丢失部分日志数据,但通常这是一个可以接受的风险,因为 logrotate 设计的初衷就是为了管理大量的日志文件。

如果你不希望丢失任何数据,可以考虑使用 delaycompress 选项来延迟压缩操作,直到下一次轮转周期。

在配置文件中使用 postrotate 和 endscript 部分来定义在转储后需要执行的命令,比如重新加载应用程序或服务以使用新的日志文件。

yaml 复制代码
/var/log/myapp.log {  
    daily  
    rotate 7  
    compress  
    delaycompress  
    missingok  
    notifempty  
    create 0640 www-data adm  
    sharedscripts  
    postrotate  
        /usr/bin/systemctl reload myapp.service > /dev/null  
    endscript  
}

相关推荐
前端Hardy16 小时前
别再手写代码了!2026 前端 5 个 AI 杀招,直接解放 80% 重复劳动(附工具+步骤)
前端·javascript·面试
SuperEugene16 小时前
Element Plus/VXE-Table UI 组件库规范:统一用法实战,避开样式冲突与维护混乱|工程化与协作规范篇
前端·javascript·vue.js·ui·前端框架·element plus·vxetable
٩( 'ω' )و26016 小时前
MySQL基础
数据库·mysql
生命不息战斗不止(王子晗)16 小时前
mysql基础语法面试题
java·数据库·mysql
前端Hardy16 小时前
前端工程师必备的 10 个 AI 万能提示词(Prompt),复制直接用,效率再翻倍!
前端·javascript·面试
BioRunYiXue16 小时前
Nature Methods:CellVoyager 自主 AI 智能体开启生物数据分析新时代
大数据·开发语言·前端·javascript·人工智能·数据挖掘·数据分析
知识分享小能手16 小时前
MongoDB入门学习教程,从入门到精通,MongoDB应用程序设计知识点梳理(9)
数据库·学习·mongodb
齐齐大魔王16 小时前
linux-线程编程
java·linux·服务器
一直都在57216 小时前
Redis (一)
数据库·redis·缓存
字符串str16 小时前
sql的基本技术栈
数据库·sql·oracle