我们在Linux上运行Java应用程序(Ubuntu服务器)。很长一段时间以来,我们一直面临着很高的recv-q问题。应用程序挂起,每隔几个小时就不会从套接字读取数据。在线程转储中,我们发现了下面的堆栈跟踪。
"接收器 - 146"守护进程prio = 10 tid = 0x00007fb3fc010000 nid = 0x7642 runnable [0x00007fb5906c5000] java.lang.Thread.State:RUNNABLE
在java.net.SocketInputStream。 socketRead0(本机方法)
在java.net.SocketInputStream.read(SocketInputStream.java:150)
在java.net.SocketInputStream.read(SocketInputStream.java:121)
在java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
在java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334) - locked< 0x00000007688f1ff0> (java.io.BufferedInputStream)
在org.smpp.TCPIPConnection.receive(TCPIPConnection.java:413)
at org.smpp.ReceiverBase.receivePDUFromConnection(ReceiverBase.java:197)
at org.smpp.Receiver.receiveAsync(Receiver.java:351)
at org.smpp.ReceiverBase.process(ReceiverBase.java:96)
在org.smpp.util.ProcessingThread.run(ProcessingThread.java:199)
在java.lang.Thread.run(Thread.java:722)
我们无法追查这背后的确切原因?请帮助。
我们正在使用16核心机器,系统上的负载在发布时大约是30-40。我们使用命令" ss dst"找出recv-q。最近我们一直面临着recv-q大小挂起的问题,接收缓冲区在某个时间点被卡住了。但是recvQ的大小没有减少,因此我们从另一方面失去了很多命中,我们的应用程序不接受任何数据