服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - Linux删文件力度过大导致IO占用太高的解决方案

Linux删文件力度过大导致IO占用太高的解决方案

2024-04-15 14:27Meepoljd Linux

这篇文章主要介绍了Linux删文件力度过大导致IO占用太高的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前两天刚找到删文件性能比较OK的方式后,测试没啥问题就在生产环境开始操练了, 虽然文件是在持续删除着,但是跑了一段时间以后,执勤同事找我说IO满了,问我是不是做了啥,我上去一看还真是,然后让我先停了:

Linux删文件力度过大导致IO占用太高的解决方案

但是文件也不能不删,脚本还是要跑,基于这个问题,看看怎么样控制IO又能够持续做文件清理。

现象描述

先详细描述一下问题的现象,我在上午9点左右把脚本起来以后,观察了一会任务执行,发现没啥问题就做别的事情了,让脚本一直在服务器运行,大概中午的时候,找到我说IO太高了,让我看下,然后看IO升高和我的脚本基本是同一时间开始的,监控图如下,我11:30左右把脚本完全停了以后,IO就没有再这么高了:

Linux删文件力度过大导致IO占用太高的解决方案

问题分析

我在之前的一篇文章中说到相比较而言,文件清理最快的方式是find + delete的方式,这也是我选择的文件清理方式,但是问题就在于,使用find . -mtime +3 -type f -delete这种命令我没法在脚本这一层对他的删除做限制,比如删除1000个文件休眠5秒。

这个时候想到用nice这些命令对进程优先级做限制,尝试限制IO的占用;或者在perl脚本中做限制,两种方法应该都是可行的,主要是在实际使用上是不是会有差异;

处理过程

nice命令限制优先级

可以使用man nice查看nice命令的使用方式,还是比较简单的:

Linux删文件力度过大导致IO占用太高的解决方案

nice命令只有一个参数-n,用来指定要设置的优先级,可选范围在-20到19,数字越大优先级越低(看到一个比较有意思的理解:nice代表这个人是个好人,越nice人约好,他就越谦让,所以优先级越低:D)

在启动清理命令之前加上nice -n 19就能直接指定优先级运行了,如下:

nice -n 19 find . -mtime +3 -type f -delete

Linux删文件力度过大导致IO占用太高的解决方案

根据监控来看,似乎并没有什么用,使用top命令看了下,优先级是生效了的,看来这个方法不奏效。

Linux删文件力度过大导致IO占用太高的解决方案

ionice命令限制

另一个查到的方法是ionice,这个命令貌似可以直接对IO的调度策略和优先级做限制,使用man ionice可以看到命令的详细用法:

Linux删文件力度过大导致IO占用太高的解决方案

简单介绍下:

参数 作用 取值 描述
-c, --class 调度类,调度方式 0,1,2,3 0对应none,1对应realtime,2对应best-effort,3对应idle
-n 对应调度类下的级别 0-7 只对realtime和best-effort有效
-p 指定PID pid号 指定要做调整的进程pid,如果是执行命令,那就直接带上命令就可以

关于调度策略的解释:

  • idle:当没有其他进程请求磁盘I/O时,才会进行磁盘IO,也就是说最后考虑;
  • realtime:对磁盘进行优先访问,也就是说进程的IO请求会被优先处理;
  • best-effort:该调度策略取值为0-7,数值越低,优先级越高,内核2.6.26之前,使用none等同于使用best-effort

具体的可以搜下IO的CFQ调度算法了解下,这里不展开讨论了;

随后测试了一下ionice的控制:

ionice -c 2 -n 7 find . -mtime +3 -type f -delete

Linux删文件力度过大导致IO占用太高的解决方案

感觉还是没太大作用,IO还是会打到100%,也可能是技艺不精,没找对方法;看样子只有自己在脚本里做控制了;

改造perl脚本

实在没有办法了,只有在我的清理脚本里做控制,把find方式换成了perl脚本,然后做了一层控制:

#!/usr/bin/perl

use File::Find;
use File::Spec;

my $path="xxx";

opendir DH, $path or die "cannot chdir to $path : $!";

