这些事情显然需要仔细检查和代码可用性来彻底分析并给出好的建议。然而,这并不总是可行的,我希望可以根据我在下面提供的信息为我提供好的提示。
我有一个使用侦听器线程来侦听传入数据的服务器应用程序。传入的数据被解释为特定于应用程序的消息,然后这些消息会引发事件。
到目前为止,我对事情的完成方式并没有任何控制权。
因为这是一个遗留应用程序,所以这些事件以前由同一个侦听器线程(主要是单线程应用程序)处理。这些事件被发送到一个黑盒,并产生一个应该写入磁盘的结果。
为了提高吞吐量,我想使用一个线程池来处理这些事件。这个想法是侦听器线程可以在每次创建事件时生成新任务,并且线程将负责黑盒调用。最后,我有一个后台线程执行写入磁盘。
仅使用以前的设置和后台编写器,一切正常,吞吐量是以前的约 1.6 倍。
当我添加线程池时,性能会下降。一开始,一切似乎都运行顺利,但过了一会儿,一切都变得非常缓慢,最后我得到了 OutOfMemoryExceptions。奇怪的是,当我每次将任务添加到池中时打印活动线程的数量(以及有关排队的任务数量等信息)时,看起来线程池跟上没有问题生产者(监听线程)。
使用 top -H 检查 CPU 使用情况,一开始它分布得很均匀,但最后工作线程几乎没有活动,只有侦听器线程处于活动状态。然而它似乎并没有提交更多的任务......
任何人都可以假设这些症状的原因吗?您是否认为遗留代码中的某些内容(我无法控制)更有可能在添加多个线程时变坏?内存不足的问题应该是因为某处的某些队列变得太大,但是由于线程池几乎从不包含排队的任务,所以不可能是这样。
欢迎任何想法。特别是关于如何更有效地诊断这种情况的想法。我怎样才能更好地了解我的线程正在做什么等。
谢谢。