negusare
2016年4月19日 17時37分
お世話になります。
Armadillo-810を使用して、SDカードへのリアルタイムなデータ書き込みについて実験しております。
通常アプリケーションからSDカードへデータの書き込みを指示した場合、カーネルによりキャッシュされ、書き込むのに十分な容量となったタイミングでSDカードへ書き込まれると思います。この場合、SDカードへ書き込まれるタイミングが分からず、しかも書き込んでいる最中はCPUがそのプロセスに取られてしまい、アプリケーションの方が止まってしまいます。
実際に試してみると、1msec間隔で1kbyteのデータ書き込みを実行すると、30Mbyte程度溜まった段階で大量の書き込み処理が発生しています(およそ2.5秒間)。
現在のアプリケーションはそれでは困りますので、全体としての速度が遅くなっても構わないので、毎回SDカードと同期するようにしました。
すると、1kbyteのデータ書き込みにおよそ6msecかかり、iostatコマンドにより実際に書き込み処理が発生していることが確認できました。しかし、この書き込みを続けていきますと、ときどき450msec程度、別の処理に時間が取られてしまうことがわかりました。
この450msecの処理は何でしょうか?
可能なら原因を突き止め、等時間間隔でデータのリアルタイムな書き込みを実現したいと考えております。
以上、よろしくお願いいたします。
コメント
negusare
早速のご回答、ありがとうございます。
>■ 1. 他プロセス・割り込み要因を排除する
こちらは試してみましたが、変化ありませんでした。
>■ 2. SDのコマンド実行で待たされていないか確認
/var/log/messagesを取得しました。
41.10156秒
41.58594秒
43.33594秒
あたりで、450msec程度のロスが見られます。
やっていることとしましては、ファイルをO_DIRECT|O_SYNCオプションを付けてopenし、1536kbyteのデータをループでひたすら書き込んでいます。
ファイル | ファイルの説明 |
---|---|
log.txt |
at_yuma.arakawa
2016年4月19日 19時22分
> この450msecの処理は何でしょうか?
現段階で断定することはできませんので、
以下を試してみてください。
■ 1. 他プロセス・割り込み要因を排除する
他プロセスや割り込みで、SDへ書き込みを行うプロセスの実行が
中断されているのかも知れません。
これらの要因を排除するために、
以下を行った後、再度、SDカードへの書き込み実験を行ってみてください。
1. 不要なプロセス・デバイスドライバを止める
2. 計測を行うプロセスのスケジューリングポリシーをリアルタイムポリシー
(SCHED_FIFO、あるいはSCHED_RR)へ変更する
なお、スケジューリングポリシーはchrtコマンド、あるいはsched_setscheduler()関数で
変更可能です。
それぞれの使用方法は、man 1 chrt、man 2 sched_setschedulerを参照してください。
■ 2. SDのコマンド実行で待たされていないか確認
他プロセス・割り込み要因を排除した後も、ご報告の現象が再現するのであれば、
SDのコマンド実行を待たされているのかも知れません。
SDコマンドのデバッグログを確認するために、以下を行っていただけますか。
1. SDコマンドの実行ログを出力するために
drivers/mmc/core/core.c の1行目に以下を追加し、カーネルをビルド
2. デバッグログに時間を付加するために、
ブートローダー(Hermit)にて、setenvに"printk.time=1"を追加
3. SDカードへの書き込み実験を行う
実験後の /var/log/messages をフォーラムへ添付してください。