Linux系统目录数和文件数限制
對于系統(tǒng)管理員來說,了解系統(tǒng)的一些限制是非常有必要的,這樣可以根據(jù)需要進行必要的參數(shù)配置和調(diào)整,進而實現(xiàn)更優(yōu)的性能,對于系統(tǒng)設(shè)計人員甚至程序員來說,了解系統(tǒng)的一些限制,也會有助于設(shè)計更為合理的存儲結(jié)構(gòu)。
一 目錄數(shù)限制
RedHat Enterprise Linux AS 4.0 Update 3
在同一個路徑下,一級子目錄的個數(shù)限制為31998,如果你的應(yīng)用生成的目錄可能會超過這個數(shù),那要注意進行目錄分級。例如,如果目錄名為數(shù)字的話,可以將數(shù)字除以10000后的整數(shù)值做為父目錄名 (/data/1/13892),如果是目錄名為字母的,可以用前幾個字符來做為父一級目錄(/data/ab/abcdefg)等等。
通過以下的命令行可以得到一個目錄下一級子目錄的總數(shù):
$ ls -F | grep "/" | wc
解決方法:
1) 創(chuàng)建子目錄
2) Linux為了cpu的搜索效率而規(guī)定的,要想改變數(shù)目大概要重新編譯內(nèi)核.
二 文件數(shù)目限制
每個文件對應(yīng)一個inode,如果inode沒有了,那就算有空間也不能再寫文件了。
通過以下命令行,可以看某個分區(qū)的inodes信息:
[root@boss tmp]# tune2fs -l /dev/sda5 | grep "inodes"
Free inodes: 1247005
[root@boss tmp]#
2種解決辦法:
1) 重新mkfs,mkfs時將inode數(shù)調(diào)的多一些(根據(jù)你fs中文件的總數(shù)而定),塊尺寸調(diào)得小一些(根據(jù)每個文件的平均大小而定)
2) 使用loopback文件系統(tǒng)臨時解決
在/usr中(也可以在別處)創(chuàng)建一個大文件,然后做成loopback文件系統(tǒng),將原來的文件移到這個文件系統(tǒng)中,并將它mount到/usr下合適的位置。這樣可以大大減少你/usr中的文件數(shù)目。但是系統(tǒng)性能會有點損失。
三 單個目錄下文件數(shù)限制
原來以為Linux下單個目錄內(nèi)有文件數(shù)量限制,Google了一番沒有看到明確的說法,到是Freebsd下有65535的限制,通過重新編譯內(nèi)核可以更改。(可以看看/usr/include/sys/syslimits.h)
不過不建議在一個目錄下放太多文件,會影響系統(tǒng)性能。
補充: ulimit -a 命令查看所有的限制,并能臨時改變限制。
(參考鏈接: http://blog.chinaunix.net/u1/34654/showart_331913.html)
==============================================================
昨晚排查了在KVM的build系統(tǒng)中的一個問題,跟蹤到后面發(fā)現(xiàn)在一個目錄下mkdir創(chuàng)建目錄失敗。我手動試了一下,提示如下:cannot create directory `/home/master/jaytemp` too many links
我發(fā)現(xiàn)是在一個目錄下的一級子目錄數(shù)量是有限制的,遂做了點實驗和調(diào)查,結(jié)合網(wǎng)上其他人寫的博客,得到如下的一些關(guān)于目錄個數(shù)和文件個數(shù)限制的結(jié)論。
1.ext3文件系統(tǒng)一級子目錄的個數(shù)默認為31998(個),準確地說是32000個。
Linux為了cpu的搜索效率而規(guī)定的,要想改變數(shù)目限制需要重新編譯內(nèi)核。我看到在kernel代碼中有這樣的:
include/linux/ext2_fs.h:#define EXT2_LINK_MAX 32000
include/linux/ext3_fs.h:#define EXT3_LINK_MAX 32000
為什么說31998個呢?這是因為mkdir創(chuàng)建一個目錄時,目錄下默認就會創(chuàng)建兩個子目錄的,一個是.目錄(代表當前目錄),另一個是..目錄(代表上級目錄)。這兩個子目錄是刪除不掉的,“ rm . ” 會得到“rm: cannot remove `.' or `..'”的提示。所以32000-2=31998。
另外,你可以通過如下的腳本來嘗試。
#!/bin/bash
mkdir tmp
cd tmp
i=1
while [ $i -lt 35000 ]
do
mkdir $i
if [ $? -ne 0 ]; then
echo "cannot make dir $i"
exit
fi
((i++))
done
運行這個腳本,你最后將得到“mkdir: cannot create directory `31999': Too many links”的錯誤信息。
另外,不建議在一個目錄下有太多的文件或者目錄,這回降低文件系統(tǒng)查找文件或目錄的性能。忽然想起阿里巴巴的圖片服務(wù)器中將圖片的存儲按照年月等分為不同的各級子目錄而不是在一個目錄下,其中一個原因也是出于性能的Linux操作系統(tǒng)考慮。
2.ext3文件系統(tǒng)下單個目錄里的最大文件數(shù)無特別的限制,是受限于所在文件系統(tǒng)的inode數(shù)。
我在RHEL5u5的ext3文件系統(tǒng)中測試,在一個目錄下,touch了100萬個文件是沒有問題的。但是肯定會受到所在文件系統(tǒng)的inode數(shù)的限制。
df -i /dev/sdaX或者使用tune2fs -l /dev/sdaX或者dumpe2fs -h /dev/sdaX查看可用inode數(shù),后兩個命令輸出結(jié)果是一樣的,但是跟df所得出的可用inode數(shù)會有些誤差,其中原因,我也沒搞清楚。
網(wǎng)上有兩種解決inode數(shù)限制的辦法如下,不過我沒試過了。
2.1 重新mkfs,mkfs時將inode數(shù)調(diào)的多一些(根據(jù)你fs中文件的總數(shù)而定),塊尺寸調(diào)得小一些(根據(jù)每個文件的平均大小而定)
2.2 使用loopback文件系統(tǒng)臨時解決:在/usr中(也可以在別處)創(chuàng)建一個大文件,然后做成loopback文件系統(tǒng),將原來的文件移到這個文件系統(tǒng)中,并將它mount到/usr下合適的位置。這樣可以大大減少你/usr中的文件數(shù)目。但是系統(tǒng)性能會有點損失。
3.默認打開文件個數(shù)(文件描述符)限制(默認是1024個)
ulimit -n 命令可以查看
修改這個限制可以使用ulimt -SHn 65535 命令
還可以在/etc/security/limit.conf 里設(shè)置用戶打開文件數(shù)、進程數(shù)、CPU等信息
4.ext3文件系統(tǒng)下filename最大字符長度(默認255個英文字符)
LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done`
touch $LENTH
當增加到256時,touch報錯,F(xiàn)ile name too long
linux系統(tǒng)下ext3文件系統(tǒng)內(nèi)給文件/目錄命名,最長只能支持127個中文字符,英文則可以支持255個字符
參考文檔:
http://bbs.chinaunix.net/viewthread.php?tid=1972687
http://www.unixreference.net/articles/linux/fs/2007/1115/651.html
http://it.chinawin.net/os/article-3958.html
總結(jié)
以上是生活随笔為你收集整理的Linux系统目录数和文件数限制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言低级绘图函数-axis
- 下一篇: 抖音头像居然能动了!手把手教你开启“抖音