当前位置: 首页 > 面试题库 >

Java套接字性能瓶颈:在哪里?

赵奕
2023-03-14
问题内容

我最近开始开发大量使用网络的应用程序。第一次尝试使用RMI,由于几个原因,我们切换到纯套接字。但是,在通过网络甚至在本地主机上测试套接字时,我们的速率下降为每秒25个请求。使用RMI时要高两个数量级。

经过更多测试,我们获得了以下内容(对于localhost):

  • 发送始终相同的对象:31628请求/秒
  • 总是发送新对象:25个请求/秒
  • 仅对象创建速率:每秒3-4百万(因此这不是瓶颈)

这是客户端代码:(服务器端只是回复“ ACK”)

public static void main(String[] args) throws IOException, ClassNotFoundException
{
    Socket kkSocket = null;
    ObjectOutputStream out = null;
    ObjectInputStream in = null;


    kkSocket = new Socket("barium", 4444);
    out = new ObjectOutputStream(kkSocket.getOutputStream());
    in = new ObjectInputStream(kkSocket.getInputStream());


    long throughput;
    long millis;

    TcpRequest hello = null;


    throughput = 0;
    millis = System.currentTimeMillis();
    while (System.currentTimeMillis() < millis + 1000)
    {
        hello = new TcpRequest();
        hello.service = "hello";
        hello.payload = Math.random();
        throughput++;
    }

    System.out.println("-------------------------------------------------------");
    System.out.println("|        Objects created: " + (throughput)  + " requests/sec.");
    System.out.println("-------------------------------------------------------");


    throughput = 0;
    millis = System.currentTimeMillis();
    while (System.currentTimeMillis() < millis + 1000)
    {
        out.writeObject(hello);
        Object res = in.readObject();
        throughput++;
    }
    System.out.println("-------------------------------------------------------");
    System.out.println("|        Same object throughput: " + (throughput)  + " requests/sec.");
    System.out.println("-------------------------------------------------------");


    throughput = 0;
    millis = System.currentTimeMillis();
    while (System.currentTimeMillis() < millis + 1000)
    {
        hello = new TcpRequest();
        out.writeObject(hello);
        Object res = in.readObject();
        throughput++;
    }
    System.out.println("-------------------------------------------------------");
    System.out.println("|        New objetcs throughput: " + (throughput)  + " requests/sec.");
    System.out.println("-------------------------------------------------------");


    out.close();
    in.close();

    kkSocket.close();
}

TcpRequest类只是一个没有任何特殊要求的伪类。

因此,如果创建对象的速度很快,如果通过网络发送它的速度很快…为什么地球上通过网络发送新对象的速度如此之慢?

而且,如果您保留相同的对象并在发送之前修改其内容,则传输速率也将很高…但是会陷入讨厌的陷阱:

使用对象序列化时,请务必记住ObjectOutputStream维护一个哈希表,该哈希表将写入流中的对象映射到句柄。第一次将对象写入流时,其内容将被复制到流中。但是,随后的写入会导致将对象写入流中。

…这发生在我们身上,并导致了数小时的调试,然后才弄清楚。

因此,基本上…如何通过套接字实现高吞吐量?(…我的意思是,由于RMI是它的包装,我们已经高了两个数量级!)

解决了:

通过替换:

out = new ObjectOutputStream(kkSocket.getOutputStream());

带有:

out = new ObjectOutputStream(new BufferedOutputStream(kkSocket.getOutputStream()))

性能再次恢复正常(与相同对象情况下的吞吐量几乎相同)


问题答案:

找到了:

代替:

out = new ObjectOutputStream(kkSocket.getOutputStream());

您应该使用:

out = new ObjectOutputStream(new BufferedOutputStream(kkSocket.getOutputStream()));

out.flush();

发送消息时。

…产生了巨大的差异…尽管我不知道为什么。



 类似资料:
  • 本文向大家介绍MATLAB使用Profiler识别性能瓶颈,包括了MATLAB使用Profiler识别性能瓶颈的使用技巧和注意事项,需要的朋友参考一下 示例 MATLAB Profiler是用于对MATLAB代码进行软件配置的工具。使用探查器,可以获得执行时间和内存消耗的直观表示。 运行Profiler可以通过两种方式完成: .m在编辑器中打开一些文件(在R2012b中添加)时,单击MATLAB

  • 本文向大家介绍简述HBase的瓶颈相关面试题,主要包含被问及简述HBase的瓶颈时的应答技巧和注意事项,需要的朋友参考一下 解答: HBase的瓶颈就是硬盘传输速度。HBase的操作,它可以往数据里面insert,也可以update一些数据,但update的实际上也是insert,只是插入一个新的时间戳的一行。Delete数据,也是insert,只是insert一行带有delete标记的一行。Hb

  • 我使用AppD作为应用程序的APM,在缓慢的事务报告中,它显示了大多数调用,这不是我们的应用程序代码,我们调用开放源码库方法。例如: 我想强调的是,我已经检查过了,我的服务器没有加载,CPU和内存的使用率都很低,这段时间用于非常少量的数据处理。 让我知道这背后的原因,以及如何优化我的应用程序的性能。

  • 我正在开发web套接字应用程序。从前端来看,每个应用程序都有一个插座。但我不确定后端。我们将Python和nginx与Flask socketIO和socket io客户端库一起使用。此体系结构将用于通知前端发生了更改,并应更新数据。 以下是我的疑问-服务器上将创建多少套接字和线程?不同连接之间是否可以共享套接字?是否有任何工具可以分析插座是否打开?

  • 目前有一个阿里云的轻量服务器,使用了 nginx 提供了一些静态文件服务,可能会因为用户的使用量的增加导致性能问题,这个过程如何监测服务器性能,并且尽早知道已经达到服务瓶颈?

  • 我已经使用spring boot、webflux和r2dbc建立了一个示例项目。我已经能够将行从postgres db表流式传输到客户端。 此服务器实现上是否存在内存瓶颈(用于存储查询结果)?行是否通过? PS我并不是在这方面宣称任何级别的质量,我知道分页等都是必不可少的,只是想知道db查询如何与反应式框架交互。