1句代码,挽回1000万损失

文章讲述了企业在数据安全和高可用性需求下,大量备份文件占用了存储空间,导致I/O性能问题。作者通过帆软report软件举例,指出系统卡顿的原因是开启Debug模式及低I/O性能的服务器。提出的解决方案包括关闭Debug模式,提升磁盘性能,使用Linux系统,以及通过编写FORFILES命令脚本来定期清理30天前的历史文件,从而解决I/O瓶颈并优化系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

        在企业中,出于数据安全和应用高可用,很多软件和企业会对工程文件、数据库等做自动备份和应用容灾等。一份数据或者文件会保留到很多地方,虽然满足了安全性的需求,但是会因为保存数据区间太久造成占用大量的存储成本。最凑巧的是,像我这种大怨种,刚好碰到大客户审核,因历史文件太多,造成系统卡顿,差点损失1000万的单子。

        随着数字化建设的不断开展,在深入应用阶段,会发现,这些备份文件会特别大,不仅占用磁盘空间,并且影响磁盘I/O。本次,已帆软report软件为例说说历史文件清理的必要性。

 一、需求起源

        1.1业务场景

        帆软report 升级至10.0以上版本后,其实稳定性已经高了非常多了,而且拥有宕机自启动功能。这得益于重构了产品,采用了新的引擎。但好像目前软件应对卡顿这个问题一直没有好的办法。好巧不巧,最近有次大客户审核,发生了一场持续3小时左右的系统卡顿。那真的是“王德发"。最可恶的是,后台没有任何报错,这对排查问题增加了一个level。卡顿阶段的后面日志是这样的。只看到满屏的debug日志在疯狂输出。

         

        1.2需求分析

        说实话,我也做过了很多关于帆软的项目,自认为在这块拥有很丰富的经验。但是因为这次后台没有报错,导致我第一次慌了。后面经过冷静分析和同事沟通发现,这个兄弟把正式环境的Debug模式开启了,因此后台才会疯狂输出日志。但是最凑巧的是,我们的服务器刚好是超融合的。相信很多企业都是这样,超融合的服务器存在一个很大的I/O问题,就是I/O性能相当较低,挂载固态硬盘成本高。因此当大量的日志写入磁盘,会导致系统卡顿,进而影响使用。如下图所示是我整个分析过程。

二、解决方案

        2.1 降低I/O瓶颈

        其实说实话还是第一次遇到 I/O瓶颈的问题,因为现在的服务器的I/O性能都能满足系统的应用,当初排查问题的时候都没往这块去思考。但正是犯了经验主义的错误,这次想记录下来分享给大家,希望大家下次遇到类似问题,能有所帮助。

        在上面提到了I/O瓶颈的处理方案:

        1、收回debug模式权限(已收回)

        2、给服务器配置固态硬盘,提高读写能力

        3、使用linux系统,对文件处理速度会快且友好

        4、缩短保存企业微信推送消息文件周期,减少至1个月内

         2.2病根下手

        其实这次的I/O问题和帆软report这款软件的机制有一定的关系,因为在做企业微信消息推送的时候,每推送一次消息就会生成一个消息文件来保持历史消息记录。整个前端展现逻辑很优秀,也为我们企业的数字化建设提供了一个很好的抓手。因此我们企业应用的非常深入。如下图所示,企业微信已经被推送消息占满。

        假如上面那个图片不够震撼的话,我给你说一组数据,我们一个月企业微信推送消息文件就有60G ,60多万个文件。因此搭配上低I/O性能的磁盘,真的是有你难受的。

 三、一句代码,药到病除

        因为经过业务分析,其实业务对历史推送消息的需求量不大,推送提醒其实更多的是实时性,这也是为啥会生成这么多消息文件,因为推送频率高,实时性高。

        但对历史消息要求就不高,当然我们在实际应用中,可根据自己的需求来自定义删除的文件。如下所示用来删除帆软report 30天前历史文件的效果。

        3.1代码

