一种磁盘上循环覆盖文件策略

文件系统、 文件系统文件文件命名文件结构文件类型文件访问文件属性文件操作目录一级目录系统层次目录系统层次目录系统目录操作文件系统的实现文件系统布局引导块超级块空闲空间块碎片inode文件的实现连续分配链表分配使用内存表进行链表分配inode目录的实现共享文件共享文件日志文件系统日志文件系统文件系统的管理和优化磁盘空间管理块大小记录空闲块磁盘配额文件系统备份物理转储和逻辑转储文件系统的一致性文件系统性能高速缓存块提前读减少磁盘臂运动磁盘碎片整理 文件 文件命名 文件结构 文件类型 文件访问 文件属性 文件操作 目录 一 阅读详情

1. 前言


实际开发中经常需要存储数据, 无论是存储日志,还是二进制数据(图片,雷达数据或视频文件等), 不能一直存,是否存在一种策略:
当磁盘空间不足时,优先删除最开始写入的数据呢?

循环覆盖的策略应该有很多,这篇文章抛砖引玉,希望更多个伙伴给出更好的方案出来!

2. 软件设计流程思路

这里只提供思路,具体实现按照客户需求做多样化,最好写个抽象基类出来,后续可以多态各种需求。


  • 初始化(挂载点/循环覆盖阈值T, 每次覆盖后预留一定的比例,比如覆盖阈值75,当使用率到了75后,删除的比例为5,那么删除后比例为70,)
    • 策略有很多,看客户需求:
      • 按照比例删除, 比如超过阈值,删掉{超过部分+一定过度,大概为5%~10%比例均可}。
      • 按照时间删除,比如超过比例,删除掉最早日期的数据,如果日期内数据小,会导致删除频率高,这里多考量下多目录多文件情况下的事件复杂度(目录遍历) && CPU占用比例实际等,是否影响到系统性能。
      • 组合删除。
      • 空闲删除,某种方式设备休眠时做删除动作{主业务不启用等}。
  • 线程监测{按照比例删除流程}
    • 监测磁盘分区当前使用比例。
    • 比较使用比例和循环覆盖阈值T, 当大于阈值比例时, 计算需要删除的比例DT, 通过(总大小乘 DT )计算删除的数据大小。
    • 对磁盘文件做递归查询,将非目录文件部署到数组中(std::vector>。
    • 通过文件属性拿到写操作的时间戳, 通过STL的算法sort按照时间戳做降序/升序排序,得到 std::vector{sort}的数组。
    • 开始删除文件,这里需要注意std::vector<> erase坑。
      • 每次删除成功记录实际删除的大小。
      • 通过这个实际删除大小和理论删除对比,如果{>=}就停止, 调试线程开始。
    • 因为目录中的文件可能都删除了,所以需要检测空目录的情况,当有空目录就删除。

3. 模拟测试


3.1 分区准备工作

  • 通过fdisk工具分区,假设我们分1个区域/dev/mmcblk1p1
  • 格式化mkfs.ext4 /dev/mmcblk1p1
  • 挂载 mount -t ext4 /dev/mmcblk1p1 /mywork

3.2 模拟写数据

  • 格式化后分区大小为0
  • 使用dd命令写操作, 如下是写的一个自动化写数据elf文件源码
#include <unistd.h>

#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <vector>


int main(int argc, char *argv[])
{
        if(argc < 5){
                printf("Usage: ./a.out <创建文件数量> <创建文件大小MB> <创建文件间隔 S> <拷贝目录绝对路径>\n");
                return -1;
        }

        std::string strcmd("");

        int nFileCount = atoi(argv[1]);
        int nFileSize = atoi(argv[2]);

        int nTimeSpan = atoi(argv[3]);
        std::string dir = argv[4];
        printf("创建文件数量:%d, 创建文件大小为:%d, 创建文件间隔:%d 拷贝的目录:%s\n", nFileCount, nFileSize, nTimeSpan, dir.c_str());

        for(int i = 0; i < nFileCount; ++i){

                strcmd =std::string( "dd if=/dev/zero of=") + dir + "/"+std::to_string(time(0))+"_"+std::to_string(i+1)+".file bs=1048576 count=" + std::to_string(nFileSize);
                printf("cmd:%s\n", strcmd.c_str());
                FILE * fp = popen(strcmd.c_str(), "r");
                if(nullptr == fp){
                        printf("pipe error .\n");
                        exit(127);
                }

                printf("create %02d , size:%d MB\n", i+1, nFileSize);
                fclose(fp); fp = 0;
                sleep(nTimeSpan);

        }

        return 0;
}


运行日志如下:

cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141122_91.file bs=1048576 count=100
create 91 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.40722 s, 30.8 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141125_92.file bs=1048576 count=100
create 92 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.47826 s, 30.1 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141129_93.file bs=1048576 count=100
create 93 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.28752 s, 31.9 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141132_94.file bs=1048576 count=100
create 94 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.49482 s, 30.0 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141136_95.file bs=1048576 count=100
create 95 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.62826 s, 28.9 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141139_96.file bs=1048576 count=100
create 96 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.27876 s, 32.0 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141143_97.file bs=1048576 count=100
create 97 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.32141 s, 31.6 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141146_98.file bs=1048576 count=100
create 98 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.30286 s, 31.7 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141149_99.file bs=1048576 count=100
create 99 , size:100 MB
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.28151 s, 32.0 MB/s
cmd:dd if=/dev/zero of=/home/ubuntu/pic/6/1703141152_100.file bs=1048576 count=100
create 100 , size:100 MB

3.3 测试

  • 开启一个窗口对分区写文件,执行 a.out 100 512 0.5 $PWD/2, 命令行的含义上面的代码有解释。
  • 当模拟写的过程中,磁盘使用率越来越大。当到阈值T时,会对最早写的数据做删除动作,直到删除了超出阈值+一定的缓冲,一般给5%~10%足够。
  • 进入到目录中,确认目录中文件是否是先删除时间戳最早的文件。
Hadoop的磁盘写入策略引发的问题 DataNode挂载的磁盘或者DataNode节点挂载多个磁盘,如果存在一些磁盘大小不一样,数据在落盘时就可能会出现磁盘使用率不均匀的情况,容量较小的盘容易被写满,而容量大的盘还剩很多空间。磁盘写满后,影响Hadoop集群的正常工作。国庆第一天,线上集群就报出了JournalNode挂掉的异常情况,经查是由于2T的磁盘被写满,JournalNode无法再写入数据。当时采取了临时的措施,删掉HBase 阅读详情

相关推荐

OS 磁盘调度算法 之 FCFS、SSTF、SCAN、CSCAN

该文以例题为引进行叙述四种磁盘调度算法 例:假定一个磁盘有200个柱面,编号为0~199,在完成了对125柱面的请求后,当前正在143号柱面处为一个请求服务。请求队列中还有若干个请求者在等待服务,假设它们依次要访问的柱面号为: 86,147, 91,177,94,150,102,175,130。 请分别计算采用先来先服务调度算法、最短寻找时间优先调度算法和扫描调度算法时实际服务的次序和磁臂移动的距离。并说明哪种算法更合适些,为什么?

MoMing丶的博客 1万+

QT随笔--需求:检索磁盘,当磁盘空间不足时,进行循环覆盖,删去最早的录屏文件

代码段分为两个函数,第一个是检索磁盘空间是否少于某个值,第二个函数是对其进行处理,按时间排序删去最早的文件,同时不要影响现有的文件## 检索磁盘剩余空间,”1000“,单位是G// 与指定空间的大小//按修改时间排序正常的排序总是会将正在修改的文件排在第一个//保证长在录屏的文件不受影响}else{i>0;i++){break;

weixin_45103843的博客 449

Hadoop的磁盘大小不一导致节点挂掉

问题描述 DataNode挂载的磁盘或者DataNode节点挂载多个磁盘,如果存在一些磁盘大小不一样,数据在落盘时就可能会出现磁盘使用率不均匀的情况,容量较小的盘容易被写满,而容量大的盘还剩很多空间。磁盘写满后,影响Hadoop集群的正常工作。 建好集群后需要将历史记录导入到hbase中,而集群中有三台主机外接了磁盘阵列,主机磁盘阵列大小四十多G,磁盘阵列大概1.6个T。运行将数据写入hbas...

intersting的博客 2947

C++ 日志、转存

功能归纳总结如下: 1) 日志文件提供接口让用户配置日志文件名、日志大小上限、历史日志文件数目上限; 2) 日志文件提供Append()接口,让用户向文件追加日志消息; 3) 日志文件在执行Append()接口过程中,自动检测当前日志文件大小:如果追加当前消息后,文件大小超过约定上限,则记录当前消息前,将已有消息转储到历史文件并保证历史日志文件数不超过约定上限;否则,直接记录当前消息; 4) 日志...

