赤峰市教育平台INODE满处理结果

一、问题的原因分析

(1)在进行磁盘格式化时,没有正确指定inode的上限值,100T的硬盘,INODE的个数=26226048,即2200W个,文件数太少,建议扩大10倍以上,这样做势必会造成INODE的存储空间变大,约100G左右,但对于100T的磁盘来讲,不算什么。事实已经这样,无法动态调整INODE值,只能是重新格式化时指定-N参数。

(2)因为赤峰老师大量上传的是OFFICE文件,云平台对于OFFICE的预览采用的是OFFICE365的在线预览方式,但此地还在继续生成SWF文件,虽然生成也没用。1个OFFICE文件根据页数的不等,可能生成的SWF文件个数从10到几百不等,小文件太多,占用了太多的INODE值。

二、暂时处理办法

(1)将Preview下小的文件(小于5MB)的移动到一个临时增加的4T硬盘上,这块硬盘的INODE值=301989888,看到的吧?触目惊心,4T硬盘的INDOE值是100T的15倍!!!

(2)配置nginx.conf,将静态文件请求分别到两个地方检查,实在没有再走云存储。

 location ~ /down/Preview/
                {
                        root /usr/local/tomcat7/webapps/;
                        set $cba "";
                        set $abc "0";
                        set $oss_endpoint "http://video.edusoa.com";
                    if (!-e $request_filename)
                    {
                        #set $abc "1";
                        root /data/tomcat7/webapps/;
                    }

                    if (!-e $request_filename)
                    {
                        set $abc "1";
                    }
                        if ($abc = "1")
                        {
                                rewrite_by_lua ‘
        ...

(3)效果如下图:

测试用例:http://ypt.cfedu.net/dsideal_yy/html/down/Preview/00/0010A914-0FE4-8179-7CD4-89867B91F7A3_10.swf

(4)在没有进行长远的根治办法之前,定期执行下面的命令,以解燃眉之急

#  执行小文件搬家程序
cd /usr/local/huanghai
nohup ./MoveSmallFile &

查看
[[email protected] huanghai]# ps -ef | grep MoveSmallFile
root      42917  41820  0 07:32 pts/3    00:00:00 ./MoveSmallFile
root      42965  41820  0 07:33 pts/3    00:00:00 grep MoveSmallFile

三、长远的办法

(1)停止生成SWF文件。

(2)用100TB的硬盘挂载上,重新格式化,设定好INODE值,所有文件迁移到新硬盘上,旧硬盘格式化后重新设置INODE值。

(3)将文件重新迁移回旧硬盘,回收新硬盘。

四、附小文件搬家程序源码,供参考和修改:(go语言版本)

package main

import (
    "bufio"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "os"
)

func CopyFile(srcFilePath string, dstFilePath string) (written int64, err error) {
    srcFile, err := os.Open(srcFilePath)
    if err != nil {
        fmt.Printf("打开源文件错误,错误信息=%v\n", err)
    }
    defer srcFile.Close()
    reader := bufio.NewReader(srcFile)

    dstFile, err := os.OpenFile(dstFilePath, os.O_WRONLY|os.O_CREATE, 0777)
    if err != nil {
        fmt.Printf("打开目标文件错误,错误信息=%v\n", err)
        return
    }
    writer := bufio.NewWriter(dstFile)
    defer dstFile.Close()
    return io.Copy(writer, reader)
}
func PathExists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil {
        return true, nil
    }
    if os.IsNotExist(err) {
        return false, nil
    }
    return false, err
}

//工作目录
var WorkingPath = "/usr/local/tomcat7/webapps/dsideal_yy/html/down/Preview/"

//创建目录
var createDir = "/data/tomcat7/webapps/dsideal_yy/html/down/Preview/"

func main() {

    //拼接二级子目录
    var subPathArray []string
    charArray := "0123456789ABCDEF"
    l := len(charArray)
    for i := 0; i < l; i++ {
        first := charArray[i : i+1]
        for j := 0; j < l; j++ {
            second := charArray[j : j+1]
            subPathArray = append(subPathArray, first+second)
        }
    }
    for i := 0; i < len(subPathArray); i++ {
        os.MkdirAll(createDir+subPathArray[i], os.ModePerm)
        fmt.Println("创建目录成功:", subPathArray[i])
    }
    //遍历所有子目录下文件
    for i := 0; i < len(subPathArray); i++ {
        current := WorkingPath + subPathArray[i]
        fmt.Println("当前检查的目录:" + current)
        files, errDir := ioutil.ReadDir(current)
        if errDir != nil {
            log.Fatal(errDir)
            return
        }
        //输出所有文件
        for _, file := range files {
            if file.Size() < 1024*1024*1024*5 {
                //拷贝走
                sourceFile := current + "/" + file.Name()
                targetFile := createDir + subPathArray[i] + "/" + file.Name()
                //先删除
                exist, _ := PathExists(targetFile)
                if exist {
                    fmt.Println("发现文件存在,先删除之:" + targetFile)
                    //存在则先删除之
                    err := os.Remove(targetFile)
                    if err != nil {
                        // 删除失败
                        fmt.Println("文件删除失败:" + targetFile)
                    } else {
                        // 删除成功
                        fmt.Println("文件删除成功:" + targetFile)
                    }
                }
                _, err := CopyFile(sourceFile, targetFile)
                if err != nil {
                    fmt.Println(" 文件写入失败,是不是磁盘满了?")
                    return
                }
                fmt.Println(current+"/"+file.Name()+",size=", file.Size())
                //删除旧的
                err = os.Remove(sourceFile)
                if err != nil {
                    // 删除失败
                    fmt.Println("原始文件删除失败:" + sourceFile)
                } else {
                    // 删除成功
                    fmt.Println("原始文件删除成功:" + sourceFile)
                }
            }
        }
    }
}

原文地址:https://www.cnblogs.com/littlehb/p/12302156.html

时间: 2024-10-12 10:32:20

赤峰市教育平台INODE满处理结果的相关文章

linux no space left on device的解决办法(iNode满导致)

今天在腾讯云的服务器被攻击后,apache启动报错,查找原因发现是磁盘空间不够no space left on device, 诡异的是df命令磁盘占用仅55% 继续查找原因,发现是iNode已满,即没有索引空间 这就好办了,首先定位哪个目录占用iNode最多,命令如下: find */ ! -type l | cut -d / -f 1 | uniq -c 定位完成,清理目录,整个世界都清净了 linux no space left on device的解决办法(iNode满导致),布布扣,b

Linux inode满导致创建文件报磁盘空间不足

客户报不能挂载存储,系统异常.登陆系统,尝试手动mount分区,报失败.进入挂载点,尝试写入一个文件,报磁盘空间不足,首先怀疑是系统磁盘空间满: $ df Filesystem           1K-blocks      Used Available Use% Mounted on /dev/xvda 33030016 10407780 22622236 32% / tmpfs 368748 0 368748 0% /lib/init/rw varrun 368748 56 368692

linux no space left on device的解决的方法(iNode满导致)

今天在腾讯云的server被攻击后,apache启动报错,查找原因发现是磁盘空间不够no space left on device, 诡异的是df命令磁盘占用仅55% 继续查找原因.发现是iNode已满.即没有索引空间 这就好办了,首先定位哪个文件夹占用iNode最多,命令例如以下: find */ ! -type l | cut -d / -f 1 | uniq -c 定位完毕.清理文件夹,整个世界都清净了

定时任务crond及由其导致的inode满案例

1.定时任务crond介绍 1.1 crond是什么 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件. 特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执行. 1.2 为什么要使用crond定时任务 linux系统的定时任务crond,相当于我们平时生活中的闹钟的功能.可以满足周期性执行任务的需求. 1.3 不同系统的定时任务和种类 1.3.1 windows 7 系统的定时任务 开始→所有程序→附件→系统工具→选择任务计划程序 1.3.2 l

inode满处理

inode过高 数据库磁盘inode资源占用完:使用df查看磁盘空间充足的,可以通过df -i命令查看,哪个盘的inode耗尽.该磁盘的某些目录下存在大量的小文件导致. 排查过程 [oracle@SSS-WW-DB02:/u01]$*for i in ./; do echo $i; find $i | wc -l; done;*./app11./lost+foundfind: `./lost+found': Permission denied1./oracle37896./oradata26./

由索引节点(inode)爆满引发的问题

关于磁盘空间中索引节点爆满的问题还是挺多的,借此跟大家分享一下: 一.发现问题 在公司一台配置较低的Linux服务器(内存.硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题. 二.分析问题: 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件.[[email protected] ~

使用df -h命令查看磁盘空间使用率不算高,还有很多空余空间,但是创建文件或写入数据时一直报错磁盘写满

关于磁盘空间中索引节点爆满的问题还是挺多的,借此跟大家分享一下: 一.发现问题 在公司一台配置较低的Linux服务器(内存.硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题. 二.分析问题: 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件. [[email protected]

Linux之定时任务补充

定时任务两实例 例1: 每分钟打印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中. [[email protected] log]# mkdir -p /server/log/ [[email protected] log]# echo "chensiqi" >>/server/log/chengliang [[email protected] log]# crontab -l #time sync by zcl at 2017/5/8 */5

03-目录结构

目录结构 作者:矮哥 归档:学习笔记 2017/1/6 目 录 第1章 linux系统沐目录结构的基本特点介绍... 1 1.1 挂载光盘 和卸载光盘... 1 1.2 小结... 3 第2章 目录的介绍... 3 2.1 小结:重要目录回顾... 5 第3章 /etc/重要目录里的重点(了解)... 6 3.1 /etc/sysconfig/network-scripts/ifcfg-eth0. 6 3.1.1 小结... 6 3.2 /etc/host 6 3.3 /etc/sysconfi