for my $p (readdir DH) {
    my $idle=0; # 已删除的文件数,初始化为0
    my $sleep_time=5; # 休眠时间5秒
    next if $file eq "." or $file eq "..";
    my $sonpath=File::Spec->catdir($path,$p);
    opendir SH, $sonpath or die "cannot chdir to $sonpath : $!";
        for my $file (readdir SH) {
            next if $file eq "." or $file eq "..";
            next if $file =~ /^\./;
            my $abspath=File::Spec->catdir($sonpath,$file);
            my @s=stat("$abspath");
            if ((time()-$s[8]) > (60*60*24*2)){
                print "delete file $abspath\n";
                unlink $abspath;
                $idle=$idle+1; # 完成文件的清理后 
                if ($idle>=500){ 
                    print "finish delete $idle files, will sleep $sleep_time.\n";
                    $idle=0; # 当删除文件数达到500个的时候,手动休眠
                    sleep($sleep_time);
                }
            }
        }
    closedir SH;
}
closedir DH;

接下来运行脚本进行清理:

Linux删文件力度过大导致IO占用太高的解决方案

再看监控图,终于是稳定维持在一个水平了:

Linux删文件力度过大导致IO占用太高的解决方案

总结

虽然通过脚本的方式控制了文件清理对IO的占用,但是这算是没办法的办法,若是能够对Linux的IO调度策略再熟悉些,也许我能找到更好的办法吧~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/Meepoljd/article/details/126986452

延伸 · 阅读

精彩推荐
  • LinuxU盘在Linux下显示不正常的解决方法

    U盘在Linux下显示不正常的解决方法

    Suse Linux10.2上试了,原来的乱码都能正常显示为中文 ...

    Linux教程网5322019-12-25
  • Linux怎样在Linux中安装光盘上的DHCP服务

    怎样在Linux中安装光盘上的DHCP服务

    有些刚接触和学习linux的同学在安装好linux后想学习配置dhcp服务器,但是刚装的linux又没有安装dhcp服务器端,dhcpd .conf.sample文件也找不到,开始我也遇到这...

    百度经验6642019-05-30
  • LinuxLinux系统对网站数据定期自动备份与删除

    Linux系统对网站数据定期自动备份与删除

    首先工作中需要网站文件和数据库需要每天自动备份,然后备份目录超过一定时间的删除,这个功能在linux系统中该如何实现?下面请看脚本之家分享的解...

    Linux教程网4382019-10-27
  • Linuxlinux系统下ubuntu 中截图工具及快捷键设置

    linux系统下ubuntu 中截图工具及快捷键设置

    在linux系统上怎么截图?虽然键盘上的截图键还可以用,不过那是截取一整个屏幕的,想要截图某一个区域的时候怎么办呢?下面本文分享一个在ubuntu 中截...

    linux教程网4892019-10-31
  • Linux使用find命令查找Linux中的隐藏文件的方法

    使用find命令查找Linux中的隐藏文件的方法

    这篇文章主要介绍了使用find命令查找Linux中的隐藏文件的方法,包括只列出被隐藏的文件等操作,需要的朋友可以参考下 ...

    大步's blog8322019-09-18
  • Linuxlinux下设定环境变量的方法介绍

    linux下设定环境变量的方法介绍

    在linux下设定环境变量时,如果只是临时用一下,可以直接在shell下用set或export命令设定环境变量,如果希望此环境变量每次开机或打开 shell时自动设定而无...

    Linux教程网3452019-12-19
  • Linux详解linux中的strings命令简介

    详解linux中的strings命令简介

    本篇文章主要介绍了linux中的strings命令简介,在linux下搞软件开发的朋友, 几乎没有不知道strings命令的。非常具有实用价值,需要的朋友可以参考下。...

    stpeace11832021-12-08
  • Linux如何在Linux操作系统定时重启Tomcat服务?

    如何在Linux操作系统定时重启Tomcat服务?

    这篇文章主要为大家介绍了如何在Linux操作系统定时重启Tomcat服务,有图有代码,不会的朋友也可以直接复制代码来学习哦,需要的朋友可以参考下 ...

    Linux教程网8272019-10-26