套接字写入与磁盘写入的性能

时间:2018-07-30 17:01:04

标签: java performance sockets logging

我的Java应用程序将大量信息记录到磁盘上的日志文件中。这些记录的信息中的某些信息比其余信息更为重要。除了在极少数情况下,需要用不太重要的信息来向最终用户解释为什么生产中的代码会做出特定的决定。

我想知道将不太重要的信息记录到套接字而不是磁盘上的文件是否是一个好主意。套接字写比磁盘写快得多吗?

更新:基本上,我想登录到同一子网甚至同一台计算机中的套接字,假设它比写入磁盘要快。然后,将在方便时从该套接字读取另一个进程(不是我的应用程序的一部分)。我以为这是从套接字拉出的logstash。使用另一个线程将日志异步记录到磁盘是另一种选择,但是我想首先考虑使用socket选项,如果这是一种简单的解决方案,并且对性能的影响最小。

2 个答案:

答案 0 :(得分:2)

套接字不是目的地。这是一种交通工具。因此,应将您的“将数据发送到套接字”问题改为“将数据发送到网络”,“将数据发送到磁盘”或“将数据发送到另一个进程”。

在所有这些情况下,套接字本身不太可能成为瓶颈。瓶颈将是网络,磁盘或应用程序的CPU使用率-取决于您实际从套接字发送数据的位置。在OS级别上,套接字通常以零复制机制实现,这意味着数据只是作为指针传递到另一端,因此非常高效。

答案 1 :(得分:1)

您别无选择:

如果您正在快速写某处,并从那里以较慢的方式转发(通过网络将logstash登录到某些Elastic实例),缓冲在哪里发生?如果长时间长时间以高速率进行日志记录,则这种设置将产生越来越多的待交付邮件积压。


在上述情况下,缓冲将分别发生:

  • 直接同步写入磁盘:磁盘上的最终日志文件是缓冲区
  • 异步日志记录框架:缓冲区可能会吞噬您的堆或进程内存(在堆外部或某些内核区域,因此在 RAM 中)
  • unix域套接字:缓冲在内核空间中,因此再次 RAM

在最后两个选项中,在持续高音量的情况下,事情将变得越来越吱吱作响。

测试和配置文件... 或者只是登录到本地磁盘并旋转文件,删除旧文件。