我正面临性能问题。在我的项目中,我有一个Web服务客户端,它调用硬件实体来获取其状态和其他参数的值。我正在使用基于Soap的Spring WS。
我有大约5000个设备,我需要一次使用100-500个线程并行调用。
只需一次通话,每台设备所需的时间不到5秒。
但是当处于多线程时,时间会持续增加,从5秒增加到30秒,甚至超过100秒甚至每台设备的设备。所有设备都需要超过30分钟,根据要求应该少于2分钟。
- 我们为每个设备提供不同的uri,因此我们动态获取URI,因此我们使用Spring的webServiceTemplate方法-marshalSendAndReceive(String uri,Object requestPayload,WebServiceMessageCallback requestCallback)。
- WebServiceTemplate对象是singleton。
- 只有1个wsdl但不同的设备是不同的WS提供商。
在某个地方我发现它可能是marshallers的一个问题所以我增加了单独的webServiceTemplate对象的marshallers对象的数量,但这也没有用。
请与我分享解决此类问题的想法。如果需要更多信息以解决此问题,如果我错过了分享任何信息,请告诉我。
详细阐述了这个问题:
谢谢hagrawal,是的线程无法增加响应时间,但某些线程花费的时间我无法理解但是,是的,调用实际的webservice与设备通信需要时间。我已经开始和结束时间来测量该呼叫的时间,并发现前几个设备,所花费的时间少于3-4秒,但之后,其他设备的时间不断增加。
我也检查了JVM,找不到任何与内存有关的问题但是,发现这么多线程被多次阻塞了。看起来这些阻塞线程大部分时间都在消耗。我已经获取了那些被阻塞线程的堆栈跟踪,如下所示。
pool-111757-thread-1 [13184](已阻止)
- sun.security.ssl.Handshaker.calculateConnectionKeys line:1266
- sun.security.ssl.Handshaker.calculateKeys line:1112
- sun.security.ssl.ClientHandshaker.serverHelloDone line:1078
- sun.security.ssl.ClientHandshaker.processMessage line:348
- sun.security.ssl.Handshaker.processLoop line:979
- sun.security.ssl.Handshaker.process_record line:914
- sun.security.ssl.SSLSocketImpl.readRecord line:1062
- sun.security.ssl.SSLSocketImpl.performInitialHandshake line:1375
- sun.security.ssl.SSLSocketImpl.starHandshake line:1403
- sun.security.ssl.SSLSocketImpl.startHandshake line:1387
- org.apache.http.conn.ssl.SSSLConnectionSocketFactory.createLayeredSocket line:275
- org.apache.http.conn.ssl.SSSLConnectionSocketFactory.connectSocket line:254
- org.apache.http.impl.conn.HttpClientConnectionOperator.connect line:123
- org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect line:318
再次告知,当调用实际的设备ws时,该方法的时间会增加。