Rea*_*cen 9 java sockets multithreading profiling tcp
我有一个JAVA游戏服务器,每个TCP连接使用1个线程.(我知道这很糟糕,但我现在必须保持这种方式).在(3.2Ghz 6cor x2机器,24GB RAM,Windows Server 2003 64位)和这里是一段代码:
public void run()
{
try
{
String packet = "";
char charCur[] = new char[1];
while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)
{
if (charCur[0] != '\u0000' && charCur[0] != '\n' && charCur[0] != '\r')
{
packet += charCur[0];
}else if(!packet.isEmpty())
{
parsePlayerPacket(packet);
packet = "";
}
}
}catch(Exception e)
{
e.printStackTrace();
}
finally
{
try{
kickPlayer();
}catch(Exception e){e.printStackTrace();};
Server.removeIp(_ip);
}
}
Run Code Online (Sandbox Code Playgroud)
服务器upTime大约12个小时或更长时间(连接大约3.000个播放器)后,服务器开始永久占用所有12个CPU中的100%,直到我手动重启JAVA应用程序.所以游戏开始落后于糟糕,我的球员开始抱怨.
我试过分析应用程序,这是我想出的:
所以我猜这个问题来自这里:
while(_in.read(charCur, 0, 1)!=-1 && Server.isRunning)
Run Code Online (Sandbox Code Playgroud)
知道变量"_in"是套接字输入的读者:(_in = new BufferedReader(new InputStreamReader(_socket.getInputStream()))).
为什么地球上_in.read()在长时间服务器upTime之后占用了这么多CPU?
我试过放一个Thread.sleep(1); 而且在While循环中更多,但没有做任何事情,我想问题是在BufferedReader.read()方法内部.
有谁知道这会导致什么?以及如何解决它?
我不知道为什么调用很慢,但我永远不会在紧密循环中一次读取一个字节。谁知道内部函数有什么样的开销。
我将读取流中当前可用的所有数据并对其进行解析。这将需要一个缓冲区和一些额外的簿记,但无论如何比从流中逐字节读取要快。
归档时间: |
|
查看次数: |
2638 次 |
最近记录: |