1.回顧:
某在線主機深夜連續接到告警系統的disk Used 超限告警。
登陸主機查看卻遇到了困惑:在檢查磁盤使用量 df –h 出來的磁盤使用量確實和告警信息一樣,已經被100%占用,但是查看目錄大小 du 時,卻顯示實際目錄大小並非這樣,而是有很大空閑空間。
如圖:磁盤用量 df –h 結果為100%Used,
目錄實際總大小 du –h –max-depth=1,顯示總目錄大小為60k,幾乎可以忽略的使用比例。
【知識准備】 [linux] lsof 命令了解:
lsof(list open files)是一個查看當前系統文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在后台都為該應用程序分配了一個文件描述符,該文件描述符提供了大量關於這個應用程序本身的信息。
lsof打開的文件可以是:
-
普通文件
-
目錄
-
網絡文件系統的文件
-
字符或設備文件
-
(函數)共享庫
-
管道,命名管道
-
符號鏈接
-
網絡文件(例如:NFS file、網絡socket,unix域名socket)
-
還有其它類型的文件,等等
【man linux】結果:包含了大量的參數:
[root@demo1 local]# man lsof
LSOF(8) LSOF(8)
NAME
lsof - list open files
SYNOPSIS
lsof [ -?abChlnNOPRtUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [ +|-D D ] [ +|-e s ] [ +|-f [cfgGn] ] [ -F [f] ] [
-g [s] ] [ -i [i] ] [ -k k ] [ +|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t[m<fmt>]] ] [ -s [p:s] ] [
-S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]
命令參數
-a 列出打開文件存在的進程
-c<進程名> 列出指定進程所打開的文件
-g 列出GID號進程詳情
-d<文件號> 列出占用該文件號的進程
+d<目錄> 列出目錄下被打開的文件
+D<目錄> 遞歸列出目錄下被打開的文件
-n<目錄> 列出使用NFS的文件
-i<條件> 列出符合條件的進程。(4、6、協議、:端口、 @ip )
-p<進程號> 列出指定進程號所打開的文件
-u 列出UID號進程詳情
-h 顯示幫助信息
-v 顯示版本信息
實際使用:
$lsof| more COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 150352 1310795 /sbin/init init 1 root mem REG 253,0 65928 5505054 /lib64/libnss_files-2.12.so init 1 root mem REG 253,0 1918016 5521405 /lib64/libc-2.12.so init 1 root mem REG 253,0 93224 5521440 /lib64/libgcc_s-4.4.6-20120305.so.1 init 1 root mem REG 253,0 47064 5521407 /lib64/librt-2.12.so init 1 root mem REG 253,0 145720 5521406 /lib64/libpthread-2.12.so ...
說明:
lsof輸出各列信息的意義如下:
-
COMMAND:進程的名稱
-
PID:進程標識符
-
PPID:父進程標識符(需要指定-R參數)
-
USER:進程所有者
-
PGID:進程所屬組
-
FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等:
(1)cwd:表示current work dirctory,即:應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改 (2)txt :該類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序 (3)lnn:library references (AIX); (4)er:FD information error (see NAME column); (5)jld:jail directory (FreeBSD); (6)ltx:shared library text (code and data); (7)mxx :hex memory-mapped type number xx. (8)m86:DOS Merge mapped file; (9)mem:memory-mapped file; (10)mmap:memory-mapped device; (11)pd:parent directory; (12)rtd:root directory; (13)tr:kernel trace file (OpenBSD); (14)v86 VP/ix mapped file; (15)0:表示標准輸入 (16)1:表示標准輸出 (17)2:表示標准錯誤 一般在標准輸出、標准錯誤、標准輸入后還跟着文件狀態模式:r、w、u等 (1)u:表示該文件被打開並處於讀取/寫入模式 (2)r:表示該文件被打開並處於只讀模式 (3)w:表示該文件被打開並處於 (4)空格:表示該文件的狀態模式為unknow,且沒有鎖定 (5)-:表示該文件的狀態模式為unknow,且被鎖定 同時在文件狀態模式后面,還跟着相關的鎖 (1)N:for a Solaris NFS lock of unknown type; (2)r:for read lock on part of the file; (3)R:for a read lock on the entire file; (4)w:for a write lock on part of the file;(文件的部分寫鎖) (5)W:for a write lock on the entire file;(整個文件的寫鎖) (6)u:for a read and write lock of any length; (7)U:for a lock of unknown type; (8)x:for an SCO OpenServer Xenix lock on part of the file; (9)X:for an SCO OpenServer Xenix lock on the entire file; (10)space:if there is no lock.
-
TYPE:文件類型,如DIR、REG等,常見的文件類型:
(1)DIR:表示目錄 (2)CHR:表示字符類型 (3)BLK:塊設備類型 (4)UNIX: UNIX 域套接字 (5)FIFO:先進先出 (FIFO) 隊列 (6)IPv4:網際協議 (IP) 套接字
-
DEVICE:指定磁盤的名稱
-
SIZE:文件的大小
-
NODE:索引節點(文件在磁盤上的標識)
-
NAME:打開文件的確切名稱
詳細使用實例:http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/lsof.html
2.故障排查
lsof | grep -i delete 或者 lsof +d /tmp 或者 lsof +D /tmp
非常多的fpm進程在操作 /tmp 目錄,重啟fpm之后。空間釋放:
幾個資料:
https://mp.weixin.qq.com/s/bEhuc1PPGPuYuA2mQArHLQ
http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/lsof.html



