首页    新闻    下载    文档    论坛     最新漏洞    黑客教程    数据库    搜索    小榕软件实验室怀旧版    星际争霸WEB版    最新IP准确查询   
名称: 密码:      忘记密码  马上注册

正在浏览:   1 名游客





No space left on device的原因 和split 拆分文件
网站管理员
注册日期:
1970/1/1 8:00
所属群组:
网站管理员
帖子: 7077
等级: 58; EXP: 5
HP : 0 / 1426
MP : 2359 / 207835
离线

今天php没有起来错误是No space left on device 我看到var慢了删除好了后来想到底为什么这个错误找到资料如下


 


关于“No space left on device的原因”


 


看到这个错误,第一个反应是磁盘空间满了;但df一看,每个分区的空间都还富余的很。从munin 的监控图表上看 Filesystem usage 也很平稳,但下面的 Inode usage 就有问题了,其中一个分区的 usage 已经到了100%。赶紧跑到服务器上df -i检查,果然是 Inode 耗尽。原来这个分区是用来扔各种日志和临时文件的,其中有某个程序产生的临时文件又小又多,又没有进行定时回滚,造成在磁盘空间耗尽之前文件系统的 Inode 就被用光了。

  Linux/Unix like OS 的文件系统中每个目录树中的节点并不是像 Windows 那样直接包含文件的具体信息,而只包含了文件名和 Inode number 。通过 Inode number 所找到对应于文件名的 Inode 节点中才真正记录了文件的大小/物理地址/所有者/访问权限/时间戳/被硬链接的次数等实际的metadata。因此你可以在 Linux 系统中通过硬链接( hard link ) 的方式给某个文件创建无数个位于不同目录下的文件名,而实际的文件数据只需要一份拷贝。


  但也正因为这种文件系统的结构,当你在 Linux 中进行 IO 操作的时候,需要的资源除了磁盘空间以外,还要有剩余的 Inode 才行。缺省情况下, Linux 在系统安装过程中按照1个 Inode 对应 2k 磁盘空间来计算每个分区的最大 Inode 数。一旦文件系统创建之后,每个分区可用 Inode 数就无法进行动态调整。


  正常来说,一般不太会出现某个分区的 Inode 耗尽而磁盘空间尚余的情况,除非像我碰到的这样垃圾小文件疯长而又没进行有效的清理。但如果确实需要的话,可以在创建文件系统(比如用mke2fs)的时候根据实际需要来调整这个参数(比如分区如果用于存放超大视频文件的话 Inode 的数量可以少一些;如果打算存放的文件是大量小于 2k 的迷你文件的话就要考虑多创建一些 Inode)。


No space left on device 原因:


  超出系统中同时运行的最大 message queue 个数限制 : 在root下用sysctl kernel.msgmni检查该参数,sysctl -w kernel.msgmni=XXX重新设定即可。


附录一则:“比较罕见的一个问题,磁盘文件数目太多导致的LISTENER监听起不来”解决方法:[转载]


问题提出:ITPUB个人空间x8O+K,tM c.{#I

一台测试的服务器,停电再起来后发现listener起不来,报错如下:

3`Sq1x S"|0Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.191.100)(PORT=1521)))ITPUB个人空间NmY5o-FmzX

Error listening on: (ADDRESS=(PROTOCOL=ipc)(PARTIAL=yes)(QUEUESIZE=1))

t:zQ/m"W5y)wty?0No longer listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.191.100)(PORT=1521)))ITPUB个人空间)b z,\U*r'lD `-C%}

TNS-12549: TNSperating system resource quota exceeded

|uR!O1}sf0c0TNS-12560: TNSrotocol adapter errorITPUB个人空间`n9A7U.BJ Z

TNS-00519: Operating system resource quota exceededITPUB个人空间k'UD:s*S

Linux Error: 28: No space left on device


ITPUB个人空间 P%t _ c|3y^

 


首先查看log文件,已经2G了,打开看看日志里面也没发现什么异常,认为日志是自然增长到这么大的,于是直接cat /dev/null>listener.log把日志清空。然后listener还是起不来,仍然报上面的错误。之后重启机器,还是不行,检查磁盘空间:ITPUB个人空间e.o2Zz bK{ o Q

oracle@test-db1admin]$ df -hITPUB个人空间K-` {8]4X N T%sbx

