Q&A
- 为什么异步能提高性能?
一言以蔽之,异步化能提高线程利用率。这意味着,相比于TPC(Thread-Per-Connection),达到相同的CPU利用率,所需要的线程更少,所以,线程切换的更少,资源占用量(主要是内存资源)更少。
下面证明之:
首先证明,假设我们的应用的I/O和非I/o之比为4:1,也就是I/O占80%,计算只占20%,如果采用
TPC的模型,可以如果证明,如果一个线程管理一个I/O,那么整体线程使用率不可能超过20%。除非可以一个线程管理多个I/O。 即epoll,epoll,之所以高效是由于,他可以同时管理多个I/O.并且
任意一个I/O可用,它就不阻塞。(试想,如果它只能等待一个I/O返回,才能调用下一个,那么其实)理论上它只需要等待4s/N。(N为注册在epoll上的描述符数量)。(实际上由于Round-Trip的硬性限制。以及随着N的增加,带来的遍历,派发等成本,不可接近于0),
NIO必须提供一种能力,当有可读可写事件时,将对应的Handler调度执行。也就是实现了做I/O的,以及依赖于I/O结果的Handler可能并不在同一个线程中。
2.为什么需要多个I/O线程。
随着epoll上注册事件的这多。我们达到“供不用求”的状态,主要是对于迭代Selectionkey的分发上,所以需要多个I/O去做分发,而对于耗时操作。最好另起一个线程,而不是放在I/O线程中。如果不耗时,那么可以在I/O线程中完成,这样可以减少上下文切换提高效率。
参考资料: