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