chumao0364的博客 660

磁盘调度算法,内存调度,内存分配策略

磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘时,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。由于在访问磁盘的时间中,主要是寻道时间。因此: 磁盘调度算法的目标是使磁盘的平均寻道时间最少1,先来先服务(FIFS,first come first served)   根据进程请求访问磁盘的先后顺序进行调度。公平,简单,每个进程都能依次得到处理,不会出现某一进程的请求长期得

L未若的博客 7608

17 操作系统第四章 磁盘管理 磁盘的结构 磁盘调度算法 减少磁盘延迟时间的方法

文章目录1 磁盘的结构1.1 磁盘、磁道、扇区1.2 磁盘如何读取数据1.4 盘面、柱面、磁盘的物理地址1.5 磁盘的分类1.6 磁盘的结构小结2 磁盘调度算法2.1 一次磁盘读/写操作需要的时间2.2 先来先服务算法(`FCFS`)2.3 最短寻找时间优先(`SSTF`)2.4 扫描算法(`SCAN`)2.5 `LOOK` 调度算法2.6 循环扫描算法(`C-SCAN`)2.7 `C-LOOK` 调度算法2.8 磁盘调度算法小结3 减少磁盘延迟时间的方法3.1 交替编号3.2 错位命名3.3 减少磁盘延迟

