netty select() 怎么会花那么多时间?

How could netty select() take so much time?

根据visualvm的采样器:

我是 Netty 的新手,但是当我分析一个 Java 应用程序时,select() 似乎占了 self time 的 85%。但是 self time(CPU) 只是非常非常小的一部分。因此,如果我正确理解 self timeself time(CPU),则意味着 select() 一直在等待。服务器端代码是否正常?如此多的等待会花费很多 CPU 的使用量吗?我的服务器有 12 个内核 CPU,频率为 2.4 GHz。这个 java 应用程序在 top 中花费了将近 200%(linux 中类似 taskmgr 的工具)。

select() 中花费的时间是您的应用程序的 停机时间 。该应用程序似乎是多线程的,并行化程度高,一旦获取数据,CPU 使用率非常高。然而,select() 中的时间表示您的应用程序 没有 数据的时间,因此它在等待网络操作完成时被阻塞。

这与您观察到的 CPU 使用 top 的情况相符。在 12 核系统上,200% 对应于 2/12,或总可用时间的大约 16% CPU。假设您的系统上没有其他 运行,停机时间为 (100-16),或大约 84% - 即大致花费在 select() 的时间,如 visualvm 所示。