Filesystem Size Used Avail Use% Mounted on

GH:Z ].M{;_5F!vV0/dev/sdb2 4.9G 1.9G 2.7G 42% /ITPUB个人空间I y_4A$Puz

/dev/sdb1 99M 15M 79M 16% /boot

1E s+cC"v UFq-b X0/dev/sdb7 1012M 493M 468M 52% /homeITPUB个人空间 CvP4Y/g q8P.W

/dev/sdb8 61G 41G 18G 71% /optITPUB个人空间1i'N2v%m|IpR

none 1000M 0 1000M 0% /dev/shmITPUB个人空间j4k*x9O6e3J;eD

/dev/sdb5 2.0G 33M 1.9G 2% /tmpITPUB个人空间r`L2w"hv

/dev/sdb6 1012M 606M 355M 64% /varITPUB个人空间 KjN9R!Xa'~%b

/dev/sda1 34G 14G 19G 43% /

Cdm O Q(h4y){0oracle安装在/opt目录,上面还有18个G的空间,而且每个磁盘空间都很多。查看process限制,top发现系统才开了50个process,而对oracle的限制是2048个。在pub的发帖,地址如下:ITPUB个人空间3H9};tt B6COv

http://www.itpub.net/showthread.php?s ... rpage=10&pagenumber=1ITPUB个人空间oD(l9[Oe.D

一直没有解决,后来通知同事有这个问题存在。周一上班,同事说这个问题已经被他解决了,并推荐一篇文章给我,地址如下:

Uws F$M0http://www.zeali.net/entry/480ITPUB个人空间Z.oa'b@2W6ypK:C

摘录一部分:ITPUB个人空间-xUQY{N

Linux/Unix like OS 的文件系统中每个目录树中的节点并不是像 Windows 那样直接包含文件的具体信息,而只包含了文件名和 Inode number 。通过 Inode number 所找到对应于文件名的 Inode 节点中才真正记录了文件的大小/物理地址/所有者/访问权限/时间戳/被硬链接的次数等实际的 metadata 。因此你可以在 Linux 系统中通过硬链接( hard link ) 的方式给某个文件创建无数个位于不同目录下的文件名,而实际的文件数据只需要一份拷贝。但也正因为这种文件系统的结构,当你在 Linux 中进行 IO 操作的时候,需要的资源除了磁盘空间以外,还要有剩余的 Inode 才行。缺省情况下, Linux 在系统安装过程中按照1个 Inode 对应 2k 磁盘空间来计算每个分区的最大 Inode 数。一旦文件系统创建之后,每个分区可用 Inode 数就无法进行动态调整。正常来说,一般不太会出现某个分区的 Inode 耗尽而磁盘空间尚余的情况,除非像我碰到的这样垃圾小文件疯长而又没进行有效的清理。但如果确实需要的话,可以在创建文件系统(比如用 mke2fs )的时候根据实际需要来调整这个参数(比如分区如果用于存放超大视频文件的话 Inode 的数量可以少一些;如果打算存放的文件是大量小于 2k 的迷你文件的话就要考虑多创建一些 Inode)。ITPUB个人空间5N hb;O9s ORC

使用df -i命令可以看到每个分区的总inode数目和被使用的以及空闲的inode数目:

(Y t4Ki4\"a:Z)K0[root@test-db1 log]# df -iITPUB个人空间-m[/^qp*T|?5~#_

Filesystem Inodes IUsed IFree IUse% Mounted onITPUB个人空间T6Pc4S3{3j.I,t]&O

/dev/sdb2 640000 115018 524982 18% /

{,Sr7cOq#|0/dev/sdb1 26104 40 26064 1% /boot

s)GA djY0/dev/sdb7 131616 409 131207 1% /home

4Y:h~&H Q-U0q6m@0/dev/sdb8 8077312 168316 7908996 3% /optITPUB个人空间IAY5?)G[5{|

none 255900 1 255899 1% /dev/shmITPUB个人空间pu(F~8Yg!w"`

/dev/sdb5 262144 182 261962 1% /tmp

7sl C f&@*u}0/dev/sdb6 131616 1500 130116 2% /var

