【发布时间】:2020-05-01 14:01:58
【问题描述】:
我有一个由一些数据包统计信息组成的字符串,例如数据包长度等。
我想将其存储到 csv 文件中,但如果我使用标准 fprintf 写入文件,它的写入速度非常慢,最终会丢失信息。
如何尽快将信息写入文件,以尽量减少数据包中的信息丢失。理想情况下,我希望每秒支持数百万个数据包,这意味着我需要每秒写入数百万行。
如果这很重要,我正在使用 XDP 获取数据包信息并通过 eBPF 映射将其发送到用户空间。
【问题讨论】:
-
你能把更大的块写入文件吗?而不是写一个单一的值写 100s 或 1000s?也许使用双缓冲区:将新值写入一个缓冲区,同时将另一个缓冲区的内容写入文件。
-
你是否在两次连续写入之间关闭流?
-
"...每秒数百万个数据包..." 没有告诉我们任何信息,因为这些是未公开长度的字符串。这些字符串有多长?还有什么是突发长度 - 这些数据是无限期地流过还是可以在“安静”期间被缓冲和提交。
-
(你知道没有你的代码很难提供帮助吗?)
-
fprintf不是你的瓶颈。文件 I/O 可能是。如果您正在向其写入日志的设备无法跟上传入的数据包,那么任何软件修复都无济于事。也许您想要登录到 SSD,甚至创建一个 ram 磁盘?
标签: c io packet hard-drive xdp-bpf