組み込み(ルーター)LinuxでのCPU集約型の最小シリアルロギング


1

シリアルデバイスからOpenWrtルーターにデータを記録しようとしています。

データはすべてASCIIベース、115200ボー、8N1ですが、送信、受信、およびグランドのみが接続されています(フロー制御なし)。デバイスは、1行あたり76文字のテキストを1秒あたり50行送信します(さらにCR + LFは50x78 = 3900文字/秒になり、1文字あたり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は1行あたり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から、フィルター処理された(より小さい)データストリームの優先順位を下げます。

このデータをログに記録する、または行をドロップする、たとえばsttyハンドラー内または他の場所で、低レベルの方法またはCPUをあまり使用しない方法はありますか?ttyにより大きなバッファを設定しますか?または、このランダムな失われた/マージされたラインの問題なしに、すべてのデータを保持するか、予測可能にいくつかをドロップするためのここでの私の最善のアプローチは何ですか?


最初に、すべてのテキストが正しく受信されていることを確認してください。/proc/tty/driver/シリアルポートの統計情報(たとえば、受信バイトカウントのスナップショットは1秒あたり3900文字に近いですか?)およびオーバーランバイトカウントのファイルを見てください。コードを投稿する場合は、stackoverflow.comで質問してください
おがくず

回答:


0

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ハブを取得することが解決策のようです。ただし、私の場合、ハブとFTDI USB-to-RS232アダプターの合計2つのデバイスで問題が発生するため、1つのデバイスとのみ通信するにはマルチTTハブが必要になるのは奇妙に思えます。アップストリーム(ルーター)USBコントローラーと通信しない限り、別のデバイスとしてカウントされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.