我正在编写一个非常基本的 TCP 服务器。服务器跟踪它从客户端接收到的状态。我记录了消息格式并发布了源代码。在 2009 MacBookPro(2.26 GHz Core 2 Duo,4 GB RAM)上,吞吐量非常低 - 如果服务器和客户端在同一台机器上运行,则为 1 MB/s。我正在寻找显着提高吞吐量的方法。
服务器和客户端的主循环都相当简单。与服务器建立连接后,客户端创建 UpdateOneMessage 实例,并将它们的 byte[] 表示发送到服务器。从Client.run():
for (int i = 0; i < maxMessageCount; i++) {
send(new UpdateOneMessage(1 + i, id, "updatedState"));
// .. read response
}
Client.send()将消息序列化并写入 DataOutputStream。
private int send(final Message message) throws Exception {
final byte[] bytes = message.serialize();
out.write(bytes);
out.flush();
return bytes.length;
}
使用JVM Monitor分析客户端和服务器,显示 CPU 时间主要由从InputStreamReader读取和向DataOutputStream写入。但是以 1 MB/s 的速度,这个应用程序甚至还没有接近IO-bound。
- 考虑到每条消息都相当小(平均 55 字节),我可以从我的应用程序中获得哪些吞吐量?
- 我还能做些什么来找到这个简单应用程序中的瓶颈?