inode佔滿前因後果

0. 問題描述

  • 現象
    收到釘釘報警,線上Solr服務器/var分區inode佔滿。

  • 影響
    /var分區無法再創建新文件。

  • inode是什麼
    inode爲文件系統中塊的索引節點,os中每個文件會佔用一個inode,且inode的大小是有限制,和磁盤大小成正比,與分區塊的數量一致,所以在磁盤格式化後大小已固定。

1. 排查

# 1. 使用df -i 查看各分區inode使用情
[root@xxx ~]# df -i
Filesystem       Inodes   IUsed    IFree IUse% Mounted on
/dev/sda2       2097152   26111  2071041    2% /
tmpfs          33059719       4 33059715    1% /dev/shm
/dev/sda1         32768      46    32722    1% /boot
/dev/sda7      77840384   49535 77790849    1% /data
/dev/sda3       2097152  199748  1897404   10% /usr
/dev/sda5       2097152 2061500    35652   99% /var
# 結論:確定var分區inode基本快滿了

# 2. 使用 find /var目錄查看最近1個小時內生成的文件
[root@xxx ~]# find /var/  -type f -mtime +60
....
/var/spool/postfix/maildrop/8B39F1B854F
/var/spool/postfix/maildrop/EA79986E6
/var/spool/postfix/maildrop/7576417CEB2
/var/spool/postfix/maildrop/EFEEA128578
/var/spool/postfix/maildrop/DF9C5216A
/var/spool/postfix/maildrop/895FB124392
.... 
# 結論:通過上述內容,基本可以定位是有由於/var/spool/postfix/maildrop目錄下生成太多小文件引發問題的

# 3. 臨時解決方法
[root@xxx maildrop]# cd /var/spool/postfix/maildrop
[root@xxx maildrop]# rm -rf * 
-bash: /bin/rm: Argument list too long # 無法刪除
# 3.1 由於文件太多無法刪除的解決辦法,通過如下腳本查找出當前目錄下的所有文件,然後再刪除
[root@xxx maildrop]# find /var/spool/postfix/maildrop -type f -name '*' | xargs rm -rf '*'

[root@xxx maildrop]# df -i 
Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/sda2       2097152  26111  2071041    2% /
tmpfs          33059719      4 33059715    1% /dev/shm
/dev/sda1         32768     46    32722    1% /boot
/dev/sda7      77840384  50439 77789945    1% /data
/dev/sda3       2097152 199748  1897404   10% /usr
/dev/sda5       2097152   3952  2093200    1% /var # 恢復正常

2. 原因分析及解決辦法

通過上述操作,發現原因爲:/var/spool/postfix/maildrop目錄生成大量文件。

  • 進一步分析
    maildrop文件夾下的文件生成原因爲:

由於 Linux 在執行 cron 時,會將 cron 執行腳本中的 output 和 warning 信息,都會以郵件的形式發送 cron 所有者, 而由於客戶環境中的 sendmail 和 postfix 沒有正常運行,導致郵件發送不成功,全部小文件堆積在了 maildrop 目錄下面,而且沒有自動清理轉換的機制,所以長達一年的時間,此目錄已堆積了大量的文件。查看 man cron 的信息,可以知道會發送給 cron owner

  • 根治方法
    cron任務執行結果未屏蔽,解決辦法:
# 1. 有問題的設置方式
*/10 * * * * /tmp/test.sh

# 2. 使用>/dev/null 2>&1,將執行過程中的output和warning屏蔽,但cron任務執行的日誌,仍會在/var/log/cron中找到
*/10 * * * * /tmp/test.sh >/dev/null 2>&1

99. 引文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章