嵌入式(路由器)Linux 上 CPU 密集程度最低的串行日志记录

嵌入式(路由器)Linux 上 CPU 密集程度最低的串行日志记录

我正在尝试将串行设备的数据记录到 OpenWrt 路由器上。

数据全部基于 ASCII,波特率为 115200,8N1,但只连接了传输、接收和接地(无流量控制)。该设备每秒发送 50 行文本,每行 76 个字符(加上 CR+LF,则为 50x78 = 3900 字符/秒,考虑到每个字符有 1 个起始位(?)、8 个数据位和 1 个停止位,这似乎需要每个字符 10 位,因此可用的 115200 中 39,000 位/秒——应该不会达到最大值吧?)

问题是,在我保存到 NVRAM 中时,数据被丢失、行被截断、合并等。如果我运行此程序headcut在 30000 行之后停止它(这应该需要 10 分钟),但由于丢失/截断/合并的行,需要 11 或 12 分钟才能达到该行数。例如,以下内容应该在每一行上显示完全相同数量的字段,但显示了 3 个损坏行的示例:

$label,014704260,000000000,000000000,000000000,000000000,000000000,453266711                                                                                                                                        
$label,014704280,000000000,000000000,000000000,000000000,000000000,498035313                                                                                                                                        
$label,014704300,000000000,000000000,000000000,000000000,000000000,564242105                                                                                                                                        
$label,014704320,190418.30,000000000,000000000,000000000,000000000,458805062                                                                                                                                        
$label,014704340,000000000,000000000,000000000,000000000,000000000,447439419                                                                                                                                        
$label,014704360,000000000,000000000,000000000,000000000,000000000,515812674                                                                                                                                        
$label,014704380,000000$label,014704500,000000000,000000000,000000000,000000000,000000000,430368215                                                                                                                 
$label,014704520,190418.50,000000000,000000000,000000000,000000000,474793672                                                                                                                                        
$label,014704540,000000000,000000000,000000000,000000000,000000000,514101937                                                                                                                                        
$label,014704560,000000000,000000000,000000000,000000000,000000000,498089337                                                                                                                                        
$label,014704580,000000000,000000000,000000000,000000000,000000000,479420800                                                                                                                                        
$label,014704600,000000000,000000000,000000000,000000000,000000000,568108911                                                                                                                                        
$label,014704620,000000000,000000000,00000000000,497468975                                                                                                                                                          
$label,014704640,190418.60,000000000,000000000,000000000,000000000,509747997                                                                                                                                        
$label,014704660,000000000,000000000,000000000,000000000,000000000,441899024                                                                                                                                        
$label,014704680,000000000,000000000,000000000,000000000,000000000,543482880                                                                                                                                        
$label,014704700,000000000,000000000,000000000,000000000,000000000,445069837                                                                                                                                        
$label,014704720,190418.70,000000000,000000000,000000000,000000000,517975535                                                                                                                                        
$label,014704740,000000000,000000000,000000000,000000000,000000000,477103089                                                                                                                                        
$label,014704760,000000000,000000,000000000,483954418                                                                                                                                                               
$label,014704860,000000000,000000000,000000000,000000000,000000000,484600994                                                                                                                                        
$label,014704880,000000000,000000000,000000000,000000000,000000000,489675319

另外,字段 2 是一个毫秒计数器,每行增加 20,字段 3(每 5 行)出现时为 hhmmss.ss。这表明在行被截断/合并的同时,还有 3-5 行(0.1 秒)丢失。

显然存在某些瓶颈,落后,不同步,缓冲区溢出等。

我甚至可以满足于丢弃 80% 或 98% 的数据(每 5 条数据只保留 1 行,或每 50 条数据保留 1 行,只要数据一致),但我找不到足够低级的方法来丢弃它们,而不会遇到同样的问题。我尝试过类似 的方法awk 'NR % 5 == 0' /dev/ttyUSB0,有或没有将其通过管道传输到 fifo,然后只从那里记录到 NVRAM 等。还尝试了nice -n -19和的各种组合ionice -c 1 -n 0,这应该是我的第一个(awk)命令的“实时”类,该命令从 ttyUSB0 读取,然后我在过滤后的(较小的)数据流上使用较低的优先级。

有没有一种低级方式或 CPU 密集程度较低的方法来记录这些数据或删除行,比如在 stty 处理程序中或其他地方?在 tty 上设置更大的缓冲区?或者我在这里最好的方法是保留所有数据或可预测地删除一些数据,而不会出现这种随机丢失/合并行的问题?

答案1

问题的前提是 CPU 是瓶颈,这是错误的。

当我在设置中添加和移除 USB 集线器时,问题不断出现和消失。它是 Dodoro 品牌的,但我手边的另一个集线器 Qicent 品牌的也出现了同样的问题,两者都有 3xUSB3 端口和千兆以太网,或者来自lsusb

Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 002: ID 2109:2813 VIA Labs, Inc.

所以可能与其他中心问题类似,例如枢纽成为瓶颈,其中使用多 TT 集线器似乎是解决方案。但是,在我的例子中,问题只发生在总共 2 个设备上,即集线器和 FTDI USB-to-RS232 适配器,因此需要多 TT 集线器才能与一个设备通信似乎很奇怪。除非与上游(路由器的)USB 控制器通信算作另一个设备。

相关内容