【发布时间】:2019-01-06 23:59:05
【问题描述】:
我的 java 应用程序将大量信息记录到磁盘上的日志文件中。其中一些记录的信息比其他信息更重要;除了在极少数情况下,需要不太重要的信息来向最终用户解释为什么生产中的代码会做出某个决定。
我想知道将不太重要的信息记录到套接字而不是磁盘上的文件是否是个好主意。套接字写入是否比磁盘写入快得多?
更新:基本上,我想登录到同一子网甚至同一台机器中的套接字,假设它比写入磁盘更快。然后,另一个进程(不是我的应用程序的一部分)将在方便时从该套接字读取。我在想这将是从套接字拉出的logstash。使用另一个线程异步记录到磁盘是另一种选择,但我想首先考虑套接字选项,如果这是一个简单的解决方案,并且对性能的影响最小。
【问题讨论】:
-
这个套接字将被打开到哪里?套接字是 I/O,磁盘是 I/O。我猜两者可能都非常慢。或许最好将您的日志记录放到一个低优先级线程中,这样如果日志记录导致性能问题就不会影响您的运行时间?
-
如果磁盘写入是完全 RAM 缓存的 Optane SSD,并且套接字是通过四颗卫星反弹到南极前哨的拨号连接,则磁盘写入速度会更快。如果磁盘写入到同步安装的软盘,并且套接字是通过环回设备并且其消费者只是对 RAM 进行零拷贝传输,那么套接字会更快。
-
最重要的问题是,您是否注意到性能下降?
-
磁盘通常更快:serverfault.com/questions/238417/… 现代日志框架本质上是异步的,因此日志语句的成本非常低。升级您的日志记录:logging.apache.org/log4j/2.x/manual/async.html
-
如果您担心性能问题,您首先要检查的是您是否正在缓冲写入磁盘(例如使用
BufferedOutputStream或BufferedWriter)。
标签: java performance sockets logging