"N2P$nPmz%ZX0/dev/sda1 4447744 117 4447627 1% /u01ITPUB个人空间m0Y$W+qy

上面的结果是同事已经处理后的结果,原因是/var的一个子目录下产生很多很小的文件,删除后恢复正常,listener可以正常起来了。ITPUB个人空间M FK7B0Uu;SQe

继续做下面一个试验:ITPUB个人空间,km8B%U1WIp

首先找到一个大小为200多k的测试文件

/c%r-JU*Y e+v}8e6_0[root@localhost test]# ll

2D,d^ zz2I)FT9D3_5ax0total 208ITPUB个人空间8t O3wN#C~B

-rw-r--r-- 1 root root 206305 Mar 8 10:28 test.log

W.d;B,S ^R1bY0然后查看/usr的inode使用情况ITPUB个人空间STT{ E6yQ

[root@localhost test]# df -iITPUB个人空间cV)l2{ \C

Filesystem Inodes IUsed IFree IUse% Mounted onITPUB个人空间5q6WH#P/S

/dev/sda6 525888 98096 427792 19% /usrITPUB个人空间D4h5{M}~ d

然后把test.log分割成每个字节一个文件,split的使用方法可以参考:http://zhang41082.itpub.net/post/7167/289531

$i!H)n I%kH\'c h0[root@localhost test]# split -a 10 -b 1 test.log

C'W F/i.O s v0统计分割后的总文件数目,比test.log的文件大小206305多了两个,这个一个是因为test.log文件本身占一个,还有就是统计的返回结果占一行,所以看到文件被成功分割为206305个。

b2c Y3v9f&v9zd0[root@localhost test]# ll | wc -l

#Q0L2GN { _ I9k0206307ITPUB个人空间 Rp!]earB

查看inode使用情况