夜飘凌的博客 2463

【C++模块实现】| 【06】日志模块添加循环覆盖写文件功能

========》以下全部代码查看《========【C++模块实现】| 【01】日志系统实现 【C++模块实现】| 【02】日志系统优化 【C++模块实现】| 【03】文件管理模块 【C++模块实现】| 【04】配置模块 【C++模块实现】| 【05】日志模块增加配置模块的功能 2、遇到的问题 2.1 日志文件大小的限制没有达到预期的要求 2.2 yamlstring 3、测试 测试循环覆盖写文件 测试代码 参考文章=========》Log4j2 RollingFileAppender《==

weixin_45926547的博客 2009

磁盘调度策略与RAID技术解析

本文详细解读了磁盘调度算法的基本原理和策略,包括先进先出(FIFO)、优先级(PRI)、后进先出(LIFO)、最短服务时间优先(SSTF)、扫描(SCAN)及其变体等。同时,介绍了RAID技术的发展背景、概念、不同级别以及在数据存储中的重要性。

weixin_29097457的博客 489

回环设备(loop-back devices)

<br />回环设备(loop-back devices)<br /><br />回环设备( 'loopback device')允许用户以一个普通磁盘文件虚拟一个块设备。设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。(当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你这样使用一个普通文件。<br /><br />回环设备以 /dev/loop0、/dev/loop

babyfans的专栏 3078

(篇八)C语言在母串删子串、输入位置截取子串

文章目录一、字符串二、删除指定的字符三、从母串中截取子串四、输入位置截取子串 本篇主要介绍C语言字符串中的相关操作,然后分析两个C语言实例——在母串中指定删除子串、在母串中截取子串 一、字符串 了解C 语言的都知道,C语言中没有字符串类型,所以C语言是用字符串常量、字符指针、字符数组来表示字符串。这些字符串都是以 NULL、’\0’或者ASCII==0来结尾。说白了就是一个个字符组成一串有序序列,...

Viewinfinitely的博客 1510

实施文档

流程管理 2008-04-23 09:44:00 874 收藏 3 分类专栏: 企业管理杂谈 文章标签: 文档 文档管理 项目管理 工作 配置管理 工具 项目实施文档是用来记录、描述、展示实施过程中一系列信息的处理过程,通过书面或图示的形式对项目活动过程或结果进行描述、定义、规定及报告。例如分阶段实施计划文档,标准业务流程文档,标准编码及数据文档,标准参数设置文档,功能操作指南文档。这些文档将会伴随着ERP实施的各个阶段逐渐充实、完善,也同时记载了整个实施的过程和成果。 作为实施顾问人员,在实施过程

qq_52337172的博客 1062

磁盘调度策略

一 磁盘访问时间: *磁盘访问时间=寻道时间+旋转延迟时间+数据传输时间。主要是寻道时间。 二 磁盘调度策略: (1)先来先服务(FCFS): *优点:公平、简单,且每个进程的请求都得到依次的处理,不会出现某一进程的请求长期得不到满足。 *缺点:未对寻道进行优化,使平均寻到时间可能较长。 (2)最短寻道时间优先(SSTF): *特点:要求访问的磁道与当前磁头所

linux系统、网络编程和分布式计算 2695

NSIDC海冰运动产品-速度矢量场图绘制(数据下载和处理--年、季节平均)【python/basemap】

入门级NSIDC海冰运动产品速度矢量场图绘制(数据下载和处理--年、季节平均)【python/basemap】

Mluoo的博客 2959

操作系统--磁盘调度题目

【题目来源-2010 408 真题】 假设 计 算机系统采用CSCAN(循环扫描)磁盘调度策略 。使 用2KB的内存空间记录16384个磁盘的 空闲 状态 。 (1)请说明在上述条件 下 如何进行磁盘 空闲 状态的管理。 (2)设某单面磁盘的旋转速度为每分钟6000转 , 每个磁道有100个扇区,相 邻 磁道间的平均移动的时间为1ms 。 若在某时刻,磁头位于100号磁道处,并沿着磁道号增大的方向...

码的世界 1万+

Nacos启动报错No DataSource set?5分钟搞定standalone模式配置

本文针对Nacos启动时常见的“No DataSource set”报错,深入解析了其根源在于默认集群模式与外部数据库依赖。提供了两种快速解决方案:通过命令行参数“-m standalone”启动,或直接修改启动脚本配置文件,从而在5分钟内以单机模式成功启动Nacos,无需配置MySQL数据库。

weixin_29234509的博客 465

STK新手必看:用700km轨道卫星,5步搞定对地覆盖分析报告

本文为STK新手提供700km轨道卫星对地覆盖分析的5步实操指南,涵盖卫星创建、传感器配置、区域定义、计算设置及报告生成全流程,特别标注常见操作误区与优化技巧,帮助用户快速掌握STK覆盖性分析核心方法。

weixin_42546392的博客 375

磁盘调度是操作系统中用于管理磁盘I/O操作的一种机制,主要目的是优化磁盘访问时间,提高系统性能

磁盘调度是操作系统中用于管理磁盘I/O操作的一种机制,主要目的是优化磁盘访问时间,提高系统性能。磁盘调度算法决定了在多个磁盘请求之间如何安排磁盘臂的移动顺序,以最小化平均寻道时间、旋转延迟和数据传输时间。磁盘调度算法的选择对系统性能有重要影响,尤其是在多任务环境中,合理的调度可以显著提高磁盘I/O效率。磁盘调度中的“饥饿”现象指的是在某些磁盘调度算法中,某些进程或I/O请求可能会因为长时间得不到响应而被“饿死”。

[Blog][Domain] programb.blog.youkuaiyun.com 2036

【Python】SimpleITK使用笔记

1. 概念 1.1 nii格式 1.2 SimpleITK 1.3 SimpleITK 图像 2. 基本操作 2.1 常见属性 2.1 读取和保存图像 2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

See_Star的博客 7895

在磁盘存储系统中,磁盘以旋转方式工作,当多个I/O请求(如读取数据)到达时,旋转调度是一种优化磁盘访问时间的策略

在计算机科学中,旋转调度(Rotating Scheduling)可能与操作系统的进程调度有关。它是一种简单的调度算法,类似于轮询调度(Round Robin Scheduling)。在这种调度方式中,多个任务或进程会按照一定的顺序依次获得CPU时间片,每个任务在分配的时间片内运行,时间片结束后,调度器会切换到下一个任务。这种方式可以保证多个任务公平地获得处理资源,适用于多任务操作系统。

[Blog][Domain] programb.blog.youkuaiyun.com 957

Android软键盘系统深度解析:架构、原理与实现

Android软键盘系统深度解析:架构与实现原理 本文系统剖析了Android软键盘的核心工作机制。作为系统级输入服务,软键盘具有双重属性:既是可安装的独立应用,又深度集成于系统框架中。文章详细解读了软键盘的系统架构,包括其与InputMethodManagerService(IMMS)和WindowManagerService(WMS)的交互机制,以及通过InputConnection实现的跨进程通信流程。同时分析了输入法窗口的特殊管理策略、布局调整模式,并深入探讨了输入预测引擎的实现原理,包括词典加载、

保持专注,保持热爱 114

基于巴法云物联网云平台构建可视化控制网页(以控制LED为例)

本文基于巴法云物联网云平台构建可视化控制网页,实现了对LED的控制。

kevin1499的博客 4518

【操作系统 · 磁盘】磁盘调度

磁盘、内存速度差距大,而磁盘调度可以尽可能在现有条件下提高磁盘存储子系统的性能。

茶色喵的博客 7187

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

磁盘调度是操作系统中对磁盘I/O操作进行优化管理的一种重要机制,主要用于提高磁盘的读写效率,减少磁盘的机械寻道时间和旋转延迟时间

磁盘存储器是一种机械存储设备,其读写速度受到磁头移动和盘片旋转的影响。磁盘的物理结构包括磁道(track)、柱面(cylinder)和扇区(sector)。磁头需要移动到指定的磁道,并等待盘片旋转到目标扇区,才能进行读写操作。磁头移动和盘片旋转的机械动作是磁盘I/O操作的主要瓶颈,因此磁盘调度的目标是减少磁头移动距离和盘片旋转时间,从而提高磁盘的I/O性能。

[Blog][Domain] programb.blog.youkuaiyun.com 1106

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

磁盘调度是操作系统中用于管理多个进程对磁盘访问请求的一种机制

磁盘调度是操作系统中用于管理多个进程对磁盘访问请求的一种机制。:这是对SCAN的一种改进,允许磁头在到达磁盘的一端后,可以来回移动N个磁道,而不是直接跳到另一端。这可以减少请求队列中的延迟。:类似于SCAN,但磁头在到达磁盘的一端后会立即返回到起始位置,而不会继续扫描剩余的磁道。这种算法在某些特殊情况下可能会更有效。:与C-SCAN类似,但磁头在到达磁盘的一端后,会立即返回到起始位置,并且只处理从当前位置开始到起始位置之间的请求。:类似于SSTF,但考虑了磁头的当前位置,只选择最接近当前位置的请求进行处理。

[Blog][Domain] programb.blog.youkuaiyun.com 1077

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

操作系统——磁盘

表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据。磁盘表面被划分成一个个隧道,一个圈就是一个隧道。一个磁道又被划分成一个个扇区,每个扇区就是一个磁盘块,每个扇区存放的数据量相同。 最内侧的扇区面积最小,数据密度最大。 可以用(柱面号,盘面号,扇区号)来定位任意一个“磁盘块” ①根据“柱面号”移动磁臂,让磁头指向指定柱面; ②激活指定盘面对应的磁头; ③磁盘旋转的过程中,指定的扇区会从磁头下面划过,这样就完成了对指定扇区的读/写。 1、活动头磁盘: 磁头可以移动的称为活动头磁盘。磁臂可以来回伸缩来带

王王仙贝的博客 3116
上一篇: Unix进程间通信之简介-总体概述和引子
下一篇: linux下带宽和流量的统计
帘下有白绿
博客等级 码龄12年 165粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值