5

私は Sun の JDK 1.6.0_26 と NIO (Netty を使用) を使用しており、lsof には次のような数百のファイル記述子が表示されますanon_inode

$ lsof -np 11225 | fgrep -w anon_inode
java    11225 nobody   57u     0000                0,9         0     1386 anon_inode
java    11225 nobody   61u     0000                0,9         0     1386 anon_inode
java    11225 nobody   65u     0000                0,9         0     1386 anon_inode
java    11225 nobody   69u     0000                0,9         0     1386 anon_inode
java    11225 nobody   73u     0000                0,9         0     1386 anon_inode
java    11225 nobody   77u     0000                0,9         0     1386 anon_inode
java    11225 nobody   81u     0000                0,9         0     1386 anon_inode
java    11225 nobody   86u     0000                0,9         0     1386 anon_inode
java    11225 nobody   89u     0000                0,9         0     1386 anon_inode
java    11225 nobody   93u     0000                0,9         0     1386 anon_inode
java    11225 nobody   97u     0000                0,9         0     1386 anon_inode
[...]

匿名 inode とは何かについての明確な説明を見つけることができませんでしfs/anon_inodes.cた。Linux カーネルのソース ツリーを調べたところ、おそらくepollそれを使用しているように見えますが、なぜそんなに多くの i ノードが必要なのかわかりません。複数の「epoll ループ」とタイマー スレッドがありますが、私の数ほどではありませんanon_inode

4

2 に答える 2

6

それは確かにおそらく epoll です。初期の JDK 1.6.x リリースの 1 つから、セレクターはデフォルトで epoll を使用します。このセレクター impl は、ソケット自体で使用される記述子に加えて、古いファイル記述子よりも多くのファイル記述子を使用します。複数のセレクターを単一の SocketChannel に登録する場合 (たとえば、読み取り用と書き込み用に別々のセレクター) を登録する場合は、より多くのファイル記述子も使用します。Netty が NIO を使用する場合、ほぼ確実にセレクターを使用します。あるアプリでは、epoll ベースのセレクターを使用しているため、ファイル記述子とソケットの比率は約 4 対 1 でした。java.nio.channels.spi.SelectorProvider プロパティを変更することで古いセレクターの実装に戻すことができ、記述子の数を減らすことができますが、おそらくパフォーマンス (YMMV) が犠牲になります。

于 2012-02-21T18:13:57.970 に答える
1

おそらく、これらの inode は、Java の Direct ByteBuffers に変換されるメモリ マップされた「ファイル」に関連しています。システム コールmmap(2)は通常、(ファイルハンドルを使用して) ファイルを操作します。MAP_ANONYMOUSただし、実際のファイルハンドルを持たずにメモリ マッピングを操作するオプションもサポートしています。これは、内部で「匿名 i ノード」が必要になる可能性があるように思えます。

于 2011-11-17T19:08:42.997 に答える