r fc v!x:u m7{0[root@localhost test]# df -iITPUB个人空间4iWgJ"CW a

Filesystem Inodes IUsed IFree IUse% Mounted on

/p{2xN/aJ5o0/dev/sda6 525888 304401 221487 58% /usrITPUB个人空间C W;Y`aEda(G

可以看到,inode增加了304401-98096=206305个。然后把test.log重命名为test1.log,重新分裂

4G l"GiHT0[root@localhost test]# split -a 10 -b 1 test1.log z

8M'^C&s)d-HX.k0W0[root@localhost test]# ll|wc -lITPUB个人空间|:}g2h~ B?/\a

412612ITPUB个人空间 _P$Q1R!z$nN

[root@localhost test]# df -iITPUB个人空间hb5IFW-z/h \]H

Filesystem Inodes IUsed IFree IUse% Mounted on

"C.VPg/O/x4Uy9L;B+I0/dev/sda6 525888 510706 15182 98% /usr

/g-T)j4Y'Ef0inode已经使用了98%了,再重复一次ITPUB个人空间+d1W2}}ld6G

[root@localhost test]# mv test1.log test2.log

&_%pL#Qn?0[root@localhost test]# split -a 10 -b 1 test2.log y

%{1l7k)Q-e"E0split: yaaaaaaawly: No space left on device

cl5k(l%B#f&g_0jE/X6R0可以看到,进行到一半的时候已经不能对文件再进行分割了,而错误提示也已经出现 No space left on device。


总结:这类错误是比较少见的错误,有时候oracle的bug或者其他原因会导致某个目录的trace文件数目疯长,这时候就要小心这个问题了,因此日常的系统监控除了要监控磁盘空间的大小,对inode的使用情况也应该进行监控。ITPUB个人空间/x8GV1GL ?%AM

从这个问题可以看出,操作系统的知识多么重要,感谢zeal的文章,感谢同事提供了这篇文章。


 


后续和补充:


今天看到pub上eygle给出了更合理的解释,放在这里作为补充。


为什么/var目录的inode满了会影响到装在/opt目录的oracle不能启动呢?原来listener启动的时候会在/var/tmp目录下的.oracle隐藏目录下创建两个临时文件:


[oracle@stream .oracle]$ llITPUB个人空间?[{q `L

total 0

q(A$?,Yh%D-H o0srwxrwxrwx 1 oracle oinstall 0 Feb 5 05:49 s#4036.1ITPUB个人空间1D^4}Q*w

srwxrwxrwx 1 oracle oinstall 0 Feb 5 05:49 s#4036.2ITPUB个人空间H q8Gd:|'Kv b

srwxrwxrwx 1 oracle oinstall 0 Apr 20 04:26 s#5332.1ITPUB个人空间]A(S d Z5r}+S

srwxrwxrwx 1 oracle oinstall 0 Apr 20 04:26 s#5332.2ITPUB个人空间)c#WsSR t%M

srwxrwxrwx 1 oracle oinstall 0 Jan 22 21:53 s#7306.1

,qfd+JGH hs0srwxrwxrwx 1 oracle oinstall 0 Jan 22 21:53 s#7306.2

6y0o.H0z#Rk%a8U5QWh0srwxrwxrwx 1 oracle oinstall 0 Jan 13 04:21 s#9611.1ITPUB个人空间q0z3Q TkR1_

srwxrwxrwx 1 oracle oinstall 0 Jan 13 04:21 s#9611.2


可以看到这个临时文件确实是成对出现的。




最新回复


 


EYGLE的trace文件中很明显,execve("/opt/oracle/product/9.2.0/bin/lsnrctl", ["lsnrctl", "start"], [/* 33 vars */]) = 0

;z4d%~ y~0connect(4, {sa_family=AF_UNIX, path="/var/run/.nscd_socket"}, 110) = -1 ENOENT (No such file or directory)ITPUB个人空间vJ5f'?8U+_ HN'm

access("/var/tmp/.oracle", F_OK) = 0

0B"GD @Q$I'[5k0access("/var/tmp/.oracle/sEXTPROC", F_OK) = 0ITPUB个人空间6Nm-@5K*u[s

connect(4, {sa_family=AF_UNIX, path="/var/tmp/.oracle/sEXTPROC"}, 110) = 0

?pI HX rv,y+Np3@#Y0如果文件创建不了,导致不能继续执行下面的操作了,猜测,当时如果用strace做跟踪,你的access("/var/tmp/.oracle", F_OK) = 0

4jS'd4m[1Vi8k0状态可能不是0了(0可能代表的是两个临时文件创建成功),呵呵!






2011/6/27 23:27
应用扩展 工具箱


回复: No space left on device的原因 和split 拆分文件
网站管理员
注册日期:
1970/1/1 8:00
所属群组:
网站管理员
帖子: 7077
等级: 58; EXP: 5
HP : 0 / 1426
MP : 2359 / 207835
离线
在linux系统中对文件进行分割
作者 zhang41082 10:05 | 静态链接网址 | 最新回复 (0) | 引用 (0) | 操作系统
经常对从数据库中SPOOL出来的数据进行分割,而以往都是要在UltraEdit中一点点的剪切、复制,一直觉得linux中应该有个命令,今天终于找到了,那就是SPLIT。



下面是帮助信息:

[root@logana opt]# split --help
Usage: split [OPTION] [INPUT [PREFIX]]
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
PREFIX is `x'. With no INPUT, or when INPUT is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
-a, --suffix-length=N use suffixes of length N (default 2)
-b, --bytes=SIZE put SIZE bytes per output file
-C, --line-bytes=SIZE put at most SIZE bytes of lines per output file
-l, --lines=NUMBER put NUMBER lines per output file
--verbose print a diagnostic to standard error just
before each output file is opened
--help display this help and exit
--version output version information and exit

SIZE may have a multiplier suffix: b for 512, k for 1K, m for 1 Meg.

使用起来也非常简单,比如:

split -l 100000 xxx.lst aaaa

表示把xxx.lst分割成每10万行一个的文件,分割后的文件使用aaaa作为前缀

使用不同的参数,也可以按照文件的大小进行分割。

2011/6/27 23:28
应用扩展 工具箱






可以查看帖子.
不可发帖.
不可回复.
不可编辑自己的帖子.
不可删除自己的帖子.
不可发起投票调查.
不可在投票调查中投票.
不可上传附件.
不可不经审核直接发帖.

[高级搜索]



系统导航

 

Copyright © 2001-2010 安信网络. All Rights Reserved
京ICP备05056747号