java - 套接字写入与磁盘写入的性能
问题描述
我的 java 应用程序将大量信息记录到磁盘上的日志文件中。其中一些记录的信息比其他信息更重要;除了在极少数情况下,需要不太重要的信息来向最终用户解释为什么生产中的代码会做出某个决定。
我想知道将不太重要的信息记录到套接字而不是磁盘上的文件是否是个好主意。套接字写入是否比磁盘写入快得多?
更新:基本上,我想登录到同一子网甚至同一台机器中的套接字,假设它比写入磁盘更快。然后,另一个进程(不是我的应用程序的一部分)将在方便时从该套接字读取。我在想这将是从套接字拉出的logstash。使用另一个线程异步记录到磁盘是另一种选择,但我想首先考虑套接字选项,如果这是一个对性能影响最小的简单解决方案。
解决方案
你有几个选择:
- 本地存储通常比网络快
- 您可以使用异步日志记录到磁盘,因此您的进程会触发并忘记(这很快!)
- 如果您在*nix上, logstash可以从Unix Domain Sockets读取;这些通常比 I/O 快
如果您正在快速写入某个地方,并且从那里以较慢的方式转发(logstash 通过网络记录到某个 Elastic 实例),缓冲发生在哪里?如果日志记录长时间以高速率发生,这样的设置将产生越来越多的尚未发送的消息积压。
在上述情况下,缓冲将(分别)发生:
- 直接同步写入磁盘:磁盘上的最终日志文件是缓冲区
- 异步日志框架:缓冲区可能会占用您的堆或进程内存(当在堆之外,或在某些内核区域中,因此在RAM中)
- unix 域套接字:在内核空间中缓冲,因此再次使用RAM
在最后两个选项中,在恒定的高容量情况下,事情会变得越来越摇摆不定。
测试和配置文件......或者只是登录到本地磁盘并旋转文件,删除旧文件。
推荐阅读
- python-3.x - 计算熊猫数据框中一列值的频率,并用其频率出现数标记每一行
- python - 如何在不删除其他工作表的情况下向 Excel 文件添加多个工作表以及如何在第 65563 行之后的第二个工作表中写入最终文件
- javascript - 不应该有的正则表达式匹配
- twilio - 找不到电话号码
- php - 如何将简短的 PHP 代码添加到我的 PHP 文件中
- ruby-on-rails - 通过跨多个模型的关系定义 has_many
- swift - 如何展平 AnyPublisher
>? - javascript - 正则表达式使用 JavaScript 从 SQL 查询字符串中删除注释
- spring-boot - 自定义 yaml 属性在服务类中不可用
- python - 将子字符串的第一个实例与正则表达式匹配