java java中time_wait连接增加的原因是什么?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10726049/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What is the reason for time_wait connection increasing in java?
提问by kannanrbk
class LogWriter implements Runnable {
Socket client;
private static ThreadLocal<Date> date = new ThreadLocal<Date>() {
@Override
protected Date initialValue() {
return new Date();
};
};
private static ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy_MM_dd");
};
};
public LogWriter(Socket client) {
this.client = client;
}
public void run() {
try {
write(this.client.getInputStream(), new File(
CentralizedLogging.logsDir + File.separator
+ client.getInetAddress().getHostName() + "_"
+ getFormattedDate() + ".log"));
this.client.close();
} catch (Exception e) {
try {
e.printStackTrace();
write(new ByteArrayInputStream(e.getMessage().getBytes()),
new File(CentralizedLogging.logsDir + File.separator
+ "centralLoggingError.log"));
} catch (IOException io) {
}
}
}
public synchronized void write(InputStream in, File file)
throws IOException {
RandomAccessFile writer = new RandomAccessFile(file, "rw");
writer.seek(file.length()); // append the file content into existing if it not exist creating a new one.
writer.write(read(in));
writer.close();
}
public static byte[] read(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int read = -1;
byte[] buffer = new byte[1024];
read = in.read(buffer);
do {
out.write(buffer, 0, read);
} while((read = in.read(buffer)) > -1);
return out.toByteArray();
}
Main Method
主要方法
public static void main(String[] args) throws InterruptedException,
IOException {
// CentralizedLogging centralLogServer = new CentralizedLogging(args[0],Integer.parseInt(args[1]));
// new Thread(centralLogServer).start();
long start = System.currentTimeMillis() + 1000 * 20 * 60;
while(start >= System.currentTimeMillis()) {
Socket client = new Socket("bharathi-1397", 10000);
OutputStream os = client.getOutputStream();
DataOutputStream outToServer = new DataOutputStream(os);
outToServer
.write("Centralized Logging is working......".getBytes());
client.close();
}
}
I am properly closed connection . But time_wait connections is increasing . I have take a snap shot from my terminal i am posted one portion of it . Is am missing any thing ?
我正确关闭连接。但是 time_wait 连接正在增加。我从我的终端拍了一张快照,我张贴了其中的一部分。我错过了什么吗?
tcp6 0 0 127.0.0.1:46146 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:57645 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:47961 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:56716 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:49469 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:54078 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:51626 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:50143 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:59214 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:54192 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:53436 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:54547 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:55032 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:51273 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:48381 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:47532 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:56811 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:55293 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:56664 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:49242 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:51225 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:59265 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:59378 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:47997 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:47955 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:59453 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:48092 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:52462 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:59579 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:54921 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:55675 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:51140 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:57321 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:51656 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:54740 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:53600 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:59862 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:54766 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:59062 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:55702 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:50942 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:53732 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:52757 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:56430 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:49179 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:48689 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:53313 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:51161 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:57033 127.0.0.1:10000 TIME_WAIT -
tcp6 0 0 127.0.0.1:58607 127.0.0.1:10000 TIME_WAIT -
It causes any problem to my server ?. What is the reason for this ? .
它会导致我的服务器出现任何问题吗?这是什么原因?.
采纳答案by Gray
I am properly closing connection but time_wait connections is increasing. Am I missing anything?
我正在正确关闭连接,但 time_wait 连接正在增加。我错过了什么吗?
The TIME_WAIT
is used by the kernel to make sure that your TCP stream does not re-use a port that may still have packets being sent to it from the remote side. The TIME_WAIT
time is generally set to double the packets maximum age based on network settings.
该TIME_WAIT
所使用的内核,以确保您的TCP流不重复使用的端口可能仍然有包被发送到它从远程侧。该TIME_WAIT
时间通常设置为基于网络设置的数据包最长期限的两倍。
If you are getting a number of new connections, then you will see the number of ports in TIME_WAIT
increase but at some point it should stabilize unless the connection rate is also increasing. One thing to do is to grep for all of the TIME_WAIT
lines, sort them and see if the port numbers are changing. If new ports are being added and old ones falling off then all is fine.
如果您获得了许多新连接,那么您会看到端口数量TIME_WAIT
增加,但在某个时候它应该会稳定下来,除非连接速率也在增加。要做的一件事是对所有TIME_WAIT
行进行 grep ,对它们进行排序并查看端口号是否发生变化。如果添加新端口而旧端口脱落,则一切正常。
One thing to try is to make sure that your client is initiating the close()
call. That would leave the TIME_WAIT
on the client and noton the server. See this excellent page about TCP
and the implications of TIME_WAIT
on the server.
要尝试的一件事是确保您的客户正在发起close()
呼叫。这将留TIME_WAIT
在客户端而不是服务器上。请参阅这个关于服务器的优秀页面TCP
及其含义TIME_WAIT
。
Since it seems like your server is sending a file to the client (if I'm reading your code correctly), you should consider changing your protocol to something like the following. That would cause the client to close first so most of the TIME_WAIT
s will be on each of the clients.
由于您的服务器似乎正在向客户端发送文件(如果我正确阅读了您的代码),您应该考虑将您的协议更改为如下所示的内容。这将导致客户端首先关闭,因此大部分TIME_WAIT
s 将在每个客户端上。
- server sends the length of the file first
- server sends the file
- client reads the length
- client reads the file bytes
- client sends "got it"
- client closes
- server reads the client's "got it" message
- server closes
- 服务器首先发送文件的长度
- 服务器发送文件
- 客户端读取长度
- 客户端读取文件字节
- 客户发送“得到它”
- 客户关闭
- 服务器读取客户端的“收到”消息
- 服务器关闭
Did you see the bit about having the client make the close()
first @kannan? ?If the server is sending a file then I would have it send the file and then wait for the client to send a "got it" message. ?The client can then read the file, read an EOF marker, send the "got it" and then close immediately.
你有没有看到让客户制作第close()
一个@kannan??如果服务器正在发送文件,那么我会让它发送文件,然后等待客户端发送“收到”消息。?客户端然后可以读取文件,读取 EOF 标记,发送“得到它”,然后立即关闭。
Also, as an aside, you should be using try ... finally
patterns in your code. Something like:
另外,顺便说一句,您应该try ... finally
在代码中使用模式。就像是:
public void run() {
try {
write(this.client.getInputStream(), new File(
CentralizedLogging.logsDir + File.separator
+ client.getInetAddress().getHostName() + "_"
+ getFormattedDate() + ".log"));
} catch (Exception e) {
try {
e.printStackTrace();
write(new ByteArrayInputStream(e.getMessage().getBytes()),
new File(CentralizedLogging.logsDir + File.separator
+ "centralLoggingError.log"));
} catch (IOException io) {
}
} finally {
// always close in the finally
this.client.close();
}
}