Linuxでのfd漏洩の位置づけ
以前、会社で生産ツールを書いたことがあります.ある駆動ノードを読み書きすることで設備情報の変更機能を実現しました.結果、コピー機をテストして2時間も切らなければなりません.カーネル印刷を見ると「ファイルを開くのに失敗しました」と、perrorが印刷されてからファイルを開くのが多すぎて、fd(ファイル記述子)が漏れたと推測しました.fd漏洩はどういうことですか.linuxがファイルを開くのは通常openがfdを返す形式で、オペレーティングシステムは現在のプロセスがファイルを開く記録を維持しますが、数は制限されており、オペレーティングシステムが開くことができるfdの合計も限られています.プロセスが閉じずにファイルを開くと、openを呼び出すとオペレーティングシステムは失敗します.したがって、特にサービス型プロセスと常駐メモリのプロセスでは、ファイルを開くと、使用しないときに閉じることを忘れないでください.そうしないと、開くだけで閉じないと、ハンドルが漏れます.もちろんプロセスが終了すると、オペレーティングシステムは自分で回収fdを閉じるので、プロセスの実行時間が短いと終了し、開くfdが少なく、理論的には明示的に閉じなくてもよいが、closeを呼び出すのは良い習慣である.
/proc/pid/fd
/proc/pid/fdフォルダはLinuxにマウントされている現在開いているファイル記述子(fd)情報を記録しており、fdを開くたびにfdというファイル名のファイルが生成されます.
位置
lsがfdの数が特に多いことを発見したら、fdが漏れたかどうかを考えなければなりません.詳細はlsofでご覧ください.
/proc/pid/fd
/proc/pid/fdフォルダはLinuxにマウントされている現在開いているファイル記述子(fd)情報を記録しており、fdを開くたびにfdというファイル名のファイルが生成されます.
oujiangping at ubuntu in ~/project/test
$ sudo ls /proc/3645/fd
0 1 10 11 12 2 3 4 5 6 7 8 9
位置
lsがfdの数が特に多いことを発見したら、fdが漏れたかどうかを考えなければなりません.詳細はlsofでご覧ください.
nm-applet 3645 oujiangping 0r CHR 1,3 0t0 6 /dev/null
nm-applet 3645 oujiangping 1u CHR 136,2 0t0 5 /dev/pts/2
nm-applet 3645 oujiangping 2u CHR 136,2 0t0 5 /dev/pts/2
nm-applet 3645 oujiangping 3r CHR 1,9 0t0 11 /dev/urandom
nm-applet 3645 oujiangping 4u unix 0x0000000000000000 0t0 30080 type=STREAM
nm-applet 3645 oujiangping 5u a_inode 0,11 0 9114 [eventfd]
nm-applet 3645 oujiangping 6u unix 0x0000000000000000 0t0 30082 type=STREAM
nm-applet 3645 oujiangping 7u a_inode 0,11 0 9114 [eventfd]
nm-applet 3645 oujiangping 8u unix 0x0000000000000000 0t0 30083 type=STREAM
nm-applet 3645 oujiangping 9u a_inode 0,11 0 9114 [eventfd]
nm-applet 3645 oujiangping 10u a_inode 0,11 0 9114 [eventfd]
nm-applet 3645 oujiangping 11u a_inode 0,11 0 9114 [eventfd]
nm-applet 3645 oujiangping 12u unix 0x0000000000000000 0t0 30085 type=STREAM