FORFILES /p D:\WebReport\WEB-INF\schedule  /s /D -30 /C "cmd /c  DEL /q @path "

        3.2代码阐述

        FORFILES /p D:\WebReport\WEB-INF\schedule  /s /D -30 /C "cmd /c  DEL /q @path "

        其中D:\WebReport\WEB-INF\schedule代表你需要删除的文件位置,后面的/S代表会遍历删除D:\WebReport\WEB-INF\schedule下面的子文件夹里面的文件,因此我们在写路径的时候只要写大目录即可。

        /D -30代表删除创建时间在30天之前的文件,这里面的30我们可以根据自己的需求更改,如更改成20就是删除20天的文件了。

        3.3应用

        按照需求修改好代码后,我们另存为bat格式的文件,然后用Windows的任务计划程序,调用对应bat脚本就能定时执行了,再也不用操心历史文件太多带来的I/O问题了。

         好了,后续大家还有任何疑问,欢迎留言讨论,希望你们不要再去踩一遍我的坑了,在升职加薪路上,越走越顺~

        

VB控件 RMReport7 转:RMReport的使用方法及详解 1、不打印特定的MemoView,套打常用 a.页面设置-->其它-->不打印背景图 b.设置MemoView属性printable=False 2、 如何打印wwDBGrid? 修改rm.inc,如果想支持RX,GIF,JPEG,DimandAccess,Halcyon,DBISAM, EHLib,也需要修改rm.inc //{$DEFINE InfoPower} //修改这行,去掉"//" //{$Ehlib} 3.试用版安装方法(以下假设将文件释放到c:/rm目录中) (1)Tools->Environments Option->Libary->Libary Path中增加: c:/rm/souce c:/rm/bpl $(DELPHI)/Lib $(DELPHI)/Bin $(DELPHI)/Imports $(DELPHI)/Projects/Bpl (2)Component->Install Packages->Add,选bpl/rm_d70.bpl 4.在Delphi IDE中卸载以前的Report Machine版本,然后打开rm_r50.dpk,选"compile", 在打开rm_d50.dpk,选"Install". 包分成了Runtime package和Designer package,所以要安装顺序安装 5、单元格的变量格式用代码设置 t = TRMGridReportPage(RMGridReport1.Pages[0]).Grid.Cells[1, 1].View t = TRMMemoView(RMReport1.FindObject('memo1')); t.DisplayFormat := 'N0.001' //数字型 t.DisplayFormat := 'Dyyyy/mm/dd' //日期型 6、两遍报表如何用代码设置 GridReport1.DoublePass := True 7、用代码数据字典: RMReport1.Dictionary.FieldAliases.Clear; RMReport1.Dictionary.FieldAliases['RMDBDataSet1'] := '动物'; RMReport1.Dictionary.FieldAliases['RMDBDataSet1."Name"'] := '姓名'; 这样在RM的设计器显示为自定义名称,为最终用户提供友好的显示 8、在报表中如何使用变量(或者如何给某个memoview赋值) a.RMVariables在RM_Class.pas中定义,是全局变量,这样定义后就可以在报表中使用变量"var1",例如: RMVariables['变量名称'] := Edit1.Text; b.用报表中数据字典,TRMReport.Dictionary.Variables,需要注意的是,如果变量是字符型的需要用AsString赋值,其他类型的用RMReport.Dictionary.Variables['var1'] := 1234,例如: RMReport1.LoadFromFile('1.rls'); RMReport1.Dictionary.Variables.AsString['变量名称'] := Edit1.Text; c. 直接对某个单元格赋值,例如: RMGridReport1.LoadFromFile('1.rls'); TRMGridReportPage(RMGridReport1.Pages[0]).Grid.Cells[1,1].Text := '值'; 如果是RMReport: RMReport1.LoadFromFile('1.rmf'); t := RMReport1.FindObject('Memo1'); if t nil then // var t: TRMView t.Memo.Text := 'dsdsdsds'; d.脚本中直接引用Form的值 procedure Main; begin Memo1.Memo.Text := Form1.Edit1.Text; end; 9、自动换行 主项数据栏Stretched = true 文本框 Stretched = true WordWrap = true 10、RM内置变量(Script),增加中.... a.属性PrintAtAppendBlank=True CurReport.AppendBlanking=True时代表增加空行 在RM中,打印设置只能保存页面边距及打印份数、是否两遍打印以及
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他们叫我技术总监

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值