我正在使用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是什么的明确解释,我查看了Linux内核的源代码树中的fs / anon_inodes.c,似乎epoll可能会使用它,但我不知道为什么我会这样做许多.我有多个“epoll循环”和计时器线程,但不像我的anon_inode数量那么多.

解决方法:

这确实很可能是epoll.选择器默认使用epoll,从早期的JDK 1.6.x版本开始,除了套接字本身使用的描述符之外,此选择器impl使用的文件描述符多于旧文件描述符.如果使用单个SocketChannel注册多个选择器,则还将使用更多文件描述符,例如,用于读取和写入的单独选择器.如果Netty使用NIO,它几乎肯定会使用选择器.在一个应用程序中,由于使用基于epoll的选择器,我的文件描述符与套接字比率约为4比1.通过更改java.nio.channels.spi.SelectorProvider属性可以恢复到旧的选择器实现,它将减少描述符的数量,但可能以性能为代价(YMMV).

标签:java,linux-kernel,nio,netty,inode

来源: https://codeday.me/bug/20190621/1252345.html

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