9

Atmel AT91SAM9260EK ボード上で実行されている組み込み Linux システムがあり、リアルタイム優先度で実行されている 2 つのプロセスがあります。マネージャー プロセスは、POSIX メッセージ キューを使用して定期的にワーカー プロセスに "ping" を実行し、ワーカー プロセスの正常性をチェックします。通常、往復の ping には約 1 ミリ秒かかりますが、非常にまれにそ​​れよりも長く (約 800 ミリ秒) かかります。より高い優先度で実行される他のプロセスはありません。

ストールはロギング (syslog) に関連している可能性があります。ロギングを停止すると、問題は解決するようです。ただし、ログ ファイルが JFFS2 にあるか NFS にあるかは違いはありません。他のプロセスは「ディスク」に書き込みません-syslogだけです。

これらのストールが発生している理由を追跡するのに役立つツールは何ですか? 私は latencytop を認識しており、それを使用します。他に便利なツールはありますか?

いくつかの詳細:

  • カーネル バージョン: 2.6.32.8
  • libc (syslog 関数): uClibc 0.9.30.1
  • syslog: ビジーボックス 1.15.2
  • スワップスペースが構成されていません[編集で追加]
  • ルートファイルシステムはtmpfs上にあります(initramfsからロードされます)[編集で追加]
4

1 に答える 1

2

問題は(あなたが言ったように)syslogdです。プロセスが RT 優先度で実行されている間、syslogd はそうではありません。さらに、syslogd はそのヒープをロックせず、特に「顧客」が非常に少ない場合に、カーネルによってページ アウトされる可能性があります (そしてページ アウトされます)。

あなたが試すことができるのは:

  • 別のスレッドを開始してプライオリティ キューを管理し、そのスレッドが syslog と通信するようにします。ロギングは、ロックを取得してリストに何かを挿入するだけです。サブスクライバーが 2 つしかない場合、ミューテックスの取得に多くの時間を費やすべきではありません。

  • syslog を使用せず、独自のロギングを実装します (基本的には最初の提案から、syslog との通信を除いたもの)。

同様の問題があり、それを修正するための最初の試みは、syslogd 自体を変更してヒープをロックすることでした。それは惨事でした。次に、rsyslogd を試してみました。これにより、いくつかは改善されましたが、それでもランダムなレイテンシーのピークが発生しました。より重要なメッセージが実際に最初に書き込まれるようにするために、プライオリティ キューを使用して独自のロギングを実装することになりました。

スワップを (まったく) 使用していない場合、これを修正するための最短の方法は、おそらく独自のログ記録を実装することです。

于 2010-04-26T07:38:46.613 に答える