題 設備上沒有剩餘空間,但分區只有半滿且inode可用


我正在運行一個Python進程,它在一個目錄下創建了大量的文件(我應該更智能,並將它們分成多個目錄,但這是另一個故事)。

過了一會兒,我注意到我無法繼續前進,腳本開始給我一個錯誤:

IOError: [Errno 28] No space left on device: /scr1/data/somefile_00023532.txt

經過研究,我發現最常見的原因是(1)分區確實沒有剩餘空間,(2)所有inode都用完了。然而, df 節目

$ df -h
...
/dev/sdb1       2.7T  1.2T  1.4T  46% /scr1
...

的/ dev / sdb1的 是有問題的分區)和

$ df -i 
...
/dev/sdb1      183148544 17725595 165422949   10% /scr1
...

所以空間和inode確實仍然可用。

可能有太多文件:

$ ls /scr1/data | wc
6468500 6468500 349747747

但是ext4應該能夠處理這個問題。

什麼可能導致Linux認為空間用完了?

更新1

出現問題時,特定文件名會出現問題。例如,

$ touch /scr1/data/somefilewithproblem.txt
touch: cannot touch ‘/scr1/data/somefilewithproblem.txt‘: No space left on device

但是具有相同文件名模式的其他文件(我使用的是良性的東西,如十六進制的散列,數字ID號等)沒有相同的問題。

更新2

DUH!看起來文件系統在某種程度上已經損壞,並且在運行之後 fsck.ext4 在有問題的分區上,問題就消失了。

非常感謝那些給我幫助的人!


2
2017-11-03 19:01


起源


在單個目錄上有600萬個文件太多了;你需要打破它。您可能看到的是哈希衝突:您嘗試使用的名稱與其他600萬個文件中的名稱相同。 - psusi
這確實是一個有趣的假設,我當然搞砸了沒有把它們分成多個目錄。但是,如果散列機制在僅600萬個文件後實際導致衝突,我會擔心。無論如何,事實證明分區存在一些問題,這是真正的罪魁禍首。感謝您的見解。 - Taro Sato


答案:


“設備上沒有空間”可能是一個非常誤導性的錯誤。除了沒有可用的磁盤空間之外,它還可以彈出各種寫入條件。

該文件是否已存在且由其他人擁有?

您是否在此文件系統上啟用了配額?

如果您嘗試手動在該文件系統中創建另一個文件(即 touch /src1/data/testfile)你得到相同的錯誤,還是創建文件?

您是否可以嘗試以root身份創建文件?


3
2017-11-03 19:55



分區上沒有設置配額。可以通過觸摸創建新文件。沒有其他進程寫入分區...真的被我所看到的混淆。 - Taro Sato
您的流程如何打開文件?一旦創建它們會關閉它們,還是讓它們保持打開狀態?您可能會對允許的打開文件數量設置限制。 - Omnipresence
我使用multiprocessing.Pool運行多個Python進程,但是當我限製到單個進程時就會發生這種情況,這不是問題。我用 with open 並且僅包圍寫操作,因此不應該有太多連接打開。然而,奇怪的是,經過進一步調查,這個問題似乎發生在特定的文件名中;我無法創建具有相同名稱的文件 touch例如,在shell上。 - Taro Sato