我正在使用由第三方供应商开发的服务器API。 API以.jar文件的形式出现,但由于我们想在ASP.NET MVC应用程序中使用它,我们使用IKVM将其转换为DLL。该解决方案在大多数情况下运行良好。
但是,有一天,我收到用户社区的一些投诉,说我们的应用程序在我们的一台服务器上运行缓慢。所以我检查了它,发现运行我们的IIS应用程序池的w3wp.exe工作进程的CPU使用率为99%(通常低于10%)。我将一个dotTrace实例附加到w3wp.exe,并发现“热点”可以追溯到服务器API调用的一些Java输入流读取方法:
java.io.BufferedInputStream.getBufIfOpen
java.io.BufferedInputStream.fill
java.io.BufferedInputStream.read(Byte[], Int32, Int32)
java.net.SocketInputStream.read(Byte[], Int32, Int32)
java.io.BufferedInputStream.read1(Byte[], Int32, Int32)
进一步查看我们自己的源代码,我相信我已经发现了我们这方面的违规行:
messageDataBytes = dataConnector.getInputStream().read();
这条线看起来很无辜。为什么它会将CPU运行到99%?如何从我们的应用程序中安全地调用这些方法,并防止这些方法中的任何不当行为对整个应用程序产生负面影响?
我最初的想法是从一个单独的线程调用这些方法,如果它在一段时间后没有完成,我可以杀死它。我是在正确的轨道上吗?
任何想法和建议都将不胜感激。